Remove ads
用於部署容器化應用程式的開放原始碼軟體 来自维基百科,自由的百科全书
Docker是一個開放原始碼的開放平臺軟件,用於開發應用、交付(shipping)應用和執行應用。Docker允許用戶將基礎設施(Infrastructure)中的應用單獨分割出來,形成更小的顆粒(容器),從而提高交付軟件的速度。[2]
Docker容器與虛擬機器類似,但二者在原理上不同。容器是將作業系統層虛擬化,虛擬機器則是虛擬化硬件,因此容器更具有可攜式性、更能高效地利用伺服器。 容器更多的用於表示軟件的一個標準化單元。由於容器的標準化,因此它可以無視基礎設施(Infrastructure)的差異,部署到任何一個地方。另外,Docker也為容器提供更強的業界的隔離相容。[3]
Docker 利用Linux核心中的資源分離機制,例如cgroups,以及Linux核心命名空間(namespaces),來建立獨立的容器(containers)。這可以在單一Linux實體下運作,避免啟動一個虛擬機器造成的額外負擔[4]。Linux核心對命名空間的支援完全隔離了工作環境中應用程式的視野,包括行程樹、網絡、用戶ID與掛載檔案系統,而核心的cgroup提供資源隔離,包括CPU、記憶體、block I/O與網絡。從0.9版本起,Dockers在使用抽象虛擬是經由libvirt的LXC與systemd - nspawn提供介面的基礎上,開始包括libcontainer函式庫做為以自己的方式開始直接使用由Linux核心提供的虛擬化的設施。[4]
專業名詞Docker有兩個意思:[5]
Docker引擎(Docker Engine)是一個伺服器端-客戶端結構的應用,主要有這些部分:Docker守護行程、Docker Engine API(頁面存檔備份,存於互聯網檔案館)、Docker客戶端。[6]
dockerd
,是一個持久化的行程,用戶管理容器。守護行程會監聽Docker Engine API(頁面存檔備份,存於互聯網檔案館) 的請求。[7]wget
和 curl
等命令呼叫。[8]docker
,是大部分用戶與Docker互動的主要方式。用戶通過客戶端將命令傳送給守護行程。命令會遵循Docker Engine API (頁面存檔備份,存於互聯網檔案館) (頁面存檔備份,存於互聯網檔案館)(頁面存檔備份,存於互聯網檔案館)[7]Docker註冊中心(Docker registry)是用於儲存Docker的鏡像。Docker Hub 是一個公共的註冊中心,任何人都可以使用,預設組態下,Docker將會在這裏尋找鏡像。[6]
另外,用戶可以自行構建私有註冊中心。Docker Datacenter (DDC)的用戶,可以直接使用 Docker Trusted Registry (DTR)。[6]
Docker的對象是指Images、Containers、Networks、Volumes、Plugins等等。[6]
Compose可譯為組合物。[12]Compose 是用於定義和執行 多個容器Docker應用程式 的工具。通過Compose,你可以使用YAML檔案來組態應用程式需要的所有服務,然後通過使用一個命令,就可以建立並啟動所有服務。[13][14]Compose對應的命令為docker-compose
。[15]
當說到 Docker Swarm 時,一般是指單獨專案 Docker Swarm。而在Docker 1.12時,將swarm mode整合到Docker 引擎中,可用Docker引擎API 和 CLI 命令直接使用。官方推薦用戶使用整合的 swarm mode [16]。
Swarm Mode 內建 kv 儲存功能,提供了眾多的新特性,比如:具有容錯能力的去中心化設計、內建服務發現、負載均衡、路由網格、動態伸縮、滾動更新、安全傳輸等。使得 Docker 原生的 Swarm
叢集具備與 Mesos、Kubernetes 競爭的實力。[17]
cluster(中文:叢集),Docker將叢集定義為:一群共同作業並提供高可用性的機器[5] 。swarm(中文:群[18]),是指一個叢集的Docker引擎以swarm mode形式執行[5]。swarm mode是指Docker引擎內嵌的叢集管理和編排功能。當你初始化了一個swarm(cluster)或者將節點加入一個swarm時,其Docker引擎就會以swarm mode的形式執行。[5]
swarm中的Docker機器中分為 managers(管理者) 和 workers(員工),管理者用於處理叢集的關係和委派,員工則用於執行 swarm服務。[19] 當你建立swarm服務時,你可以為其增加各種額外的狀態(如:數量、網絡、埠、儲存資源等等)。Docker會去維持用戶想要的狀態。如:一個工作節點如果掛了,那麼Docker會去把這個節點的任務給另外一個節點。此處的任務(task)是指:被swarm管理者管理的一個執行中的容器。[19]
swarm服務比單獨容器好在,修改swarm服務的組態之後不用重新啟動。同時,Docker以swarm mode形式執行時,也可以選擇直接啟動單獨的容器。另外,swarm mode下,你也可以通過 docker stack deploy
使用 Compose file 部署應用棧。[20][19] swarm服務分為兩種,一種是replicated services ,可以指定節點任務的總數量;global services,則是每個節點都會執行一個指定任務。[21] swarm管理員使用 ingress 負載均衡使服務可被外部接觸。 swarm管理員會自動地給服務分配PublishedPort(或者手動組態)。外部組件,如雲負載均衡器能通過叢集中任何節點上的PublishedPort去接入服務(不管該服務是否啟動)。另外 swarm mode有內部DNS組件,它會為每個服務分配一個DNS條目。swarm管理員使用 internal load balancing 去分發請求時,就是依靠這個DNS組件。[22]
swarm mode的功能是由swarmkit(一個獨立專案)提供的,它實現了Docker的編排層。swarm可以直接被Docker使用。[19]
Docker有兩種檔案格式,Dockerfile和Compose file。Dockerfile定義了單個容器的內容和啟動時候的行為。Compose file定義了一個多容器應用。[23]
Docker 可以依照 Dockerfile 的內容,自動化地構建鏡像。 Dockerfile 是包含着用戶想要如何構建鏡像的所有命令的文字。[24]
FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py
關鍵詞:
RUN
。RUN
會在當前鏡像的頂層上添加新的一層(layer),並在該層上執行命令,執行結果將會被提交。提交後的結果將會用於Dockerfile
的下一步。[25]ENTRYPOINT
,入口點。ENTRYPOINT
允許你組態容器,使之成為可執行程式。[26]即,ENTRYPOINT
允許你為容器增加一個入口點。ENTRYPOINT
和CMD
類似,均在容器啟動時執行,但是ENTRYPOINT
為了提供穩定且不可被覆蓋的操作。[27]通過在命令列中指定--entrypoint 命令
的方式,可在執行時將Dockerfile檔案中的ENTRYPOINT
覆蓋。CMD
,是command的縮寫。CMD
用於為已建立的鏡像提供預設的操作,當不想要用預設操作時候,可用docker run IMAGE[:TAG|@DIGEST] [COMMAND]
進行替換 。但當Dockerfile擁有入口點時,CMD
用於賦予入口點參數。[28]Compose檔案 是一個YAML檔案,定義了服務(service)、網絡、卷(volume)。
docker run
命令。docker network create
命令 。docker volume create
命令。docker run
命令中有一些選項,和 Dockerfile檔案中的指令效果一樣(如:CMD
, EXPOSE
, VOLUME
, ENV
),如果Dockerfile檔案中使用這些指令,那麼這些指令就會被視為預設參數,所以開發者無需特意在 Compose檔案中再指定一次。[29]
Compose檔案 可使用 Shell變數(Variable),如:[30]
db:
image: "postgres:${POSTGRES_VERSION}"
Compose檔案 可通過自身的ARGS
變數,將參數傳給Dockerfile的 ARGS
指令。[31]
參考文件:Docker文件-網絡概要(頁面存檔備份,存於互聯網檔案館)
在Docker裏,網橋網絡 使用的是 軟件形式的網橋。使用相同的網橋的容器連接進入該網絡,而非該網絡的容器刷故無法接入。Docker網橋驅動會自動地在Docker主機上安裝規則,這些規則讓不同橋接網絡之間不能直接通訊。[32] 橋接經常用於:在單獨容器上執行應用時,可通過 網橋 進行通訊。[33] 網橋網絡 適用於容器執行在相同地Docker守護行程的主機上。不同Docker守護行程主機上的容器,它們之間的通訊需要依靠作業系統層次的路由,或者你應該使用 overlay網絡 進行代替。[32]
bridge
是網橋驅動,是Docker預設的網絡驅動(介面名為 docker0
[34]),當你不為容器指定一個網絡時候,Docker將會使用該驅動。[33] 可通過 daemon.json
檔案修改相關組態。[35]
主機模式
host
用於單獨容器,該網絡下容器只能和Docker主機進行直接連接。host
只適用於 Docker 17.06或以上版本的swarm服務。
host網絡和VirtualBox的 僅主機網絡(Host-only Networking) 類似。[38]
overlay
(中文:覆蓋網絡)網絡驅動將會建立分散式網絡,該網絡可以覆蓋若干個 Docker守護行程主機。該網絡是基於 主機特定網絡(host-specific networks),允許 swarm服務 和 容器 進行安全通訊(當加密功能開啟時)。在該網絡下,Docker能夠清晰地掌握 封包的路由 以及 傳送接收容器。[39]
overlay
有兩種網絡類型網絡:[39]
ingress
網絡,可掌控 swarm服務 的網絡流量 。該網絡是 overlay
的預設網絡。docker_gwbridge
網絡是 網橋網絡。該網絡會將 單獨的Docker守護行程 連接至 swarm里的另外一個守護行程。在 overlay
網絡下,單獨的容器 和 swarm服務 的行為和組態概念 是不一樣的。[39]
該策略不需要 容器們 具有作業系統級別的路由,因為Docker負責路由。[33]
Macvlan
網絡組態提供了一種機制,允許單獨的容器具有獨立的MAC地址,使得這些容器在網絡上表現得如同物理裝置。
該策略下,容器不使用任何網絡。none
常常用於連接自訂網絡驅動的情況下。
截止2023年5月18日,Docker官方倉庫域名 https://hub.docker.com/ (頁面存檔備份,存於互聯網檔案館) 在中國大陸被封鎖,方式為DNS污染。隨後短暫解封,2024年6月6日再次被封。
Docker預設下,所有檔案將會儲存在容器里的可寫的容器層(container layer)。[40]
容器有兩種永久化儲存方式:卷(volumes)和 繫結掛載(bind mounts)。另外,Linux用戶還可使用 tmpfs 進行掛載;Window用戶還可以使用 命名管道(named pipe)。在容器中,不管是哪種永久化儲存,表現形式都是一樣的。[40]
卷(volumes)是宿主機器的檔案系統的一部分,由Docker進行管理( 在Linux,儲存於/var/lib/docker/volumes/
)。非Docker程式不應該去修改這些檔案。Docker推薦使用 卷 進行持久化數據。 卷 可支援 卷驅動(volume drivers),該驅動允許用戶將數據儲存到 遠端主機 或 雲服務商(cloud provider)或 其他。[40]
沒有名字的卷叫匿名卷(anonymous volume),有名字的卷叫命名卷(named volume)。匿名卷沒有明確的名字,當被初始化時,會被賦予一個隨機名字。[40]
繫結掛載(bind mounts)通過將宿主機器的路徑掛載到容器里的這種方式,從而數據持續化,因此繫結掛載可將數據儲存在宿主機器的檔案系統的任何地方。非Docker程式可修改這些檔案。 繫結掛載是Docker早期就存在的,相比起卷,繫結掛載十分簡單明了。[40] 在開發Docker應用時,應使用命名卷(named volume)代替繫結掛載,因為用戶不能對繫結掛載進行 Docker CLI 命令操作。[40]
繫結掛載常用於:[41]
tmpfs
掛載(tmpfs mounts),僅僅儲存於主記憶體中,並不操作 宿主機器的檔案系統(不持久化於磁碟)。它可用於儲存一些 非持久化狀態、敏感數據。 舉例,swarm服務 通過tmpfs
將 secrets(頁面存檔備份,存於互聯網檔案館)(密碼、金鑰、證書等)儲存到swarm服務。 [40]
命名管道(named pipes),通過 npipe
掛載的形式,使 Docker主機 和 容器 之間能互相通訊。常見用例是在容器內執行第三方工具,並使用命名管道連接到Docker Engine API。[40][42]
當掛載 空的卷 至一個目錄中,目錄中的內容會被複製於卷中(不會覆蓋)。如果掛載 非空的卷 或 繫結掛載 至一個目錄中,那麼該目錄的內容將會被隱藏(obscured ),當解除安裝後內容將會恢復顯示。[43]
在UNIX和類Unix系統中,常見的 I/O流(英語:I/O streams) 分為三種:STDIN
(輸入 )、 STDOUT
(正常輸出)、STDERR
(錯誤輸出)。[44]
預設組態下,Docker的紀錄檔(如:docker logs
、docker service log
)所記載的是命令列的輸出結果(STDOUT
和STDERR
)。而STDOUT
和 STDERR
對應的檔案路徑分別是 /dev/stderr
和/dev/stdout
。[44] 另外,也可以在宿主主機上檢視容器的紀錄檔,使用以下命令可以檢視到容器的紀錄檔位置。[45]
$ docker inspect --format='{{.LogPath}}' $INSTANCE_ID
kind(全稱:Kubernetes IN Docker)是部署本地Kubernetes叢集的工具,而叢集的節點是由Docker生成的。[46]
在安裝完kind之後,通過kind create cluster
命令生成叢集。[46] 生成Kubernetes叢集後,可以通過Docker命令進行檢視節點概覽:
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
99c96c1f21ab kindest/node:v1.17.0 "/usr/local/bin/entr…" 4 minutes ago Up 4 minutes 127.0.0.1:32769->6443/tcp kind-control-plane
Docker命令在過去的發展中誕生了40種以上的命令,過多的命令導致混亂以及難以使用tab自動補充,因此在docker 1.13版本(2017.1.19)中,命令列被重構,根據邏輯對象進行劃分。官方建議用戶使用新的語法進行操作。[47]
參考Swarm Mode章節。
Docker Machine 是一個工具,它允許你在虛擬宿主機上安裝 Docker引擎,並使用 docker-machine 命令管理這些宿主機。你可以使用 Machine 在你本地的 Mac 或 Windows box、公司網絡、數據中心、或像 AWS 或 Digital Ocean 這樣的雲提供商上建立 Docker 宿主機。[48][49]
Docker Machine 最後更新時間是在0.16.0 (2018-11-08)版本[50]。官方建議在1.12以及之後版本使用Docker Desktop for Mac和Docker Desktop for Windows進行代替。[48]
Docker Toolbox是用於幫 Windows系統和Mac系統 安裝Docker環境。新版本建議使用Docker Desktop for Mac和Docker Desktop for Windows進行安裝。[51]最後更新版本是 19.03.1(2019-08-01)。[52]
2021年,安全公司Palo Alto Networks研究人員Aviv Sasson,在Docker Hub上發現的惡意容器映像存檔,分別來自10個不同帳號,總下載次數超過2000萬次,其中內含的挖礦軟件。[53]
Seamless Wikipedia browsing. On steroids.
Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.
Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.