跳至內容

Docker

出自Taiwan Tongues 台語維基
於 2025年8月23日 (六) 07:40 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

Docker是一个開放原始碼的開放平台軟體,用於開發應用、交付(shipping)應用佮執行應用。Docker 允准使用者將基礎設施(Infrastructure)應該是愛用單獨分割出來,形成閣較細粒的(容器), 自按呢提懸交付軟體的速度。

Docker 容器佮虛擬機器類似,毋過二者佇原理上無仝款。容器是共作業系統重虛擬化,虛擬的機器是虛擬化硬體,所以容器閣較有可能紮式性、閣較會當懸效地利用侍服器。容器閣較濟用表示軟體的一个標準化單元。因為容器的標準化,所以伊會當無視基礎設施(Infrastructure)的差異,部署去任何一个所在。另外咧,Docker 嘛為容器提供閣較強的業界的隔離相容。

Docker利用 Linux 核心內底的資源分離機制,比如講 cgroups,以及 Linux 核心號名空間(namespaces), 來建立獨立的容器(containers)。 這會當踮單一 Linux 實體下運作,避免啟動一个虛擬的機器造成的額外負擔。Linux 核心對號名的空間的支援完全隔離了工作環境應用程式的視野,包括行程樹仔、網路、使用者 ID 佮掛載檔案系統,猶閣核心的 cgroup 提供資源隔離,包括講 CPU、記持體、block I / O 佮網路。對零交九版本起,Dockers 佇咧使用抽象虛擬是經由 libvirt 的 LXC 佮 systemd-nspawn 提供介面的基礎頂懸,開始包括 libcontainer 函式庫做的方式開始直接使用 Linux 核心提供的虛擬化的設施。

基礎架構

專業名詞 Docker 有兩个意思:

  • 代指規个 Docker 專案。
  • 代指 Docker ia̋n-jín。

Docker ia̋n-jín

Docker ia̋n-jín( Docker Engine ) 是一个侍服器捀-客戶捀結構的應用,就是主要有遮的部份:Docker 守護行程、Docker Engine API、Docker 客戶捀。

  • Docker 守護行程( Docker daemons ),嘛叫 ` dockerd `,是一个維持久化的行程,使用者管理容器。守護行程會監聽 Docker Engine API 的請求。
  • Docker Engine API是用著佮 Docker 守護行程互動用的 API。伊是一个 RESTful API,所以伊毋但會當予 Docker 客戶捀呼叫,嘛會當予人 ` wget ` 和 ` curl ` 等命令呼叫。
  • Docker 客戶捀,嘛叫 ` docker `,是大部份使用者佮 Docker 互動的主要方式。使用者通過客戶端將命令傳送予守護行程。命令會遵循 Docker Engine API

Docker 註冊中心

Docker 註冊中心 ( Docker registry ) 是用於儲存 Docker 的鏡親像。Docker Hub 是一个公共的註冊中心,任何人攏會使用,預設組態下,Docker 將會佇遮揣鏡像。

另外咧,使用者會當家己構建私有註冊中心。Docker Datacenter ( DDC ) 的使用者,會當直接使用 Docker Trusted Registry ( DTR )。

東西

Docker 的物件是講 Images、Containers、Networks、Volumes、Plugins 等咧。

  • 容器(Containers)是鏡像的會當執行的實例。容器會當通過 API 抑是 CLI(命令列)進行操控。
  • 鏡親像(Images)是一个唯讀模仔,用佇咧指示建立容器。鏡親像分層 ( layers ) 構建的,定義遮的層次的檔案叫做Dockerfile
  • 服務(Services)允准使用者迒過無仝款的 Docker 守護行程(Docker daemons)的情況下增加容器,而且共遮的容器分做管理者(managers)佮工作者(workers), 予𪜶為 swarm 共同工作。

擴充架構

Docker Compose

Compose 有可譯做組合物。Compose 是用佇定義佮執行真濟个容器 Docker 應用程式的工具。通過 Compose,你會使用 YAML 檔案來組態應用程式需要的所有服務,然後通過使用一个命令,就會當建立並啟動所有服務。Compose 對應的命令為 ` docker-compose `。

Swarm Mode

你若講著 Docker Swarm 時,一般是講單獨專案 Docker Swarm。啊若佇咧 Docker 一孵一兩个時陣,將 swarm mode 整合甲講 Docker ia̋n-jín 中,可用 Docker ia̋n-jín API 和 CLI 命令直接使用。官方推薦使用者使用整合的 swarm mode。

