Docker是一個開放原始碼開放平臺軟件,用於開發應用、交付(shipping)應用和執行應用。Docker允許用戶將基礎設施(Infrastructure)中的應用單獨分割出來,形成更小的顆粒(容器),從而提高交付軟件的速度。[2]

Quick Facts 原作者, 開發者 ...
Docker
原作者Solomon Hykes
開發者Docker, Inc.
首次釋出2013年3月13日 (2013-03-13)
目前版本
  • 27.3.1(2024年9月20日;穩定版本)[1]
編輯維基數據連結
原始碼庫 編輯維基數據連結
程式語言Go
作業系統LinuxWindowsmacOS
平台x86-64ARM、s390x、ppc64le
類型作業系統層虛擬化
特許條款可執行檔:免費增值軟件即服務
原始碼:Apache特許條款 2.0
網站www.docker.com
Close

Docker容器與虛擬機器類似,但二者在原理上不同。容器是將作業系統層虛擬化,虛擬機器則是虛擬化硬件,因此容器更具有可攜式性、更能高效地利用伺服器。 容器更多的用於表示軟件的一個標準化單元。由於容器的標準化,因此它可以無視基礎設施(Infrastructure)的差異,部署到任何一個地方。另外,Docker也為容器提供更強的業界的隔離相容。[3]

Docker 利用Linux核心中的資源分離機制,例如cgroups,以及Linux核心命名空間英語Linux namespaces(namespaces),來建立獨立的容器(containers)。這可以在單一Linux實體下運作,避免啟動一個虛擬機器造成的額外負擔[4]。Linux核心對命名空間的支援完全隔離了工作環境中應用程式的視野,包括行程樹、網絡、用戶ID與掛載檔案系統,而核心的cgroup提供資源隔離,包括CPU記憶體、block I/O與網絡。從0.9版本起,Dockers在使用抽象虛擬是經由libvirtLXC與systemd - nspawn提供介面的基礎上,開始包括libcontainer函式庫做為以自己的方式開始直接使用由Linux核心提供的虛擬化的設施。[4]

基礎架構

專業名詞Docker有兩個意思:[5]

  • 代指整個Docker專案。
  • 代指Docker引擎。

Docker引擎

Docker引擎(Docker Engine)是一個伺服器端-客戶端結構的應用,主要有這些部分:Docker守護行程、Docker Engine API頁面存檔備份,存於互聯網檔案館)、Docker客戶端。[6]

Docker註冊中心

Docker註冊中心(Docker registry)是用於儲存Docker的鏡像。Docker Hub 是一個公共的註冊中心,任何人都可以使用,預設組態下,Docker將會在這裏尋找鏡像。[6]

另外,用戶可以自行構建私有註冊中心。Docker Datacenter (DDC)的用戶,可以直接使用 Docker Trusted Registry (DTR)。[6]

2023年5月,在中國大陸地區被防火長城阻斷封鎖[9],同年9月恢復訪問[10]

對象

Docker的對象是指Images、Containers、Networks、Volumes、Plugins等等。[6]

  • 容器(Containers)是鏡像的可執行的實例。容器可通過API或CLI(命令列)進行操控。[6]
  • 鏡像(Images)是一個唯讀模板,用於指示建立容器。[6] 鏡像分層(layers)構建的,而定義這些層次的檔案叫Dockerfile[11]
  • 服務(Services)允許用戶跨越不同的Docker守護行程(Docker daemons)的情況下增加容器,並將這些容器分為管理者(managers)和工作者(workers),讓他們為swarm共同工作。[6]

擴充架構

Docker Compose

Compose可譯為組合物。[12]Compose 是用於定義和執行 多個容器Docker應用程式 的工具。通過Compose,你可以使用YAML檔案來組態應用程式需要的所有服務,然後通過使用一個命令,就可以建立並啟動所有服務。[13][14]Compose對應的命令為docker-compose[15]

Swarm Mode

當說到 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]

Dockerfile

Docker 可以依照 Dockerfile 的內容,自動化地構建鏡像。 Dockerfile 是包含着用戶想要如何構建鏡像的所有命令的文字。[24]

FROM ubuntu:18.04
COPY . /app
RUN make /app
CMD python /app/app.py

關鍵詞:

  • RUNRUN會在當前鏡像的頂層上添加新的一層(layer),並在該層上執行命令,執行結果將會被提交。提交後的結果將會用於Dockerfile的下一步。[25]
  • ENTRYPOINT入口點ENTRYPOINT允許你組態容器,使之成為可執行程式。[26]即,ENTRYPOINT允許你為容器增加一個入口點ENTRYPOINTCMD類似,均在容器啟動時執行,但是ENTRYPOINT為了提供穩定且不可被覆蓋的操作。[27]通過在命令列中指定--entrypoint 命令的方式,可在執行時將Dockerfile檔案中的ENTRYPOINT覆蓋。
  • CMD,是command的縮寫。CMD用於為已建立的鏡像提供預設的操作,當不想要用預設操作時候,可用docker run IMAGE[:TAG|@DIGEST] [COMMAND] 進行替換 。但當Dockerfile擁有入口點時,CMD用於賦予入口點參數。[28]

Compose檔案

Compose檔案 是一個YAML檔案,定義了服務(service)、網絡、(volume)。

  • 服務(service)定義 各容器的組態,定義內容將以命令列參數的方式 傳給 docker run 命令。
  • 網絡(network),類似地,將定義內容傳給 docker network create 命令 。
  • 卷(volume),類似地,將定義內容傳給 docker volume create 命令。

