Docker 完全指南

Docker 最初 dotCloud 公司內部的一個業余項目
Docker 基于 Go 語言
Docker 項目的目標是實現輕量級的操作系統虛擬化解決方案
Docker 的基礎是 Linux 容器(LXC)等技術
Docker 容器的啟動可以在秒級實現,這相比傳統的虛擬機方式要快得多
Docker 對系統資源的利用率很高,一臺主機上可以同時運行數千個 Docker 容器
下面的圖片比較了 Docker 和傳統虛擬化方式的不同之處,可見容器是在操作系統層面上實現虛擬化,直接復用本地主機的操作系統,而傳統方式則是在硬件層面實現。

容器除了運行其中應用外,基本不消耗額外的系統資源,使得應用的性能很高,同時系統的開銷盡量小。傳統虛擬機方式運行 10 個不同的應用就要起 10 個虛擬機,而Docker 只需要啟動 10 個隔離的應用即可。

主要優勢為:

更快速的交付和部署 - 容器成為了最小單位
更高效的虛擬化 - 內核級虛擬化
更輕松的遷移和拓展
更簡單的管理
1 安裝

官方網站提供了 Mac, Linux 和 Windows 版本的安裝教程。我們只要跟著官方文檔即可,這里不再贅述。

不過需要提一下 Kitematic 這個圖形化工具(官方給出的定義是 Visual Docker Container Management on Mac & Windows),對于熟悉和了解 Docker 是很好的幫助,大家可以體驗一下。

守護進程

運行 Docker 守護進程時,可以用 -H 來改變綁定接口的方式,比如

sudo /usr/bin/docker -d -H tcp://0.0.0.0:2375,

如果不想每次都輸入這么長的命令,需要加入以下環境變量

export DOCKER_HOST="tcp://0.0.0.0:2375"

圖形用戶界面

雖然我們可以用命令來控制 docker,但是如果能有一個 web 管理界面,操作什么的會方便很多,比較常見的有

Shipyard
Potainer
2 基本概念

基本概念主要有三個:

鏡像(Image)
一個只讀的模板,鏡像可以用來創建 Docker 容器
用戶基于鏡像來運行自己的容器。鏡像是基于 Union 文件系統的層式結構
可以簡單創建或更新現有鏡像,或者直接下載使用其他人的。可以理解為生成容器的『源代碼』
容器(Container)
容器是從鏡像創建的運行實例,在啟動的時候創建一層可寫層作為最上層(因為鏡像是只讀的)
可以被啟動、開始、停止、刪除。每個容器都是相互隔離的、保證安全的平臺
可以把容器看做是一個簡易版的 Linux 環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序
倉庫(Registry)
集中存放鏡像文件的場所,可以是公有的,也可以是私有的
最大的公開倉庫是 Docker Hub
國內的公開倉庫包括 Docker Pool 等
當用戶創建了自己的鏡像之后就可以使用 push 命令將它上傳到公有或者私有倉庫,這樣下次在另外一臺機器上使用這個鏡像時候,只需要從倉庫上 pull 下來就可以了
Docker 倉庫的概念跟 Git 類似,注冊服務器可以理解為 GitHub 這樣的托管服務
另外 Docker 采用的是客戶端/服務器架構,客戶端只需要向 Docker 服務器或守護進程發出請求即可完成各類操作。那么問題來了,我們能用 Docker 來做什么呢?我們可以:

統一、優化和加速本地開發和構建流程
保證不同的環境中可以得到相同的運行結果
創建隔離環境用于測試
Docker 可以提供的隔離有:

文件系統隔離:每個容器都有自己的 root 文件系統
進程隔離:每個容器都運行在自己的進程環境中
網絡隔離:容器間的虛擬網絡接口和 IP 地址都是分開的
資源隔離和分組:使用 cgroups 將 CPU 和內存之類的資源獨立分配給每個 Docker 容器
3 常用命令

查看 docker 狀態 sudo docker info
查看系統中正在運行的容器的列表 docker ps
加上 -a 可以列出所有容器
加上 -l 可以列出最后一次運行的容器
一個簡單的例子
接下來我們用一個簡單的例子來體驗下 docker

4 容器小介紹