Swarm Mode 內建 kv 儲存功能,提供濟濟的新特性,比如講:具有容錯能力的去中心化設計、內建服務發現、負載均衡、路有網格、動態伸勼、滾動更新、安全傳輸等。予得 Docker 原生的 ` Swarm ` 密集具備佮 Mesos、Kubernetes 競爭的實力。

cluster ( 中文:密集 ),Docker 將欉集定義做:一陣共同作業並提供高可用性的機械。swarm ( 中文:群 ),是講一个密集的講 Docker ia̋n-jín 以 swarm mode 形式執行。swarm mode 是講 Docker ia̋n-jín 內嵌的樹集管理佮編排功能。當你初初化一个 swarm ( cluster ) 抑是講共節點加入一个 swarm 時,其實 Docker ia̋n-jín 就會使 swarm mode 的形式執行。

原理

swarm 中的 Docker 機器內底分做 managers(管理者)和 workers(員工), 管理者用佇處理誠密集的關係佮委派,員工用於執行 swarm 服務。當你建立 swarm 咧服務的時陣,你會當替其增加各種額外的狀態(如:數量、網路、埠頭、儲存資源等等)。 Docker 會去維持使用者想欲愛的狀態。如:一个工課節點若掛一个,遐爾 Docker 會去共這个節點的任務予另外一个節點。此處的任務(task)是講:予被 swarm 管理者管理的一个執行內底的容器。

swarm 服務比單獨容器較好佇咧,修改 swarm 服務的組態了後毋免重新啟動。同時,Docker 以 swarm mode 形式執行的時,嘛會當選擇直接啟動單獨的容器。另外咧,swarm mode 落,你嘛會當通過 ` docker stack deploy ` 使用 Compose file 部署著愛用棧。swarm 服務分做兩種,一款是 replicated services,會當指定節點任務的總數量;global services,著啦每一个節點攏會執行一个指定任務。swarm 彼管理員使用 ingress 負載均衡使服務會當予外部接觸。swarm 管理員會自動地予服務分配 PublishedPort(抑是手動組態)。 外部組件,如雲負載均衡器能通過樹集中任何節點上的 PublishedPort 去接入服務(不管你愛服務是毋是啟動)。 另外咧 swarm mode 有內部 DNS 組件,伊會為每一个服務分配一个 DNS 條目。swarm 彼管理員使用 internal load balancing 去分發請求的時陣,就是倚靠這个 DNS 組件。

swarm mode 的功能是由 swarmkit ( 一个獨立專案 ) 提供的,伊實現矣 Docker 的編排層。swarm 會當直接予人 Docker 使用。

檔案格式

Docker 有兩種檔案格式,Dockerfile 和 Compose file。Dockerfile 定義了單個容器的內容佮啟動時陣的行為。Compose file 定義一个多容器應用。

Dockerfile

Docker 會當做依照 Dockerfile 的內容,自動化地構建鏡像。Dockerfile 是包含著使用者想欲按怎構建鏡像的所有的命令的文字。

關鍵詞:

  • ` RUN `。` RUN ` 會佇咧做前鏡像的頂層頂添加新的一層 ( layer ),而且佇彼爿上執行命令,執行結果將會予人提交。提交了後的結果會用於 ` Dockerfile ` 的後一步。
  • ` ENTRYPOINT `,入口點。` ENTRYPOINT ` 允准你組態容器,所以這个成做會當執行程式。即,` ENTRYPOINT ` 允准你為容器增加一个入口點。` ENTRYPOINT ` 和 ` CMD ` 類似,攏佇容器咧起動的時陣來執行,猶毋過 ` ENTRYPOINT ` 為著提供穩定而且袂使予人崁的操作。通過佇命令列中指定 `--entrypoint 命令 ` 的方式,通好執行的時將 Dockerfile 檔案中的 ` ENTRYPOINT ` 崁。
  • ` CMD `,是 command 的縮寫。` CMD ` 用佇已經建立的鏡像提供預設的操作,當無想欲用預設的操作的時陣,可用 ` docker run IMAGE [: TAG | @ DIGEST] [COMMAND] ` 進行替換。但是 Dockerfile 有入口的時陣,` CMD ` 用予入去參數。

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 檔案當中閣指定一改。

Compose 檔案會當使用 Shell 變數(Variable), 如:

Compose 檔案會當通過家己的 ` ARGS ` 變數,將參數傳予 Dockerfile 的 ` ARGS ` 指令。

網路

參考文件:Docker 文件-網路概欲

bridge