docker run 命令中有一些選項,和 Dockerfile檔案中的指令效果一樣(如:CMD, EXPOSE, VOLUME, ENV),如果Dockerfile檔案中使用這些指令,那麼這些指令就會被視為預設參數,所以開發者無需特意在 Compose檔案中再指定一次。[29]

Compose檔案 可使用 Shell變數(Variable),如:[30]

db:
  image: "postgres:${POSTGRES_VERSION}"

Compose檔案 可通過自身的ARGS變數,將參數傳給DockerfileARGS 指令。[31]

網絡

參考文件:Docker文件-網絡概要頁面存檔備份,存於互聯網檔案館

bridge

在Docker裏,網橋網絡 使用的是 軟件形式的網橋。使用相同的網橋的容器連接進入該網絡,而非該網絡的容器刷故無法接入。Docker網橋驅動會自動地在Docker主機上安裝規則,這些規則讓不同橋接網絡之間不能直接通訊。[32] 橋接經常用於:在單獨容器上執行應用時,可通過 網橋 進行通訊。[33] 網橋網絡 適用於容器執行在相同地Docker守護行程的主機上。不同Docker守護行程主機上的容器,它們之間的通訊需要依靠作業系統層次的路由,或者你應該使用 overlay網絡 進行代替。[32]

bridge 是網橋驅動,是Docker預設的網絡驅動(介面名為 docker0[34]),當你不為容器指定一個網絡時候,Docker將會使用該驅動。[33] 可通過 daemon.json 檔案修改相關組態。[35]

自訂網橋可通過 brctl 命令進行組態。[36][37]

host

主機模式

host 用於單獨容器,該網絡下容器只能和Docker主機進行直接連接。host 只適用於 Docker 17.06或以上版本的swarm服務。

host網絡和VirtualBox的 僅主機網絡(Host-only Networking) 類似。[38]

overlay

overlay (中文:覆蓋網絡)網絡驅動將會建立分散式網絡,該網絡可以覆蓋若干個 Docker守護行程主機。該網絡是基於 主機特定網絡(host-specific networks),允許 swarm服務 和 容器 進行安全通訊(當加密功能開啟時)。在該網絡下,Docker能夠清晰地掌握 封包的路由 以及 傳送接收容器。[39]

overlay 有兩種網絡類型網絡:[39]

  • ingress 網絡,可掌控 swarm服務 的網絡流量 。該網絡是 overlay 的預設網絡。
  • docker_gwbridge 網絡是 網橋網絡。該網絡會將 單獨的Docker守護行程 連接至 swarm里的另外一個守護行程。

overlay 網絡下,單獨的容器 和 swarm服務 的行為和組態概念 是不一樣的。[39]

該策略不需要 容器們 具有作業系統級別的路由,因為Docker負責路由。[33]

macvlan

Macvlan網絡組態提供了一種機制,允許單獨的容器具有獨立的MAC地址,使得這些容器在網絡上表現得如同物理裝置。

none

該策略下,容器不使用任何網絡。none 常常用於連接自訂網絡驅動的情況下。

其他

截止2023年5月18日,Docker官方倉庫域名 https://hub.docker.com/頁面存檔備份,存於互聯網檔案館) 在中國大陸被封鎖,方式為DNS污染。隨後短暫解封,2024年6月6日再次被封。

數據管理

Docker預設下,所有檔案將會儲存在容器里的可寫的容器層(container layer)。[40]

  • 數據與容器為一體。隨着容器消失,數據將消失;難以與其他程式(容器)共用。可以採用掛載檔案的方式解決。
  • 由於容器的寫入層是與宿主機器緊緊耦合。所以你難以流動數據到其他機器。
  • 容器的寫入層的是通過 儲存驅動頁面存檔備份,存於互聯網檔案館)(storage driver) 管理檔案系統。儲存驅動頁面存檔備份,存於互聯網檔案館) 會使用Linux內核的 鏈合檔案系統(union filesystem)進行掛載。相比起直接操作於宿主機器檔案系統的 數據卷,這額外的抽象層將會降低效能。

容器有兩種永久化儲存方式:卷(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]

  • 同步設定檔,如: 將 宿主主機的DNS設定檔/etc/resolv.conf)同步至容器中
  • 在開發程式時,將 原始碼 或 Artifact 同步至容器中。[41] 這種用法與 Vagrant 類似。

tmpfs

tmpfs 掛載(tmpfs mounts),僅僅儲存於主記憶體中,並不操作 宿主機器的檔案系統(不持久化於磁碟)。它可用於儲存一些 非持久化狀態、敏感數據。 舉例,swarm服務 通過tmpfssecrets頁面存檔備份,存於互聯網檔案館)(密碼、金鑰、證書等)儲存到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 logsdocker service log)所記載的是命令列的輸出結果(STDOUTSTDERR)。而STDOUTSTDERR 對應的檔案路徑分別是 /dev/stderr/dev/stdout[44] 另外,也可以在宿主主機上檢視容器的紀錄檔,使用以下命令可以檢視到容器的紀錄檔位置。[45]

$ docker inspect --format='{{.LogPath}}' $INSTANCE_ID

Kubernetes in docker

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]

已過時

Docker Swarm

參考Swarm Mode章節。

Docker Machine

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

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]

參考文獻

外部連結

參見

Wikiwand in your browser!

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.