容器是獨立運行的一個或一組應用,以及它們的運行態環境。對應的,虛擬機可以理解為模擬運行的一整套操作系統(提供了運行態環境和其他系統環境)和跑在上面的應用。

啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動,另外一個是將在終止狀態(stopped)的容器重新啟動。因為 Docker 的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創建容器(對于初級應用來說后者更方便)。

當利用 docker run 來創建容器時,Docker 在后臺運行的標準操作包括:

檢查本地是否存在指定的鏡像,不存在就從公有倉庫下載
利用鏡像創建并啟動一個容器
分配一個文件系統,并在只讀的鏡像層外面掛載一層可讀寫層
從宿主主機配置的網橋接口中橋接一個虛擬接口到容器中去
從地址池配置一個 ip 地址給容器
執行用戶指定的應用程序
執行完畢后容器被終止
可以利用 docker start 命令,直接將一個已經終止的容器啟動運行。

5 運行容器

現在,我們來創建一個 ubuntu:14.04 的容器

docker run ubuntu:14.04 /bin/echo 'Hello wdx!'

(結果如下圖所示)

可以看到正確輸出了我們的 “Hello wdx!”

接下來,我們用 docker run -t -i ubuntu:14.04 /bin/bash 可以啟動一個 bash 終端用來交互。參數的意思是:

-t 選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上
-i 則讓容器的標準輸入保持打開
我們可以輸入一些命令來測試

容器的核心為所執行的應用程序,所需要的資源都是應用程序運行所必需的。除此之外,并沒有其它的資源。我們用 ps 或 top 在偽終端中查看進程信息,可以看到只有我們運行的進程,沒有其他花里胡哨的(上圖最后一條命令)

試一試如下命令

cat /etc/hosts
ip a
ps -aux
cd ~ && echo "hello wdx" > hello.txt && cat hello.txt
(細心的同學可能會發現這里的輸出暗藏玄機)

操作完成后,輸入 exit 便可以退出這個 ubuntu 容器。退出之后這個容器依然存在,我們可以用 docker ps -l來看看:

每個容器有一個 Container ID 和 Name,我們一般就是通過這倆來定位一個容器的。

6 鏡像

我們可以使用 docker pull 命令從倉庫中獲取所需要的鏡像。比如說

sudo docker pull ubuntu:12.04,

相當于

sudo docker pull registry.hub.docker.com/ubuntu:12.04,

即從注冊服務器 registry.hub.docker.com中的 ubuntu 倉庫來下載標記為12.04 的鏡像。

如果想從其他倉庫注冊服務器下載,需要輸入完成的地址,例如:

sudo docker pull dl.dockerpool.com:5000/ubuntu:12.04

下載完成之后就可以使用該鏡像了,比如下面的語句就會創建容器,其中運行 bash:

sudo docker run -t -i ubuntu:12.04 /bin/bash

可以使用 dokcer images 來顯示本地已有的鏡像,如下

具體字段的意思一目了然,這里不再贅述。然后我們來運行官方例子 whalesay 鏡像。

7 運行鏡像

打開瀏覽器,進入 Docker Hub

搜索 whalesay 這個鏡像,就可以看到結果,點進去可以看到詳細內容(基于 Ubuntu)

然后我們來運行一下,使用命令

docker run docker/whalesay cowsay boo

其中 cowsay 是要運行的命令,后面的 boo 是參數。

Docker 會先在本地查找有沒有鏡像,如果沒有就從倉庫中下載,具體的運行結果是:

也可以讓鯨魚說不同的話,比如:

8 制作鏡像

如果想要制作自己的鏡像,需要自己寫 Dockerfile。具體步驟如下

創建一個文件夾 mkdir wdxtub; cd wdxtub,構造鏡像所需的所有東西都會放在這個文件夾中
創建一個名為 Dockerfile 的文件 gedit Dockerfile
添加第一句話 FROM docker/whalesay:latest,表示我們的鏡像以 whalesay 為基礎
添加需要運行的命令,如 RUN apt-get -y update && apt-get install -y fortunes(fortunes 這個程序會輸出名言警句)
通過 CMD 指定鏡像載入之后需要執行的命令,如 CMD /usr/games/fortune -a | cowsay
保存并關閉 Dockerfile
使用 sudo docker build -t wdx-whale . 來構造鏡像,簡單來說就是用 Dockerfile 中的內容按步驟構造
使用 docker images 應該就可以看到我們新創建的鏡像