佇咧 Docker 內底,網橋網路使用的是軟體形式的網橋。使用仝款的網橋的容器連接進入該網路,非該網路的容器鑢故無法度接入去。Docker 網橋驅動會自動地佇咧 Docker 主機頂頭安裝規則,遮的規則予無仝橋接網路之間袂當直接通批。橋接定定用佇:佇咧單獨容器上執行應用的時陣,會當過網橋來進行通信。網橋網路適用於容器執行佇仝款的 Docker 守護行程的主機頂懸。無仝 Docker 守護行程主機頂懸的容器,𪜶之間的通信愛靠作業系統層次的路由,抑是講你應該使用 overlay 網路進行代替。

` bridge ` 是網橋驅動,是 Docker 預設的網路驅動(介面名做 ` docker 零 `), 當你無為容器指定一个網路的時陣,Docker 將會使用伊該驅動。會過 ` daemon . json ` 檔案修改相關組態。

自訂網橋會當通過 ` brctl ` 命令進行組態。

host

主機模式

` host ` 用佇咧單獨容器,該佇網路下跤容器干焦會當參 Docker 主機咧進行直接接。` host ` 干焦適用佇 Docker 十七孵空六抑是講以上版本的 swarm 服務。

host 網路佮 VirtualBox 的干焦主機網路(Host-only Networking)類似。

overlay

` overlay `(中文:崁網路)網路驅動將會建立分散式網路,該當網路會當崁若干焦 Docker 守護行程主機。該網路是對主機特定網路(host-specific networks), 容允 swarm 服務佮容器進行安全通信(當加密功能開啟的時陣)。 佇這个網路下跤,Docker 會當清楚楚的掌握封包的路由以及傳送接收容器。

` overlay ` 有兩種網路類型網路:

  • ` ingress ` 網路,會當掌握 swarm 服務的網路流量。該網路是 ` overlay ` 的預設網路。
  • ` docker _ gwbridge ` 網路是網橋網路。該網路會將單獨的 Docker 守護行程連接至 swarm 里的另外一个守護行程。

佇咧 ` overlay ` 網路下跤,單獨的容器佮 swarm 服務的行為佮組態概念是無仝款的。

該策略無需要容器有作業系統級別的路由,因為乎 Docker 負責路由。

macvlan

` Macvlan ` 網路允准你予容器 MAC 位址,佇網路里內底,容器會予人認為是物理裝置。Docker 守護行程會路由

none

該策略下,容器莫使用任何網路。` none ` 定定用佇連接自訂網路驅動的情況下。

其他

其他第三方外掛程式。

資料管理

Docker 預設之下,所有的檔案共𪜶儲存佇容器里的可寫的容器層(container layer)。

  • 資料佮容器做一體。隨著容器消失,資料將消失;真僫佮其他的程式(容器)共享。
  • 因為容器的寫入層這是佮宿主機器趕緊抹著。所以你誠歹行動資料到其他的機械。
  • 容器的寫入層的是通過儲存驅動(storage driver)管理檔案系統。儲存驅動可以用 Linux 核心的鏈合檔案系統(union filesystem)進行掛載。相比起直接操作佇宿主機器檔案系統的資料卷,這馬外口的抽象層就會降低效能。

容器有兩種永久化儲存方式:卷(volumes)結掛載(bind mounts)。另外咧,Linux 使用者閣會使用 tmpfs 進行掛載;Window 使用者猶閣會使用號名的管道(named pipe)。佇容器內底,不管是佗一種永久化儲存,表現形式攏是仝款的。

卷(volumes)是宿主機器的檔案系統的一部分,由 Docker 進行管理(佇咧 Linux,儲存佇咧 ` / var / lib / docker / volumes / `)。 非 Docker 程式無應該去改改遮的檔案。Docker 推薦使用卷進行持久化資料。卷會當支援卷驅動(volume drivers), 應該趕緊使用者共資料儲存到遠端主機抑是雲服務商(cloud provider)抑是按怎。

無名的卷叫匿名的卷(anonymous volume), 有名的卷叫號名的卷(named volume)。 無名卷無明確的名,當初予初化的時,會去予人一个隨機名。

結掛載

結掛載(bind mounts)通過共宿主機器的路徑掛載到容器里的這種方式,對資料一直畫,因此結掛載會當共資料儉佇咧宿主機器的檔案系統的任何所在。非 Docker 程式會當修改遮的檔案。結掛載是 Docker 早期就存在的,相比起卷,結掛載十分簡單明矣。咧開發 Docker 應用的時,應使用號名卷(named volume)代替結結掛載,因為使用者袂當對結結掛載進行 Docker CLI 命令操作。

