守護進程
負責容器的建立、運行和監控,還負責鏡像的構建和存儲。docker demon
命令可啓動 Docker 守護進程。html
Docker 客戶端
經過http與 docker 守護進程通訊。與docker守護進程通訊的 API 有很是清晰的定義和文檔,開發者也能夠利用 API 直接和守護進程通訊,而不經過 docker 客戶端。nginx
Docker 鏡像倉庫
默認的寄存服務爲 Docker Hub, 負責鏡像的存儲和發佈。根據實際須要,咱們也能夠構建和運營本身的docker服務。git
cgroups
負責管理容器使用的資源,如內存和CPU;web
namespaces
負責容器之間的隔離;確保系統的其餘部分與容器的文件系統、主機名、用戶、網絡和進程都是分開的。docker
UFS (union file system)
負責存儲容器的鏡像層。shell
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多一點,但仍提供了一個包管理器,能夠輕鬆安裝大量應用和工具。
一些指令(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
參數能夠實現容器間的數據共享。一個經常使用的作法是,建立數據容器,這種容器的惟一目的就是與其餘容器分享數據。
其實常常用到的命令還有不少,能夠在 http://docs.docker.com
查閱完整的釋義,也能夠在命令行經過 --help
參數查看具體使用說明。
本文地址:http://www.javashuo.com/article/p-otzowmbz-he.html
若是您有任何建議或疑問請在下面留言交流。