然后我們就可以運行一下看看

docker run wdx-whale

還有更賤的(感覺可以玩一天)

如果想要把自己的鏡像上傳到網上,就需要注冊一個 Docker Hub 帳號,然后點擊 Create Repository,這里我創建了一個名為 wdxtub/demo 的公用倉庫。

接下來我們需要打上 tag,目前 docker images 的情況是:

記住我們的 IMAGE ID 26ac9649d7da。用以下命令打 tag

docker tag 26ac9649d7da wdxtub/wdx-whale:latest,

然后再 docker images 一次:

然后用這個命令登錄

docker login --username=yourhubusername --email=yourmail@company.com,

對于我來說就是

docker login --username=wdxtub --email=dacrocodilee@gmail.com

成功之后大概是這樣:

然后就可以 push 上去了 docker push wdxtub/wdx-whale,像下面這樣

為了測試 pull 自己的鏡像,我們先把本地上的 whale 鏡像刪掉:

docker rmi -f wdxtub/wdx-whale; docker rmi -f wdx-whale

(如果有其他的用不著的也都刪掉),最后剩下(上課要用的鏡像):

接著來運行一下

docker run wdxtub/wdx-whale

9 管理鏡像

我們可以把鏡像導出到本地文件,使用 docker save 命令即可,比如針對我現在有的鏡像 wdxtub/wdx-whale(id:26ac9649d7da),可以這樣:

docker save -o wdx-local-whale.tar wdxtub/wdx-whale。

如果要載入的話,使用下面的命令即可(會載入相關的元數據信息)

docker load --input wdx-local-whale.tar# 或者docker load < wdx-local-whale.tar

在刪除鏡像之前要先用 docker rm 刪掉依賴于這個鏡像的所有容器.

sudo docker rmi $(docker images -q -f "dangling=true")

鏡像的實現原理

Docker 鏡像是怎么實現增量的修改和維護的? 每個鏡像都由很多層次構成,Docker 使用 Union FS 將這些不同的層結合到一個鏡像中去。

通常 Union FS 有兩個用途, 一方面可以實現不借助 LVM、RAID 將多個 disk 掛到同一個目錄下,另一個更常用的就是將一個只讀的分支和一個可寫的分支聯合在一起,Live CD 正是基于此方法可以允許在鏡像不變的基礎上允許用戶在其上進行一些寫操作。 Docker 在 AUFS 上構建的容器也是利用了類似的原理。

10 容器啟動

舉個例子,

后臺運行

更多的時候,需要讓 Docker在后臺運行而不是直接把執行命令的結果輸出在當前宿主機下。此時,可以通過添加 -d 參數來實現。

下面舉兩個例子來說明一下。

如果不使用 -d 參數運行容器

docker run ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"

容器會把輸出的結果(STDOUT)打印到宿主機上面

如果使用了 -d 參數運行容器

docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done",

則顯示是這樣:

使用 docker logs containerid 可以查看輸出,如:

使用 -d 參數啟動后會返回一個唯一的 id,也可以通過 docker ps 命令來查看容器信息。容器是否會長久運行,是和docker run指定的命令有關,和 -d 參數無關

在使用 -d 參數時,容器啟動后會進入后臺。 某些時候需要進入容器進行操作,有很多種方法,包括使用 docker attach 命令或 nsenter 工具等。具體參考這里

11 終止與重新啟動

使用 docker stop containerid 來終止容器。終止狀態的容器可以用 docker ps -a 命令看到。

另外,docker restart containerid 命令會將一個運行態的容器終止,然后再重新啟動它。

12 導入導出與刪除

如果要導出本地某個容器,可以使用 docker export containerid 命令。

可以使用 docker import 從容器快照文件中再導入為鏡像,例如

cat ubuntu.tar | sudo docker import - test/ubuntu:v1.0# 也可以通過指定 URL 或者某個目錄來導入,例如docker import http://example.com/exampleimage.tgz example/imagerepo

用戶既可以使用 docker load 來導入鏡像存儲文件到本地鏡像庫,也可以使用docker import 來導入一個容器快照到本地鏡像庫。這兩者的區別在于容器快照文件將丟棄所有的歷史記錄和元數據信息(即僅保存容器當時的快照狀態),而鏡像存儲文件將保存完整記錄,體積也要大。此外,從容器快照文件導入時可以重新指定標簽等元數據信息。