結掛載定定用於:

  • 同步設定檔,如:將宿主機的 DNS 設定檔(` / etc / resolv . conf `)仝步至容器當中
  • 佇開發程式的時陣,將原始抑是 Artifact 仝步至容器當中。這種的用法佮 Vagrant 類似。

tmpfs

` tmpfs ` 掛載(tmpfs mounts), 干焦儲存佇記憶內底,並無操作宿主機器的檔案系統(無持久化佇磁碟)。 伊會當用久加儉一寡非常久化的狀態、敏感資料。舉例,swarm 服務通過 ` tmpfs ` 將 secrets(密碼、金鎖、憑證等)儉到 swarm 服務。

號名的管道

號名的管道(named pipes), 通過 ` npipe ` 掛載的形式,使 Docker 主機佮容器之間會當互相通訊。捷看用例是佇容器內底執行第三方工具,閣使用號名的管道連接著 Docker Engine API。

崁問題

做載空的卷到一个 kha-tá-lok-guh 中,kha-tá-lok-guh 中的內容會去予人複製佇咧卷內底(袂崁蓋)。 若掛載非空的卷抑是結掛載至一个 kha-tá-lok-guh 中,若按呢該 kha-tá-lok-guh 的內容將會予人掩崁(obscured), 當解除安裝了後內容會恢復顯示。

紀錄檔

佇咧 UNIX 佮類 Unix 系統當中,捷看著的 I / O 流(英語:I / O streams)分做三種:` STDIN `(輸入)、 ` STDOUT `(正常輸出)、 ` STDERR `(錯誤輸出)。

預設組態下,Docker 的紀錄檔(如:` docker logs `、` docker service log `)所記載的是彼个命令列的輸出結果(` STDOUT ` 和 ` STDERR `)。 而且 ` STDOUT ` 和 ` STDERR ` 對應的檔案路徑分別是 ` / dev / stderr ` 和 ` / dev / stdout `。另外咧,嘛會當佇宿主機頂懸檢視容器的紀錄檔,使用下命令會使巡視著容器的紀錄檔位置。

Kubernetes in docker

kind(全稱:Kubernetes IN Docker)是部署本地 Kubernetes 密集的工具,發展甲誠好的節點是由 Docker 生成的。

操作細節

佇安裝了 kind 了後,通過 ` kind create cluster ` 命令生做密集。生成 Kubernetes 抾倚來了後,會當通過 Docker 命令進行檢視節點概覽:

歷史

Docker 命令佇過去的發展中誕生了四十種以上的命令,傷濟的命令致使混亂以及難以使用 tab 自動補充,所以佇遮 docker 一孵一三版本(二千空一十七孵一 . 十九)中,命令列被重構,根據邏輯物件進行劃分。官方建議使用者使用新的語法進行操作。

已經過時

Docker Swarm

參考 Swarm Mode 章節。

Docker Machine

Docker Machine 是一个工具,伊允准你佇虛擬宿主機頂安裝 Docker ia̋n-jín,並使用 docker-machine 命令管理遮的宿主機。你會使用 Machine 佇你原生的 Mac 抑是 Windows box、公司網路、資料中心、抑是像 AWS 抑是 Digital Ocean 按呢的雲提供商上建立 Docker 宿主機。

Docker Machine 最後更新時間是佇咧零仙一六 . 零 ( 二千空一十八分十一分八 ) 版本。官方建議佇一鋪一二以及了後版本使用 Docker Desktop for Mac 和 Docker Desktop for Windows 進行代替。

Docker Toolbox

Docker Toolbox 是用於幫 Windows 系統佮 Mac 系統安裝 Docker 環境。新版本建議使用 Docker Desktop for Mac 和 Docker Desktop for Windows 來做安裝。最後更新版本是十九孵空三 . 一 ( 二千空一十九九九分八學一 )。

安全性爭議

二空二一年,安全公司 Palo Alto Networks 研究人員 Aviv Sasson,佇咧 Docker Hub 上發現的惡意容器影像檔,分別來自十个無仝數號,總下載次數超過兩千萬次,其中內底有含的挖礦軟體。

參考文獻

外部連結

  • 官方網站
  • Source code repository
  • Multi-tenancy using Docker
  • Docker 一百空一 Tutorial
  • libcontainer git repo
  • 按怎佇咧 Linux 下安裝 Docker
  • Windows 容器-佇咧 Windows 十部署 Docker

參見

  • 作業系統層虛擬化
  • cgroups
  • LXC
  • Dotcloud