Docker 基礎 - Docker 與前端(二)

1、Docker 系統架構

守護進程
負責容器的建立、運行和監控,還負責鏡像的構建和存儲。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發行版本上 都運行的很好,但仍是出現了一些新的發行版項目,他們只考慮須要運行容器的環境,但願作出體積小二容易管理的發行版,尤爲是針對數據中心或集羣的使用場景。

2、鏡像是如何生成的

建立鏡像的主要方法是經過 Dockerfiledocker build

構建環境的上下文

命令 docker build須要 Dockerfilebuild context。 build context 是一組本地文件和目錄,他能夠被 Dockerfile 的 ADDCOPY 指令引用,一般以目錄路徑的形式指定。

若是提供的URL以http開頭,它會被假定位直接指向 dockerfile ,這樣作沒什麼用,由於該 Dockerfile沒有與任何上下文關聯。

也能夠將git倉庫做爲構建環境上下文。這種狀況下,docker客戶端會將Git倉庫colone到本地,而後傳遞給守護進程做爲構建環境上下文。

還能夠經過stdin輸入構建環境的上下文,方法是在須要輸入上下文的地方使用 -參數。該輸入能夠是一個歸檔文件,支持 tar.gz / xz / bzip2 格式。

從構建環境的上下文中排除沒必要要的文件,可使用.dockerignore文件,該文件相似 .gitignore

鏡像

Dockerfile 中的每一個指令執行後都會生成一個鏡像層,這個鏡像層能夠用來啓動容器。一個新的鏡像層的創建,使用上一個鏡像層啓動容器,而後執行dockerfile中的指令,再把它保存爲一個新鏡像。

當dockerfile 執行成功後,中間的那些容器會被刪掉,除非提供 --rm=false 參數。

因爲每一個指令的最終結果都只是個靜態的鏡像,本質上是一個文件系統以及一些元數據,所以即便指令中的持久進程,最終都會被停掉。好比你在一條指令中開啓一個數據庫服務的進程,但到了下一條指令,或啓動容器的時候,它就已經不存在了。

若是你須要在啓動容器的時候同事運行一個進程或服務,他必須從ENTRYPOINTCMD 指令中啓動。

Docker 爲了加快鏡像構建的速度,會將每個鏡像層緩存下來。 Docker的緩存特性能大大提升工做效率。

基礎鏡像

基於鏡像分層的特色,當咱們須要一個環境時,無需重頭開始去構建一個鏡像。最理想的作法是徹底不用建立鏡像,直接使用某個現有的鏡像,而後把配置文件和數據掛在上去便可。對於經常使用軟件,好比數據庫、web服務器,這是很是可行的。通常狀況下使用官方鏡像比本身建立一個鏡像好得多,由於其餘人已經找到使得該軟件以最佳方式運行在容器中的方法。

若是你須要使用一個基礎鏡像以運行應用程序,那麼應該先檢查一下,應用程序所使用的編程語言或框架是否已提供了官方的鏡像。若是隻是須要一個小而完整的Linux 發行版本,能夠選擇 alpine,他的大小僅僅5MB多一點,但仍提供了一個包管理器,能夠輕鬆安裝大量應用和工具。

Dockerfile

Exec 與 Shell 的對比

一些指令(RUNCMDENTRYPOINT)可以接受 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指令設置的工做目錄。這個指令可屢次使用。

3、外部可訪問 && 端口轉發

假設你在容器中運行一個 Nginx web服務器,你如何使外界能夠訪問他呢?經過 -p-P 選項來發布端口。好比:

$docker run -d -p 8000:80 nginx

容器啓動後,咱們能夠經過 localhost:8000 訪問到容器內的 web 服務。其中 -p 8000:80 參數告訴 docker 將主機的 8000 端口轉發到容器的 80 端口。或者可使用 -P 參數來告訴 Docker 自動選擇一個主機上未使用的端口。

4、數據卷 && 數據容器

數據卷,是一個目錄,但並不屬於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 參數能夠實現容器間的數據共享。一個經常使用的作法是,建立數據容器,這種容器的惟一目的就是與其餘容器分享數據。

5、Docker 經常使用命令

  1. docker build 從dockerfile構建鏡像。
  2. docker images 列出全部本地鏡像。
  3. docker run 這是一個相對複雜的命令,支持很是多參數。
  4. docker attach 查看容器內主進程,並與之交互
  5. docker create 建立容器但不啓動運行
  6. docker exec 在同期中運行一個命令
  7. docker rm 刪除一個或多個容器

其實常常用到的命令還有不少,能夠在 http://docs.docker.com 查閱完整的釋義,也能夠在命令行經過 --help參數查看具體使用說明。

寫在後面

本文地址:http://www.javashuo.com/article/p-otzowmbz-he.html

若是您有任何建議或疑問請在下面留言交流。

相關文章
相關標籤/搜索