你好,這裡是網絡技術聯盟站,我是瑞哥。
Docker,這個字眼大家不陌生吧,不過作為網絡工程師可能平時接觸不到,如果在看文章的是運維人員,那麼70%以上的運維人員都會跟Docker打交道。即使網工用不到,作為非常火爆熱門的技術,也希望大家能堅持看50%的文章,熏陶一下技術。
Docker由Solomon Hykes于2013年推出,最初是一個開源項目,旨在簡化開發人員在開發、測試和生産環境中部署應用程式的過程。Docker通過容器技術提供了一種輕量級的虛拟化解決方案,使應用程式可以在任何環境中一緻地運作。随着Docker的普及,DevOps和雲計算領域的工作方式發生了深刻變化,Docker已成為現代軟體開發和部署的重要工具。
在現代軟體開發中,快速疊代和持續傳遞變得至關重要。Docker的出現使得開發人員可以輕松建立、共享和運作應用程式,進而提高了開發效率,降低了環境不一緻性帶來的問題。此外,Docker的隔離特性增強了系統的安全性和穩定性,使其在微服務架構和雲原生應用中得到了廣泛應用。
如果已經有Docker基礎的朋友,可以直接滑到最後總結部分進行查漏補缺!
容器技術
容器與虛拟機的差別
- 虛拟機 (VM)
- VM包含完整的作業系統,并在虛拟化層之上運作多個作業系統執行個體。
- VM需要更多的系統資源(CPU、記憶體、存儲)來管理這些作業系統執行個體。
- 容器 (Container)
- 容器共享主機作業系統的核心,具有獨立的檔案系統、程序和網絡空間。
- 容器更輕量級,啟動速度快,占用資源少。
特性 | 虛拟機 | 容器 |
啟動時間 | 幾分鐘 | 幾秒 |
資源開銷 | 高(包含作業系統核心) | 低(共享主機作業系統核心) |
性能 | 中等 | 高(更接近主機性能) |
隔離級别 | 強(完全隔離) | 較弱(共享核心) |
适用場景 | 多種作業系統和更高安全隔離需求 | 快速部署、微服務、開發測試等 |
容器化的優點
- 快速啟動:容器可以在幾秒鐘内啟動,提高了開發和部署效率。
- 輕量級:容器共享主機作業系統核心,占用更少的系統資源。
- 一緻性:確定應用程式在開發、測試和生産環境中的行為一緻,減少“環境問題”。
- 便捷性:容器化應用可以打包成獨立的單元,便于分發、複制和管理。
- 可移植性:容器化應用可以在任何支援Docker的平台上運作,無需修改代碼。
Docker的基本概念
鏡像 (Image)
Docker鏡像是一個輕量級、獨立、可執行的軟體包,包含了運作某個應用程式所需的全部内容,包括代碼、運作時、庫、環境變量和配置檔案。鏡像是隻讀的,當容器啟動時,Docker會在鏡像的頂部添加一個可寫層。
容器 (Container)
容器是鏡像的一個運作執行個體,它包括了鏡像中的所有内容以及一個可寫層。容器是獨立的、可移植的單元,可以在任何支援Docker的平台上運作。
倉庫 (Repository)
Docker倉庫是存儲和分發鏡像的地方。Docker Hub是官方的公共倉庫,使用者也可以搭建私有倉庫來存儲自己的鏡像。倉庫中可以包含多個鏡像,每個鏡像可以有不同的标簽(Tag)。
Docker引擎 (Docker Engine)
Docker引擎是一個輕量級的運作時和工具集,用于建立和管理容器。它包括以下元件:
- Docker守護程序 (Docker Daemon):負責管理容器的生命周期。
- Docker CLI (指令行界面):用于與Docker守護程序互動的指令行工具。
- Docker Registries (鏡像倉庫):存儲和分發Docker鏡像。
Docker架構
Docker用戶端與服務端
Docker采用了用戶端-服務端(Client-Server)架構,用戶端通過Docker CLI與服務端的Docker守護程序通信。Docker CLI發送指令給Docker守護程序,後者負責執行這些指令(如建構、運作和分發容器)。
Docker的元件
- Docker守護程序 (Docker Daemon):背景程序,負責管理Docker對象(如鏡像、容器、網絡和卷)。
- Docker CLI:指令行工具,使用者通過它與Docker守護程序通信。
- Docker Registries:存儲和分發Docker鏡像的地方,包含公共的Docker Hub和私有的Docker Registry。
安裝Docker
- Windows
- 下載下傳并安裝Docker Desktop for Windows。
- 啟動Docker Desktop并進行基本配置。
- 驗證安裝:在指令行中運作docker --version。
- macOS
- 下載下傳并安裝Docker Desktop for Mac。
- 啟動Docker Desktop并進行基本配置。
- 驗證安裝:在終端中運作docker --version。
- Linux
- 以Ubuntu為例:
- 更新APT包索引:sudo apt-get update
- 安裝必要的包:sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common
- 添加Docker的官方GPG密鑰:curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
- 設定Docker的穩定版倉庫:sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
- 安裝Docker Engine:sudo apt-get update && sudo apt-get install docker-ce docker-ce-cli containerd.io
- 驗證安裝:sudo docker --version
Docker鏡像
Docker鏡像是建構容器的基礎,它包含了應用程式運作所需的所有依賴和配置。鏡像是不可變的,每次運作鏡像時都會生成一個新的容器執行個體。
常見的Docker鏡像源包括:
- Docker Hub:最廣泛使用的公共鏡像庫,包含了大量官方和社群維護的鏡像。
- 私有鏡像庫:使用者可以搭建自己的Docker Registry來存儲和管理私有鏡像。
Docker鏡像的基礎操作
拉取鏡像 (docker pull)
docker pull指令用于從鏡像倉庫拉取鏡像。文法如下:
docker pull <鏡像名>:<标簽>
例如,拉取官方的nginx鏡像:
docker pull nginx:latest
檢視鏡像 (docker images)
docker images指令用于列出本地存儲的所有Docker鏡像。文法如下:
docker images
示例輸出:
删除鏡像 (docker rmi)
docker rmi指令用于删除本地的Docker鏡像。文法如下:
docker rmi <鏡像ID或鏡像名>:<标簽>
例如,删除nginx鏡像:
docker rmi nginx:latest
建構Docker鏡像
Dockerfile是一個文本檔案,包含了建構Docker鏡像所需的一系列指令。每個指令在建構過程中建立鏡像的一層。常用的Dockerfile指令包括:
- FROM:指定基礎鏡像
- RUN:在鏡像内執行指令
- COPY:将檔案從主控端複制到鏡像内
- CMD:指定容器啟動時要執行的指令
Dockerfile指令
- FROM
FROM ubuntu:20.04
指定基礎鏡像為Ubuntu 20.04。
- RUN
RUN apt-get update && apt-get install -y nginx
在鏡像内執行指令,安裝nginx。
- COPY
COPY . /app
将目前目錄下的所有檔案複制到鏡像内的/app目錄。
- CMD
CMD ["nginx", "-g", "daemon off;"]
指定容器啟動時執行的指令。
建構鏡像 (docker build)
docker build指令用于根據Dockerfile建構鏡像。文法如下:
docker build -t <鏡像名>:<标簽> <Dockerfile路徑>
例如,建構一個名為mynginx的鏡像:
docker build -t mynginx:latest .
優化Docker鏡像
多階段建構
多階段建構可以在一個Dockerfile中使用多個FROM指令,減少最終鏡像的大小。例如:
# 第一階段:建構應用程式
FROM golang:1.16 as builder
WORKDIR /app
COPY . .
RUN go build -o myapp
# 第二階段:建立最終鏡像
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
鏡像瘦身技巧
- 使用輕量級基礎鏡像:如Alpine Linux。
- 減少鏡像層數:合并多個RUN指令。
- 清理不必要的檔案:在Dockerfile中删除臨時檔案。
管理鏡像
标簽用于辨別鏡像的不同版本。通過标簽,使用者可以友善地管理和拉取特定版本的鏡像。例如:
docker tag nginx:latest mynginx:v1.0
通過合理使用标簽和版本控制系統(如Git),可以有效管理鏡像的不同版本,確定應用程式在各個環境中的一緻性。
Docker容器
Docker容器是運作在Docker引擎上的獨立運作環境。每個容器都是從一個鏡像啟動的,并在鏡像的基礎上添加一個可寫層。容器提供了應用程式的隔離環境,使其運作所需的所有依賴和配置都封裝在容器内。
鏡像是靜态的檔案系統和應用程式配置的組合,而容器是鏡像的運作執行個體。當我們啟動一個容器時,Docker會在鏡像的基礎上建立一個可寫層,進而使容器變得可操作。鏡像可以被多次使用來建立多個容器。
Docker容器的基本操作
建立并啟動容器 (docker run)
docker run指令用于建立并啟動一個容器。文法如下:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
例如,運作一個nginx容器:
docker run -d -p 80:80 nginx
此指令會下載下傳nginx鏡像(如果本地沒有),然後在背景運作一個nginx容器,并将主機的80端口映射到容器的80端口。
停止與重新開機容器 (docker stop, docker start)
- 停止容器
docker stop <容器ID或容器名>
例如,停止一個名為mynginx的容器:
docker stop mynginx
- 重新開機容器
docker start <容器ID或容器名>
例如,重新開機mynginx容器:
docker start mynginx
進入容器 (docker exec, docker attach)
- 使用docker exec進入容器
docker exec指令用于在運作的容器内執行指令。文法如下:
docker exec -it <容器ID或容器名> <指令>
例如,進入一個正在運作的容器的bash環境:
docker exec -it mynginx /bin/bash
- 使用docker attach連接配接到容器
docker attach指令用于連接配接到一個運作中的容器。文法如下:
docker attach <容器ID或容器名>
例如,連接配接到mynginx容器:
docker attach mynginx
容器的生命周期管理
容器的狀态管理
- 檢視運作中的容器
docker ps
該指令列出所有正在運作的容器。
- 檢視所有容器(包括停止的)
docker ps -a
- 删除容器
docker rm <容器ID或容器名>
例如,删除mynginx容器:
docker rm mynginx
持久化存儲 (Volumes)
Docker容器中的資料預設是臨時的,當容器删除時,資料也随之删除。為了持久化資料,我們可以使用卷(Volumes)。
- 建立卷
docker volume create <卷名>
例如,建立一個名為myvolume的卷:
docker volume create myvolume
- 使用卷
在運作容器時挂載卷:
docker run -d -p 80:80 -v myvolume:/data nginx
該指令将myvolume挂載到容器内的/data目錄。
- 檢視卷
docker volume ls
- 删除卷
docker volume rm <卷名>
容器網絡
Docker的網絡模式
Docker提供了多種網絡模式,用于配置容器之間的通信。
- 橋接網絡 (Bridge Network)
預設網絡模式。每個容器連接配接到一個橋接網絡,可以通過容器IP進行通信。
docker run --network bridge <鏡像>
- 主機網絡 (Host Network)
容器與主機共享網絡棧。
docker run --network host <鏡像>
- 無網絡 (None Network)
容器不連接配接到任何網絡。
docker run --network none <鏡像>
自定義網絡
- 建立自定義橋接網絡
docker network create <網絡名>
例如,建立一個名為mynetwork的自定義橋接網絡:
docker network create mynetwork
- 将容器連接配接到自定義網絡
docker run --network mynetwork <鏡像>
容器間通信
通過自定義網絡,可以使用容器名直接進行通信。例如,在mynetwork中運作兩個容器,一個容器可以通過另一個容器的名字進行通信:
docker run -d --network mynetwork --name container1 nginx
docker run -d --network mynetwork --name container2 nginx
此時,container2可以通過ping container1與container1通信。
容器日志與調試
容器日志檢視 (docker logs)
docker logs指令用于檢視容器的日志。文法如下:
docker logs <容器ID或容器名>
例如,檢視mynginx容器的日志:
docker logs mynginx
容器調試技巧
- 檢視容器内程序
docker top <容器ID或容器名>
- 檢查容器的資源使用情況
docker stats <容器ID或容器名>
- 導出容器的中繼資料
docker inspect <容器ID或容器名>
Docker倉庫與Docker Hub
Docker倉庫用于存儲和分發Docker鏡像,友善開發團隊之間共享應用程式。Docker倉庫分為公共倉庫和私有倉庫。公共倉庫如Docker Hub,提供了大量的開源鏡像資源;私有倉庫則用于存儲企業内部的專有鏡像,保障安全和合規。
Docker Hub是最廣泛使用的Docker公共倉庫,提供了海量的官方和社群鏡像。使用者可以從Docker Hub拉取、推送鏡像,并使用Docker Hub的CI/CD內建功能。
使用Docker Hub
建立Docker Hub賬戶
- 通路 Docker Hub https://hub.docker.com。
- 點選“Sign Up”按鈕進行注冊。
- 填寫相關資訊并完成賬戶注冊。
登入Docker Hub
在指令行中使用docker login指令登入Docker Hub:
docker login
輸入Docker Hub的使用者名和密碼即可完成登入。
拉取鏡像 (docker pull)
從Docker Hub拉取鏡像非常簡單,使用docker pull指令:
docker pull <鏡像名>:<标簽>
例如,拉取官方的Python鏡像:
docker pull python:3.9
推送鏡像 (docker push)
要推送鏡像到Docker Hub,首先需要給鏡像打标簽,然後推送:
- 給鏡像打标簽:
docker tag <本地鏡像ID或名稱>:<标簽> <Docker Hub使用者名>/<鏡像名>:<标簽>
例如,将本地鏡像myapp打标簽為Docker Hub的myapp:
docker tag myapp:latest myusername/myapp:latest
- 推送鏡像:
docker push <Docker Hub使用者名>/<鏡像名>:<标簽>
例如,推送myapp鏡像:
docker push myusername/myapp:latest
管理鏡像庫
在Docker Hub網站上可以管理自己的鏡像庫,包括建立新的倉庫、設定倉庫的可見性(公共或私有)、檢視鏡像的詳細資訊和下載下傳次數等。
私有Docker倉庫
搭建私有倉庫
Docker官方提供了一個開源的私有倉庫實作——Docker Registry。可以使用官方的Registry鏡像快速搭建一個私有倉庫。
- 拉取Registry鏡像:
docker pull registry:2
- 運作Registry容器:
docker run -d -p 5000:5000 --name myregistry registry:2
此時,私有倉庫将運作在本地主機的5000端口。
推送和拉取私有倉庫的鏡像
- 給鏡像打标簽:
docker tag <本地鏡像ID或名稱>:<标簽> localhost:5000/<鏡像名>:<标簽>
例如,将本地鏡像myapp打标簽為私有倉庫的myapp:
docker tag myapp:latest localhost:5000/myapp:latest
- 推送鏡像:
docker push localhost:5000/myapp:latest
- 拉取鏡像:
docker pull localhost:5000/myapp:latest
安全性配置
為了提高私有倉庫的安全性,可以啟用SSL/TLS和基礎認證。
- 啟用SSL/TLS
需要生成自簽名證書或從CA獲驗證書,并配置Registry容器使用這些證書。
生成自簽名證書:
mkdir -p certs
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt
啟動Registry容器時挂載證書:
docker run -d -p 5000:5000 --name myregistry \
-v $(pwd)/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry:2
- 啟用基礎認證
需要建立一個包含使用者名和密碼的htpasswd檔案,并配置Registry容器使用這個檔案。
安裝htpasswd工具:
sudo apt-get install apache2-utils
建立htpasswd檔案:
mkdir -p auth
htpasswd -Bc auth/htpasswd myusername
啟動Registry容器時挂載htpasswd檔案:
docker run -d -p 5000:5000 --name myregistry \
-v $(pwd)/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" \
registry:2
Docker倉庫的進階功能
自動建構
Docker Hub提供了自動建構功能,可以與GitHub或Bitbucket內建,當代碼庫有新的送出時自動建構并推送鏡像。
- 設定自動建構
- 在Docker Hub上建立新的倉庫,選擇自動建構。
- 連接配接到GitHub或Bitbucket,選擇代碼庫和分支。
- 配置Dockerfile的路徑和建構規則。
Webhooks
Webhooks允許Docker Hub在鏡像建構完成後向指定的URL發送HTTP請求,用于觸發後續的CI/CD流程。
- 配置Webhooks
- 在Docker Hub倉庫的設定頁面,找到Webhooks。
- 添加新的Webhook,填寫目标URL。
鏡像掃描
Docker Hub提供了鏡像掃描功能,可以掃描鏡像中的已知漏洞,幫助提高應用程式的安全性。
- 啟用鏡像掃描 在Docker Hub倉庫的設定頁面,啟用鏡像掃描功能。每次推送新鏡像時,Docker Hub将自動進行安全掃描,并提供掃描報告。
Docker Compose
Docker Compose 是用于定義和運作多容器Docker應用程式的工具。通過一個簡單的YAML檔案,使用者可以配置應用程式需要的所有服務,并使用單個指令啟動和停止這些服務。Compose 是開發、測試和部署微服務架構應用的利器。
Docker Compose 通常與Docker一起安裝,但也可以單獨安裝。以下是在不同平台上的安裝步驟:
- Linux:
sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
- MacOS: 使用 Homebrew 安裝
brew install docker-compose
- Windows: Docker Desktop 自帶Docker Compose,安裝 Docker Desktop 即可。
Docker Compose的基本概念
服務(Services)
在Docker Compose中,服務定義了一個容器的配置。一個服務可以是資料庫、Web伺服器等。Compose檔案通過services關鍵字定義多個服務,每個服務對應一個容器。
網絡(Networks)
Compose允許定義多個網絡,服務可以連接配接到這些網絡中進行通信。預設情況下,Compose會為所有服務建立一個預設網絡。
卷(Volumes)
卷用于持久化存儲。Compose允許定義卷,并将其挂載到服務的容器中。
Docker Compose檔案格式
一個簡單的docker-compose.yml檔案示例如下:
version: '3'
services:
web:
image: nginx
ports:
- "80:80"
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
版本(Version)
Compose檔案的版本定義了文法的格式,不同版本支援的功能有所不同。建議使用最新的版本(如3或3.8)。
version: '3.8'
服務配置詳解
- image: 指定使用的鏡像
- build: 指定建構鏡像的上下文路徑和Dockerfile
- ports: 端口映射
- environment: 環境變量
- volumes: 卷的挂載
services:
web:
image: nginx
ports:
- "80:80"
volumes:
- ./html:/usr/share/nginx/html
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db_data:/var/lib/mysql
網絡配置
預設情況下,所有服務都連接配接到一個名為default的網絡。可以定義自定義網絡:
networks:
frontend:
backend:
并将服務連接配接到這些網絡:
services:
web:
networks:
- frontend
db:
networks:
- backend
卷配置
在Compose檔案中可以定義卷:
volumes:
db_data:
并将其挂載到服務的容器中:
services:
db:
volumes:
- db_data:/var/lib/mysql
Docker Compose的基本操作
啟動和停止服務 (docker-compose up, docker-compose down)
- 啟動服務:
docker-compose up
該指令将啟動Compose檔案中定義的所有服務,并在控制台中輸出日志。
- 背景運作服務:
docker-compose up -d
- 停止服務:
docker-compose down
檢視服務狀态 (docker-compose ps)
docker-compose ps指令用于檢視目前運作的服務狀态:
docker-compose ps
重新開機服務 (docker-compose restart)
docker-compose restart指令用于重新開機服務:
docker-compose restart <服務名>
檢視服務日志 (docker-compose logs)
docker-compose logs指令用于檢視服務的日志:
docker-compose logs <服務名>
Docker Compose的進階功能
多環境配置
通過使用多個Compose檔案,可以為不同的環境(如開發、測試、生産)定義不同的配置。
- 基礎Compose檔案 (docker-compose.yml):
version: '3.8'
services:
web:
image: nginx
ports:
- "80:80"
- 覆寫Compose檔案 (docker-compose.override.yml):
version: '3.8'
services:
web:
environment:
- NGINX_ENV=development
- 啟動服務時,會自動應用覆寫檔案:
docker-compose up
- 自定義環境Compose檔案:
例如,為生産環境建立docker-compose.prod.yml:
version: '3.8'
services:
web:
environment:
- NGINX_ENV=production
啟動時指定環境檔案:
docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d
擴充服務
通過scale選項可以擴充服務的副本數量,用于負載均衡和高可用。
- 擴充服務副本:
docker-compose up -d --scale web=3
以上指令将啟動3個web服務的副本。
依賴管理
可以通過depends_on選項管理服務啟動的依賴關系。例如,web服務依賴于db服務:
services:
web:
image: nginx
depends_on:
- db
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
假設我們要建構一個簡單的Web應用程式,包括一個前端服務(使用nginx)、一個後端服務(使用Node.js)和一個資料庫服務(使用MySQL)。
建立一個docker-compose.yml檔案,定義前端、後端和資料庫服務:
version: '3.8'
services:
frontend:
image: nginx:latest
ports:
- "80:80"
volumes:
- ./frontend:/usr/share/nginx/html
networks:
- app-network
backend:
build:
context: ./backend
dockerfile: Dockerfile
ports:
- "3000:3000"
networks:
- app-network
db:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: example
MYSQL_DATABASE: appdb
volumes:
- db_data:/var/lib/mysql
networks:
- app-network
networks:
app-network:
volumes:
db_data:
建立必要的目錄和檔案:
- 前端目錄結構:
frontend/
└── index.html
- 後端目錄結構:
backend/
├── Dockerfile
└── app.js
編寫前端的index.html:
<!DOCTYPE html>
<html>
<head>
<title>My App</title>
</head>
<body>
<h1>Hello from Nginx</h1>
</body>
</html>
編寫後端的Dockerfile:
FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
編寫後端的app.js:
const express = require('express');
const app = express();
const port = 3000;
app.get('/', (req, res) => {
res.send('Hello from Node.js');
});
app.listen(port, () => {
console.log(`Server is running on http://localhost:${port}`);
});
啟動應用:
docker-compose up -d
此時,應用的前端服務通過http://localhost通路,後端服務通過http://localhost:3000通路。
Docker Swarm
Docker Swarm是Docker原生的容器編排工具,用于在多主機上管理和編排Docker容器。Swarm叢集由多個Docker引擎組成,提供了高可用性、擴充性和負載均衡等功能。使用Swarm,開發者可以像管理單個Docker執行個體一樣,管理整個叢集中的多個節點和容器。
Docker Swarm和Kubernetes是兩種主要的容器編排工具。Swarm內建在Docker中,使用簡單,适合中小型項目;Kubernetes功能強大,适合大規模複雜應用。根據項目需求選擇合适的編排工具,是提升開發和運維效率的關鍵。
Docker Swarm的基本概念
節點(Nodes)
Swarm叢集由多個節點組成。每個節點都是一個運作Docker的主機,分為管理節點(Manager Node)和工作節點(Worker Node)。管理節點負責叢集管理和任務排程,工作節點負責實際運作容器。
服務(Services)
服務是Swarm管理的基本機關。服務定義了應用程式的容器鏡像、運作參數和數量。Swarm會根據服務定義在叢集中部署和管理容器。
任務(Tasks)
任務是服務的具體執行個體。每個任務對應一個運作中的容器,Swarm負責排程和管理任務,確定服務的高可用性和負載均衡。
堆棧(Stacks)
堆棧是由多個服務組成的應用程式。使用堆棧,開發者可以定義和管理整個應用的服務、網絡和卷。堆棧檔案類似于Compose檔案,但适用于Swarm叢集。
設定和管理Docker Swarm叢集
初始化Swarm叢集
在主機上初始化Swarm叢集,使用docker swarm init指令:
docker swarm init --advertise-addr <管理節點IP>
初始化成功後,指令行會輸出加入Swarm叢集的指令和token。
加入和離開Swarm叢集
在工作節點上,使用docker swarm join指令加入叢集:
docker swarm join --token <worker-token> <管理節點IP>:2377
使用docker swarm leave指令離開叢集:
docker swarm leave
在管理節點上使用docker swarm leave --force指令強制離開并停止叢集:
docker swarm leave --force
管理節點和角色
- 檢視節點清單:
docker node ls
- 提升節點為管理節點:
docker node promote <節點ID>
- 降級管理節點為工作節點:
docker node demote <節點ID>
建立和管理Swarm服務
建立服務
使用docker service create指令建立服務:
docker service create --name <服務名> --replicas <副本數量> <鏡像>
例如,建立一個運作nginx的服務:
docker service create --name web --replicas 3 -p 80:80 nginx
更新服務
使用docker service update指令更新服務:
docker service update --replicas <新的副本數量> <服務名>
例如,将web服務的副本數量更新為5:
docker service update --replicas 5 web
删除服務
使用docker service rm指令删除服務:
docker service rm <服務名>
例如,删除web服務:
docker service rm web
檢視服務狀态
使用docker service ls指令檢視服務清單:
docker service ls
使用docker service ps指令檢視服務的任務狀态:
docker service ps <服務名>
Swarm支援服務的滾動更新,確定應用程式在更新過程中保持高可用性。使用docker service update指令并指定更新參數:
docker service update --image <新鏡像> <服務名>
例如,更新web服務的鏡像:
docker service update --image nginx:latest web
如果服務更新出現問題,可以使用docker service rollback指令復原到上一個版本:
docker service rollback <服務名>
Swarm支援建立覆寫網絡,使容器可以跨主機通信。使用docker network create指令建立覆寫網絡:
docker network create --driver overlay <網絡名>
然後在服務建立時指定網絡:
docker service create --name <服務名> --network <網絡名> <鏡像>
Swarm支援配置和密鑰管理,確定敏感資訊安全地傳遞給服務。使用docker config和docker secret指令管理配置和密鑰。
例如,建立一個配置:
echo "my-config-data" | docker config create my-config -
在服務建立時使用配置:
docker service create --name <服務名> --config source=my-config,target=/path/in/container <鏡像>
⏰寫在最後
Docker作為現代容器化技術的核心,極大地改變了軟體開發、測試和部署的方式。
最後我們來個簡單的總結,友善大家快速的掌握本文内容,能看到最後的勇士,可以好好記總結部分。
Docker的基礎概念
- 容器(Container):輕量級、獨立的可執行軟體包,包括應用程式及其所有依賴項。
- 鏡像(Image):不可變的容器模闆,用于建立容器。
- Docker引擎(Docker Engine):運作Docker容器的核心引擎。
- Dockerfile:建構Docker鏡像的腳本,定義了鏡像的建構過程。
Docker的基本操作
- 鏡像操作:
- docker pull:從Docker Hub拉取鏡像。
- docker build:根據Dockerfile建構鏡像。
- docker push:将鏡像推送到Docker Hub。
- 容器操作:
- docker run:啟動容器。
- docker stop:停止容器。
- docker rm:删除容器。
- docker exec:在運作中的容器内執行指令。
資料管理與網絡
- 卷(Volume):持久化存儲,獨立于容器生命周期。
- 建立和管理卷:docker volume create、docker volume ls、docker volume rm。
- 卷挂載:在docker run指令中使用-v選項。
- 網絡(Network):容器之間通信的橋梁。
- 建立和管理網絡:docker network create、docker network ls、docker network rm。
- 網絡模式:Bridge、Host、Overlay等。
Docker Compose
- 定義和運作多容器應用:
- 使用YAML檔案定義服務、網絡和卷。
- 啟動和管理服務:docker-compose up、docker-compose down、docker-compose ps。
- 進階功能:
- 多環境配置:通過多個Compose檔案支援不同環境配置。
- 擴充服務:通過docker-compose scale擴充服務副本。
Docker Swarm
- 叢集管理和編排:
- 初始化Swarm叢集:docker swarm init。
- 加入和離開叢集:docker swarm join、docker swarm leave。
- 管理節點和服務:docker node、docker service。
- 進階功能:
- 服務滾動更新和復原:docker service update、docker service rollback。
- 配置和密鑰管理:docker config、docker secret。
- 多主機網絡:通過Overlay網絡實作跨主機通信。
本文完!