可以使用 docker rm 來刪除一個處于終止狀態的容器。如果要刪除一個運行中的容器,可以添加 -f 參數。Docker 會發送 SIGKILL 信號給容器。

用 docker ps -a 命令可以查看所有已經創建的包括終止狀態的容器,如果數量太多要一個個刪除可能會很麻煩,用 docker rm $(docker ps -a -q) 可以全部清理掉。

注意:這個命令其實會試圖刪除所有的包括還在運行中的容器,不過就像上面提過的docker rm 默認并不會刪除運行中的容器。

13 倉庫

倉庫(Repository)是集中存放鏡像的地方。

一個容易混淆的概念是注冊服務器(Registry)。實際上注冊服務器是管理倉庫的具體服務器,每個服務器上可以有多個倉庫,而每個倉庫下面有多個鏡像。從這方面來說,倉庫可以被認為是一個具體的項目或目錄。例如對于倉庫地址dl.dockerpool.com/ubuntu 來說,dl.dockerpool.com 是注冊服務器地址,ubuntu是倉庫名。

轉載于:https://blog.51cto.com/10515219/2398402

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/251727.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/251727.shtml
英文地址,請注明出處:http://en.pswp.cn/news/251727.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

NOIP 2016【蚯蚓】

好吧&#xff0c;我承認我是個智障…… 這道題一眼看上去就是個堆&#xff0c;然而實際上有單調性。 注意到&#xff0c;如果 \(q 0\) 的話&#xff0c;將蚯蚓的左右兩邊分開丟進兩個隊列中&#xff0c;則兩個隊列都是單調不增的&#xff0c;因為每次取出的蚯蚓長度單調不增。…

Ajax異步(客戶端測試)

客戶端測試&#xff1a;GET方法實現Ajax異步 var request new XMLHttpRequest(); request.open("GET","sever.php?number" document.getElementById("keyword").value); request.send(); request.onreadystatechange function(){ if(request.…

VS 添加文件添加文件成鏈接

轉載于:https://www.cnblogs.com/wsxkit/p/10907585.html

設計模式——3.觀察者模式

觀察者模式&#xff08;Observer&#xff09; 觀察者模式&#xff08;Observer&#xff09;簡介&#xff1a; 定義一個一對多的依賴關系&#xff0c;讓多個觀察者對象監聽某個主題對象&#xff0c;當主題對象的狀態發生改變時&#xff0c;主題對象則通知所有的觀察者對象&#…

Android 長按照片保存 工具類

