Docker 基礎 - Docker 遇見前端(二)
一、Docker 系統架構
守護程序
負責容器的建立、執行和監控,還負責映象的構建和儲存。 docker demon
命令可啟動 Docker 守護程序。
Docker 客戶端
通過http與 docker 守護程序通訊。與docker守護程序通訊的 API 有非常清晰的定義和文件,開發者也可以利用 API 直接和守護程序通訊,而不通過 docker 客戶端。
Docker 映象倉庫
預設的寄存服務為 Docker Hub, 負責映象的儲存和釋出。根據實際需要,我們也可以構建和運營自己的docker服務。
底層技術
cgroups
負責管理容器使用的資源,如記憶體和CPU;
namespaces
負責容器之間的隔離;確保系統的其他部分與容器的檔案系統、主機名、使用者、網路和程序都是分開的。
UFS (union file system)
負責儲存容器的映象層。
周邊技術
swarm
docker 叢集解決方案
compose
負責構建和執行多個docker容器所組成的應用程式的工具。主要用於開發和測試環境。
machine
非Linux系統(Windows、MacOS)上的GUI,用於執行和管理docker容器;
docker trusted registry
管理和儲存docker映象。
網路連線
overlay
服務發現
consul、skyDNS
服務編排及叢集管理
kubernetes,swarm等等
專門用於託管容器的作業系統
雖然docker在大部分的Linux發行版本上 都執行的很好,但還是出現了一些新的發行版專案,他們只考慮需要執行容器的環境,希望做出體積小二容易管理的發行版,尤其是針對資料中心或叢集的使用場景。
二、映象是如何生成的
建立映象的主要方法是通過 Dockerfile
和 docker build
。
構建環境的上下文
命令 docker build
需要 Dockerfile
和 build context
。 build context 是一組本地檔案和目錄,他可以被 Dockerfile 的 ADD
和 COPY
指令引用,通常以目錄路徑的形式指定。
如果提供的URL以http開頭,它會被假定位直接指向 dockerfile ,這樣做沒什麼用,因為該 Dockerfile
沒有與任何上下文關聯。
也可以將git倉庫作為構建環境上下文。這種情況下,docker客戶端會將Git倉庫colone到本地,然後傳遞給守護程序作為構建環境上下文。
還可以通過stdin輸入構建環境的上下文,方法是在需要輸入上下文的地方使用 -
引數。該輸入可以是一個歸檔檔案,支援 tar.gz / xz / bzip2 格式。
從構建環境的上下文中排除不必要的檔案,可以使用 .dockerignore
檔案,該檔案類似 .gitignore
。
映象
Dockerfile 中的每個指令執行後都會生成一個映象層,這個映象層可以用來啟動容器。一個新的映象層的建立,使用上一個映象層啟動容器,然後執行dockerfile中的指令,再把它儲存為一個新映象。
當dockerfile 執行成功後,中間的那些容器會被刪掉,除非提供 --rm=false
引數。
由於每個指令的最終結果都只是個靜態的映象,本質上是一個檔案系統以及一些元資料,因此即使指令中的持久程序,最終都會被停掉。比如你在一條指令中開啟一個數據庫服務的程序,但到了下一條指令,或啟動容器的時候,它就已經不存在了。
如果你需要在啟動容器的時候同事執行一個程序或服務,他必須從 ENTRYPOINT
或 CMD
指令中啟動。
Docker 為了加快映象構建的速度,會將每一個映象層快取下來。 Docker的快取特效能大大提高工作效率。
基礎映象
基於映象分層的特點,當我們需要一個環境時,無需重頭開始去構建一個映象。最理想的做法是完全不用建立映象,直接使用某個現有的映象,然後把配置檔案和資料掛在上去即可。對於常用軟體,比如資料庫、web伺服器,這是非常可行的。一般情況下使用官方映象比自己建立一個映象好得多,因為其他人已經找到使得該軟體以最佳方式執行在容器中的方法。
如果你需要使用一個基礎映象以執行應用程式,那麼應該先檢查一下,應用程式所使用的程式語言或框架是否已提供了官方的映象。如果只是需要一個小而完整的Linux 發行版本,可以選擇 alpine
,他的大小僅僅5MB多一點,但仍提供了一個包管理器,可以輕鬆安裝大量應用和工具。
Dockerfile
Exec 與 Shell 的對比
一些指令( RUN
、 CMD
、 ENTRYPOINT
)能夠接受 shell 和 exec 這兩種格式。exec 格式需要用到一個JSON陣列,如:["executable","param1","param2"],其中第一個元素是可執行檔案,其他元素是他執行時所使用的引數。shell格式使用的是自由形式的字串,字串會傳給 /bin/sh -c
執行。exec格式適用於需要規避 shell 對字串做出錯誤解析的情況,或者當徑向力沒有包含 /bin/sh
時。
常用指令
這些指令在 docker 網站上都可以找到非常詳細的說明文件,隨著docker的持續發展,文件也會有調整,下列指令描述如果與官方文件不一致,請以官網文件為準。
ADD
從構建環境上下文或遠端URL將檔案複製至映象。如果是從一個本地路徑新增一個壓縮檔案,他會被自動解壓。
CMD
當容器啟動執行時執行特定的指令。如果還定義了 ENTRYPOINT , 該指令將被解釋為 ENTRYPOINT 的引數(這時候請確保使用的是 exec 格式)。CMD指令也會被 docker run 命令中映象名稱後面的引數覆蓋。加入定義了多個CMD,只有最後一個會生效。
COPY
從構建環境上下文複製檔案至映象。它有兩種形式,COPY src dest 或 COPY ["SRC","DEST"],如果路徑中有空格的話,必須使用第二種格式。
ENTRYPOINT
設定一個在容器啟動時執行的可執行檔案(以及預設引數)。任何CMD指令或docker run 命令中映象名稱之後的引數,將作為引數傳遞給這個可執行檔案。 ENTRYPOINT 指令通常用於提供“啟動”指令碼,目的是在解析引數之前,對變數和服務進行初始化。
ENV
設定映象內的環境變數。這些變數可以被隨後的指令應用。
EXPOSE
向 Docker 表示該容器將會有一個程序監聽所指定的埠。提供這個資訊的目的是用於連線容器或在執行 docker run 命令式通過 -p 引數把埠釋出出來; EXPOSE 本身不會對網路有實質性的改變。
FROM
設定 Dockerfile 使用的基礎映象;隨後的指令將基於該映象之上。 FROM 必須為 Dockerfile 的第一條指令。
MAINTAINER
設定映象維護者的姓名和聯絡方式
ONBUILD
指定當映象被用作另一個映象的基礎映象時將會執行的指令。
RUN
在容器內執行指定的指令,並把結果儲存下來。
USER
設定任何後續的RUN、CMD或ENTRYPOINT指令執行時所用的使用者(使用者名稱或UID)。
VOLUME指定為資料卷的檔案或目錄。如果該檔案或目錄已經在映象中存在,那麼當容器啟動時,他就會被複制到這個卷。如果提供了多個引數,那麼就將被解釋成多個數據卷。
WORKDIR
對任何後續的 RUN、CMD、ENTRYPOINT、ADD、COPY指令設定的工作目錄。這個指令可多次使用。
三、外部可訪問 && 埠轉發
假設你在容器中執行一個 Nginx web伺服器,你如何使外界可以訪問他呢?通過 -p
或 -P
選項來發布埠。比如:
$docker run -d -p 8000:80 nginx
容器啟動後,我們可以通過 localhost:8000
訪問到容器內的 web 服務。其中 -p 8000:80
引數告訴 docker 將主機的 8000 埠轉發到容器的 80 埠。或者可以使用 -P
引數來告訴 Docker 自動選擇一個主機上未使用的埠。
四、資料卷 && 資料容器
資料卷,是一個目錄,但並不屬於UFS的一部分,它只是在主機上被繫結掛在到容器的一個普通目錄。有三種方式可以掛載資料卷:
執行 Docker 時,通過 -v
選項來指定資料卷
docker run -it --name test -v /data debian /bin/bash
通過 Dockerfile 的 VOLUME 命令
FROM debian VOLUME /data
指定資料卷要繫結的主機目錄
docker run -v /home/data:/data debian ls /data
這個例子把主機的 /home/data 目錄繫結到容器的 /data 目錄,容器能夠使用主機 /home/data 目錄下的檔案。
在執行 docker run 命令時,我們通過傳入 --volumes-from container
引數可以實現容器間的資料共享。一個常用的做法是,建立資料容器,這種容器的唯一目的就是與其他容器分享資料。
五、Docker 常用命令
- docker build 從dockerfile構建映象。
- docker images 列出所有本地映象。
- docker run 這是一個相對複雜的命令,支援非常多引數。
- docker attach 檢視容器內主程序,並與之互動
- docker create 建立容器但不啟動執行
- docker exec 在同期中執行一個命令
- docker rm 刪除一個或多個容器
其實經常用到的命令還有很多,可以在 http://docs.docker.com
查閱完整的釋義,也可以在命令列通過 --help
引數檢視具體使用說明。
寫在後面
本文地址: ofollow,noindex" target="_blank">https://www.cnblogs.com/kelsen/p/9608578.html
關於本文如果您有任何建議或疑問請在下面留言交流,也可通過 Web前端高階工程師 群進行線上溝通。