Docker

Docker是一個開放原始碼的開放平臺軟體，用於開發應用、交付，從而提高交付軟體的速度。Docker容器與虛擬機器類似，但二者在原理上不同。容器是將作業系統層虛擬化，虛擬機器則是虛擬化硬體，因此容器更具有便攜性、更能高效地利用伺服器。 容器更多的用於表示軟體的一個標準化單元。由於容器的標準化，因此它可以無視基礎設施的差異，部署到任何一個地方。另外，Docker也為容器提供更強的業界的隔離相容。Docker 利用Linux核心中的資源分離機制，例如cgroups，以及Linux核心。這可以在單一Linux實體下運作，避免啟動一個虛擬機器造成的額外負擔。Linux核心對名稱空間的支援完全隔離了工作環境中應用程式的視野，包括行程樹、網路、使用者ID與掛載檔案系統，而核心的cgroup提供資源隔離，包括CPU、記憶體、block I/O與網路。從0.9版本起，Dockers在使用抽象虛擬是經由libvirt的LXC與systemd - nspawn提供介面的基礎上，開始包括libcontainer函式庫做為以自己的方式開始直接使用由Linux核心提供的虛擬化的設施。基礎架構.專業名詞Docker有兩個意思：Docker引擎.Docker引擎(Docker Engine)是一個服務端-客戶端結構的應用，主要有這些部分：Docker守護程序、Docker Engine API、Docker客戶端。Docker註冊中心.Docker註冊中心(Docker registry)是用於儲存Docker的映象。Docker Hub 是一個公共的註冊中心，任何人都可以使用，預設配置下，Docker將會在這裡尋找映象。另外，使用者可以自行構建私有註冊中心。Docker Datacenter (DDC)的使用者，可以直接使用 Docker Trusted Registry (DTR)。2023年5月，在中國大陸地區被防火牆阻斷遮蔽。物件.Docker的物件是指Images、Containers、Networks、Volumes、Plugins等等。擴充套件架構.Docker Compose.Compose可譯為組合物。Compose 是用於定義和執行 多個容器Docker應用程式 的工具。透過Compose，你可以使用YAML檔案來配置應用程式需要的所有服務，然後透過使用一個命令，就可以建立並啟動所有服務。Compose對應的命令為codice_5。Swarm Mode.當說到 Docker Swarm 時，一般是指單獨專案 Docker Swarm。而在Docker 1.12時，將swarm mode整合到Docker 引擎中，可用Docker引擎API 和 CLI 命令直接使用。官方推薦使用者使用整合的 swarm mode 。Swarm Mode 內建 kv 儲存功能，提供了眾多的新特性，比如：具有容錯能力的去中心化設計、內建服務發現、負載均衡、路由網格、動態伸縮、滾動更新、安全傳輸等。使得 Docker 原生的 codice_6 叢集具備與 Mesos、Kubernetes 競爭的實力。cluster(中文：叢集)，Docker將叢集定義為：一群共同作業並提供高可用性的機器 。swarm(中文：群)，是指一個叢集的Docker引擎以swarm mode形式執行。swarm mode是指Docker引擎內嵌的叢集管理和編排功能。當你初始化了一個swarm(cluster)或者將節點加入一個swarm時，其Docker引擎就會以swarm mode的形式執行。原理.swarm中的Docker機器中分為 managers是指：被swarm管理者管理的一個執行中的容器。swarm服務比單獨容器好在，修改swarm服務的配置之後不用重啟。同時，Docker以swarm mode形式執行時，也可以選擇直接啟動單獨的容器。另外，swarm mode下，你也可以透過 codice_7 使用 Compose file 部署應用棧。 swarm服務分為兩種，一種是replicated services ，可以指定節點任務的總數量；global services，則是每個節點都會執行一個指定任務。 swarm管理員使用 ingress 負載均衡使服務可被外部接觸。 swarm管理員會自動地給服務分配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 是包含著使用者想要如何構建映象的所有命令的文字。FROM ubuntu:18.04COPY . /appRUN make /appCMD python /app/app.py關鍵詞：Compose檔案.Compose檔案 是一個YAML檔案，定義了服務。codice_23 命令中有一些選項，和 Dockerfile檔案中的指令效果一樣，如果Dockerfile檔案中使用這些指令，那麼這些指令就會被視為預設引數，所以開發者無需特意在 Compose檔案中再指定一次。Compose檔案 可使用 Shell變數，如：db:image: "postgres:${POSTGRES_VERSION}"Compose檔案 可透過自身的codice_31變數，將引數傳給Dockerfile的 codice_31 指令。網路.參考文件：Docker文件-網路概要bridge.在Docker裡，網橋網路 使用的是 軟體形式的網橋。使用相同的網橋的容器連線進入該網路，而非該網路的容器刷故無法接入。Docker網橋驅動會自動地在Docker主機上安裝規則，這些規則讓不同橋接網路之間不能直接通訊。 橋接經常用於：在單獨容器上執行應用時，可透過 網橋 進行通訊。 網橋網路 適用於容器執行在相同地Docker守護程序的主機上。不同Docker守護程序主機上的容器，它們之間的通訊需要依靠作業系統層次的路由，或者你應該使用 overlay網路 進行代替。codice_33 是網橋驅動，是Docker預設的網路驅動，當你不為容器指定一個網路時候，Docker將會使用該驅動。 可透過 codice_35 檔案修改相關配置。自定義網橋可透過 codice_36 命令進行配置。host.主機模式codice_37 用於單獨容器，該網路下容器只能和Docker主機進行直接連線。codice_37 只適用於 Docker 17.06或以上版本的swarm服務。host網路和VirtualBox的 僅主機網路 類似。overlay.codice_39 。在該網路下，Docker能夠清晰地掌握 資料包的路由 以及 傳送接收容器。codice_39 有兩種網路型別網路：在 codice_39 網路下，單獨的容器 和 swarm服務 的行為和配置概念 是不一樣的。該策略不需要 容器們 具有作業系統級別的路由，因為Docker負責路由。macvlan.codice_45 網路允許你賦予容器 MAC地址 ，在該網路裡，容器會被認為是物理裝置。Docker守護程序會路由none.該策略下，容器不使用任何網路。codice_46 常常用於連線自定義網路驅動的情況下。其他.截止2023年5月18日，Docker官方倉庫域名 https://hub.docker.com/  在中國大陸被遮蔽，方式為DNS汙染。資料管理.Docker預設下，所有檔案將會儲存在容器裡的可寫的容器層。容器有兩種永久化儲存方式：卷。在容器中，不管是哪種永久化儲存，表現形式都是一樣的。卷.卷或 其他。沒有名字的卷叫匿名卷。匿名卷沒有明確的名字，當被初始化時，會被賦予一個隨機名字。繫結掛載.繫結掛載代替繫結掛載，因為使用者不能對繫結掛載進行 Docker CLI 命令操作。繫結掛載常用於：tmpfs.codice_49 掛載儲存到swarm服務。命名管道.命名管道，透過 codice_51 掛載的形式，使 Docker主機 和 容器 之間能互相通訊。常見用例是在容器內執行第三方工具，並使用命名管道連線到Docker Engine API。覆蓋問題.當掛載 空的卷 至一個目錄中，目錄中的內容會被複制於卷中，當解除安裝後內容將會恢復顯示。日誌.在UNIX和類Unix系統中，常見的 I/O流。預設配置下，Docker的日誌。而codice_53 和 codice_54 對應的檔案路徑分別是 codice_61和codice_62。 另外，也可以在宿主主機上檢視容器的日誌，使用以下命令可以檢視到容器的日誌位置。$ docker inspect --format=" $INSTANCE_IDKubernetes in docker.kind是部署本地Kubernetes叢集的工具，而叢集的節點是由Docker生成的。操作細節.在安裝完kind之後，透過codice_63命令生成叢集。 生成Kubernetes集群后，可以透過Docker命令進行檢視節點概覽：$ docker container lsCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES99c96c1f21ab kindest/node:v1.17.0 "/usr/local/bin/entr…" 4 minutes ago Up 4 minutes 127.0.0.1:32769-&gt;6443/tcp kind-control-plane歷史.Docker命令在過去的發展中誕生了40種以上的命令，過多的命令導致混亂以及難以使用tab自動補充，因此在docker 1.13版本中，命令列被重構，根據邏輯物件進行劃分。官方建議使用者使用新的語法進行操作。已過時.Docker Swarm.參考Swarm Mode章節。Docker Machine.Docker Machine 是一個工具，它允許你在虛擬宿主機上安裝 Docker引擎，並使用 docker-machine 命令管理這些宿主機。你可以使用 Machine 在你本地的 Mac 或 Windows box、公司網路、資料中心、或像 AWS 或 Digital Ocean 這樣的雲提供商上建立 Docker 宿主機。Docker Machine 最後更新時間是在0.16.0 (2018-11-08)版本。官方建議在1.12以及之後版本使用Docker Desktop for Mac和Docker Desktop for Windows進行代替。Docker Toolbox.Docker Toolbox是用於幫 Windows系統和Mac系統 安裝Docker環境。新版本建議使用Docker Desktop for Mac和Docker Desktop for Windows進行安裝。最後更新版本是 19.03.1(2019-08-01)。安全性爭議.2021年，安全公司Palo Alto Networks研究人員Aviv Sasson，在Docker Hub上發現的惡意容器映像檔，分別來自10個不同帳號，總下載次數超過2000萬次，其中內含的挖礦軟體。