2019獨角獸企業重金招聘Python工程師標準>>> public class ImgUtils {public static void saveImageToGallery(Context context, Bitmap bmp) {final String[] items new String[] { "保存圖片"};//圖片轉成Bitmap數組final Bitmap[] bitmap new Bitmap…

反爬機制

一.通過headers反爬蟲&#xff1a; Basic Auth這是一種古老的、不安全的用戶驗證方式&#xff0c;一般會有用戶授權的限制&#xff0c;會在headers的Autheration字段里要求加入用戶名密碼(明文)&#xff0c;如果驗證失敗則請求就會失敗&#xff0c;現在這種認證方式正在被淘汰。…

knockout + easyui = koeasyui

在做后臺管理系統的同學們&#xff0c;是否有用easyui的經歷。雖然現在都是vue、ng、react的時代。但easyui&#xff08;也就是jquery為基礎&#xff09;還是占有一席之地的。因為他對后端開發者太友好了&#xff0c;太熟悉不過了。要讓一個后端開發者來理解vue或者是react的VN…

輕量社交APP系統ThinkSNS 簡 權威發布 限時惠購

2019獨角獸企業重金招聘Python工程師標準>>> 伴隨國內外創業風潮、AI、區塊鏈等互聯網軟件科技領域的高速發展&#xff0c;2019年&#xff0c;ThinkSNS軟件品牌迎來十周年后的新紀元。作為下一個階段的產品元年&#xff0c;官方于2019年5月正式發售輕量核心社交APP系…

linux下安裝oracle sqlplus以及imp、exp工具

一、下載oracle 11g sqlplus軟件 linux 64位操作系統&#xff0c;oracle安裝包地址 http://www.oracle.com/technetwork/topics/linuxx86-64soft-092277.html oracle-instantclient11.2-sqlplus-11.2.0.3.0-1.x86_64.rpm  oracle-instantclient11.2-basic-11.2.0.4.0-1.x86_6…

在operator =中要處理“自我賦值”

防止自我賦值很有必要 Widget w; w w; a[i] a[j]; //a[i]和a[j]實際上指向同一個元素 *pi *pj; //pi和pj實際上指向同一個元素 自我賦值的危害&#xff1a; Widget { private:Test *p; }; Widget &Widget::operator(const Widget &w) {delete p;p new int (*w.p);r…

新添加磁盤分區后,找不到新分區

問題&#xff1a;在Vcent中擴容磁盤容量&#xff0c;登錄虛擬機fdisk /dev/sda分區后&#xff0c;找不到新分區。 lsblk或者 df -TH fdisk /dev/sda p 嘗試解決辦法&#xff1a; cd /sys/class/scsi_host/ ls echo "- - -" > /sys/class/scsi_host/host0/scan (中…

Linux一些指令

備忘。。 ~/.bashrc 環境變量文件 xshell5 與本機文件傳輸 rz接受 sz filename 傳輸 watch -n 2 nvidia-smi 監視gpu 狀態wget 下載單個文件wget http://images.cocodataset.org/zips/train2014.zip給.sh文件添加x執行權限 比如以hello.sh文件為例&#xff0c;chmod ux hello…

C# 通過反射獲取方法/類上的自定義特性

1.所有自定義屬性都必須繼承System.Attribute 2.自定義屬性的類名稱必須為 XXXXAttribute 即是已Attribute結尾 自定義屬性QuickWebApi [AttributeUsage(AttributeTargets.Method, Inherited false, AllowMultiple true)]public class QuickWebApiAttribute: Attribute{publ…

Spring Cloud Zuul網關(快速搭建)

zuul 是netflix開源的一個API Gateway 服務器, 本質上是一個web servlet應用。 在云平臺上提供動態路由&#xff0c;監控&#xff0c;彈性&#xff0c;安全等邊緣服務的框架。相當于是設備和 Netflix 流應用的 Web 網站后端所有請求的前門。主要功能是路由轉發和過濾器。 Zuul可…

10.13 上午 考試

T1 直接二分就好了 #include <cstdio> #include <cstring> #include <iostream> #include <cmath> #include <cstdlib> #include <algorithm> #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) using namespace std;ll n; in…

前端安全之token

前端可以通過cookie以js的方式存取token&#xff0c;并且實現用戶的登錄登出以及token的超時操作&#xff0c;但這樣做并不安全&#xff0c;無法避免跨站腳本的攻擊&#xff0c;如果對項目的安全性要求比較高&#xff0c;應該在服務端開啟http only為true&#xff0c;通過服務端…

gbk 轉 UTF-8

iconv命令 gbk 轉 UTF-8 -----linux gbk 轉 UTF-8-------- iconv 用法 iconv -f "gbk" -t "utf-8" < infile > outfile 或者 piconv -f "gbk" -t "utf-8" < infile > outfile iconv -f utf-8 -t GBK 123456.txt 對傳文件…

Mybatis中輸入輸出映射和動態Sql

一、輸入映射我們通過配置parameterType的值來指定輸入參數的類型&#xff0c;這些類型可以是簡單數據類型、POJO、HashMap等數據類型1、簡單類型2、POJO包裝類型①這是單表查詢的時候傳入的POJO包裝類型&#xff0c;即可以直接傳入實體類&#xff0c;但是當多表查詢的時候&…

css純字母或者字母換行顯示

white-space:normal; word-break:break-all;轉載于:https://www.cnblogs.com/mmykdbc/p/7661009.html

javascript使用btoa和atob來進行Base64轉碼和解碼

javascript中如何使用Base64轉碼 let str javascript;let btoaStr window.btoa(str); //轉碼結果 amF2YXNjcmlwdAconsole.log(btoaStr);console.log(window.atob(btoaStr)); //解碼結果 javascriptBase64轉碼的對象只能是字符串, var str "China&#xff0c;中國"…