Docker swarm集群部署過程詳解(包含compose.yml文件詳情)
概述
Docker Swarm 是 Docker 的原生集群管理和編排工具,允許您將多個(gè) Docker 主機(jī)組合成一個(gè)虛擬的 Docker 主機(jī)來管理和部署容器。
| 角色 | IP | HOSTNAME |
|---|---|---|
| Manager | 192.168.56.100 | manager1 |
| worker | 192.168.56.101 | worker1 |
| worker | 192.168.56.103 | worker2 |
docker swarm集群部署
1. 初始化swarm集群
[root@manager1 /]# docker swarm init --advertise-addr 192.168.56.100

1.1 查看令牌
#獲取worker(工作節(jié)點(diǎn))令牌 [root@manager1 /]# docker swarm join-token worker #獲取manager(管理節(jié)點(diǎn))令牌 [root@manager1 /]# docker swarm join-token manager
1.2 生成新令牌
#生成新worker的token [root@manager1 /]# docker swarm join-token --rotate worker
2. 添加工作節(jié)點(diǎn)
添加管理節(jié)點(diǎn)可以先通過 docker swarm join-token manager 命令獲取token,再進(jìn)行添加
復(fù)制初始化時(shí)獲取到的命令或重新獲取添加工作節(jié)點(diǎn)的命令:
[root@manager1 /]# docker swarm join-token worker

在worker1和worker2服務(wù)器執(zhí)行以下命令:
[root@worker1 ~]# docker swarm join --token SWMTKN-1-123ku5t7znc2qyk3cp7drbglrgj62ite8g9x4ou7f8c68mxxyy-a06klulcrz5awwcmwkeooo70j 192.168.56.100:2377 [root@worker2 ~]# docker swarm join --token SWMTKN-1-123ku5t7znc2qyk3cp7drbglrgj62ite8g9x4ou7f8c68mxxyy-a06klulcrz5awwcmwkeooo70j 192.168.56.100:2377

3. 查看節(jié)點(diǎn)集群列表
[root@manager1 ~]# docker node ls

4. 查看的節(jié)點(diǎn)詳情
[root@manager1 /]# docker node inspect <HOSTNAME>
5. 退出集群
5.1 工作節(jié)點(diǎn)退出集群
在目標(biāo)服務(wù)器(worker1、worker2)中執(zhí)行下列命令:
[root@worker1 ~]# docker swarm leave
5.2 管理節(jié)點(diǎn)退出集群(需謹(jǐn)慎)
管理節(jié)點(diǎn)退出可能影響集群選舉(Raft協(xié)議),需額外處理:
- 降級(jí)為工作節(jié)點(diǎn)再退出(推薦):
#先降級(jí)為工作節(jié)點(diǎn)? [root@manager1 /]# docker node demote <節(jié)點(diǎn)ID> #再執(zhí)行退出? [root@manager1 /]# docker swarm leave
- 強(qiáng)制退出(風(fēng)險(xiǎn)較高):
若無法降級(jí)(如單管理節(jié)點(diǎn)集群),使用強(qiáng)制命令
#再執(zhí)行退出? [root@manager1 /]# docker swarm leave --force
5.3 在管理節(jié)點(diǎn)中對(duì)剛才退出節(jié)點(diǎn)進(jìn)行刪除 :
[root@manager1 /]# docker node rm 節(jié)點(diǎn)名稱|節(jié)點(diǎn)ID
docker service部署
核心作用:管理 單個(gè)服務(wù)(如 Nginx、MySQL),負(fù)責(zé)副本調(diào)度、滾動(dòng)更新、健康檢查等操作
1. 部署服務(wù)
#命令會(huì)創(chuàng)建一個(gè)名為 my-nginx 的服務(wù),并在集群中運(yùn)行二個(gè)副本,映射到主機(jī)的80端口 [root@manager1 /]# docker service create --name my-nginx --replicas 2 -p 80:80 nginx

2. 更新服務(wù)配置
[root@manager1 /]# docker service update --image nginx:alpine my-nginx #強(qiáng)制更新my-nginx服務(wù),--force 參數(shù):強(qiáng)制更新服務(wù) [root@manager1 /]# docker service update --force my-nginx
3. 查看集群中的服務(wù)
3.1 列出集群中運(yùn)行的所有服務(wù)
功能:查看當(dāng)前 Swarm 集群中所有正在運(yùn)行的服務(wù)的概覽信息(如服務(wù)名稱、副本數(shù)、鏡像等)。
[root@manager1 /]# docker service ls
![]()
關(guān)鍵字段說明:
ID:服務(wù)的唯一標(biāo)識(shí)符。NAME:服務(wù)名稱(用戶自定義)。MODE:服務(wù)模式(replicated副本模式,指定副本數(shù);global全局模式,每個(gè)節(jié)點(diǎn)運(yùn)行一個(gè)副本)。REPLICAS:當(dāng)前運(yùn)行的副本數(shù)/目標(biāo)副本數(shù)(如3/3表示所有副本正常運(yùn)行)。IMAGE:服務(wù)使用的容器鏡像。PORTS:服務(wù)暴露的端口映射(主機(jī)端口:容器端口)。
3.2 查看服務(wù)的任務(wù)(容器)運(yùn)行狀態(tài)
功能:查看某個(gè)服務(wù)的具體任務(wù)(Task,Swarm 中服務(wù)的實(shí)例)在集群節(jié)點(diǎn)上的分布和運(yùn)行狀態(tài)。
用法:docker service ps <服務(wù)名或ID>
[root@manager1 /]# docker service ps my-nginx

關(guān)鍵字段說明:
ID:任務(wù)的唯一標(biāo)識(shí)符。NAME:任務(wù)名稱(格式:服務(wù)名.任務(wù)序號(hào),如web.1表示服務(wù)web的第1個(gè)任務(wù))。NODE:任務(wù)所在的 Swarm 節(jié)點(diǎn)。DESIRED STATE:任務(wù)的期望狀態(tài)(如Running表示應(yīng)保持運(yùn)行)。CURRENT STATE:任務(wù)的當(dāng)前實(shí)際狀態(tài)(如Running、Preparing、Failed等)。ERROR:任務(wù)異常時(shí)的錯(cuò)誤信息(如啟動(dòng)失敗原因)。
3.3 查看服務(wù)的詳細(xì)配置信息
[root@manager1 /]# docker service inspect my-nginx
4. 擴(kuò)展服務(wù)的副本數(shù)量:
[root@manager1 /]# docker service scale my-nginx=3

5. 刪除服務(wù):
[root@manager1 /]# docker service rm my-nginx

docker stack部署
概述:Docker Stack 用于在 Swarm 集群上管理多容器應(yīng)用。它基于 Compose 文件定義應(yīng)用,并支持復(fù)雜的多服務(wù)部署。
1. 編寫 docker-compose.yml 文件:
#version: '3'
services:
mysql:
image: mysql:8.0.36
environment:
TZ: "Asia/Shanghai"
MYSQL_ROOT_PASSWORD: 123456
volumes:
# 映射數(shù)據(jù)庫(kù)文件目錄
- ./mysql/db:/var/lib/mysql
# 映射日志文件目錄
- ./mysql/data/log:/data/log
# 映射其他數(shù)據(jù)目錄
- ./mysql/data/data:/data/data
# 映射配置文件目錄
- ./mysql/data/conf.d:/etc/mysql/conf.d
# 映射文檔目錄
- ./mysql/data/documents:/data/documents
# 同步主機(jī)和容器的時(shí)間,只讀
- /etc/localtime:/etc/localtime:ro
ports:
- 3306:3306
deploy:
#設(shè)置服務(wù)的運(yùn)行模式為 replicated,表示該服務(wù)將在多個(gè)節(jié)點(diǎn)上復(fù)制運(yùn)行
mode: replicated
#表示該服務(wù)將啟動(dòng) 2 個(gè)副本(即兩個(gè)容器實(shí)例)
replicas: 2
#給服務(wù)添加標(biāo)簽 APP=WEB,可以用于后續(xù)的服務(wù)篩選或管理
labels: [MY=DB]
resources: #定義服務(wù)使用的資源限制和預(yù)留
limits:
#每個(gè)容器最多使用 0.25 個(gè) CPU(即 25% 的 CPU 資源)
cpus: '0.25'
#每個(gè)容器最多使用 512MB 內(nèi)存
memory: 512M
reservations:
#每個(gè)容器至少保證有 0.25 個(gè) CPU 可用
cpus: '0.25'
#每個(gè)容器至少保證有 256MB 內(nèi)存可用
memory: 256M
#重啟策略,管理容器‘非計(jì)劃退出'時(shí)的恢復(fù)(如進(jìn)程崩潰、資源不足)
restart_policy:
#只有當(dāng)容器失敗時(shí)才重啟
condition: on-failure
#每次重啟之間等待 5 秒
delay: 5s
#最多嘗試重啟 3 次
max_attempts: 3
#重啟次數(shù)統(tǒng)計(jì)的時(shí)間窗口為 120 秒
window: 120s
#更新策略,控制服務(wù)'主動(dòng)更新‘時(shí)的滾動(dòng)部署(如鏡像升級(jí))
update_config:
#每次更新一個(gè)副本
parallelism: 1
#每次更新之間等待 10 秒
delay: 10s
#監(jiān)控更新狀態(tài)的時(shí)間為 60 秒
monitor: 60s
#允許的最大失敗比率為 30%
max_failure_ratio: 0.3
#continue:忽略失敗繼續(xù)執(zhí)行后續(xù)操作(風(fēng)險(xiǎn)較高)
#pause:暫停更新流程(需人工干預(yù))
#rollback:自動(dòng)回滾到上一穩(wěn)定版本(推薦生產(chǎn)環(huán)境使用)
failure_action: rollback
#回滾策略,update_config中failure_action: rollback 被激活
rollback_config:
parallelism: 2
delay: 5s
failure_action: rollback
monitor: 60s
max_failure_ratio: 0.2
#stop-first:先停止舊副本再啟動(dòng)新副本(默認(rèn))
#start-first:先啟動(dòng)新副本再停止舊副本(減少中斷)?
order: start-first
#定義服務(wù)調(diào)度到哪些節(jié)點(diǎn)上
#placement:
#僅將此服務(wù)調(diào)度到具有 worker 角色的節(jié)點(diǎn)上
#constraints: [node.role == Manager]
nacos:
image: nacos/nacos-server:v2.3.2
ports:
# web 界面訪問端口
- 8848:8848
# 程序使用 grpc 連接的端口
- 9848:9848
environment:
# 單機(jī)模式運(yùn)行
- MODE=standalone
# 啟用賬號(hào)密碼驗(yàn)證
- NACOS_AUTH_ENABLE=true
# 隨便使用一個(gè)32個(gè)字符組成的字符串,生成 base64 字符串,填寫到這里即可
- NACOS_AUTH_TOKEN=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
# 隨便填寫
- NACOS_AUTH_IDENTITY_KEY=zykey
# 隨便填寫
- NACOS_AUTH_IDENTITY_VALUE=zyvalue
# 使用 mysql 作為數(shù)據(jù)庫(kù)
- SPRING_DATASOURCE_PLATFORM=mysql
- MYSQL_SERVICE_HOST=192.168.56.100
- MYSQL_SERVICE_PORT=3306
- MYSQL_SERVICE_DB_NAME=nacos
- MYSQL_SERVICE_USER=root
- MYSQL_SERVICE_PASSWORD=123456
# 設(shè)置連接 mysql 的連接參數(shù)
- MYSQL_SERVICE_DB_PARAM=characterEncoding=utf8&connectTimeout=1000&socketTimeout=3000&autoReconnect=true&useUnicode=true&allowPublicKeyRetrieval=true&useSSL=false&serverTimezone=UTC
volumes:
- ./nacos/logs:/home/nacos/logs對(duì)于文件中的敏感信息可以使用docker secret管理,docker secret 是 Docker Swarm 模式下用于管理敏感信息(如密碼、密鑰、證書等)的核心機(jī)制。
2. 部署/更新 Stack
[root@manager1 /]# docker stack deploy -c docker-compose.yml my-stack --detach=false

命令解析
my-stack 參數(shù):
my-stack 是用戶自定義的 Stack(堆棧)名稱,用于標(biāo)識(shí)和管理一組通過 docker-compose.yml 定義的關(guān)聯(lián)服務(wù)
1. my-stack的作用
- 命名空間:所有通過該命令部署的服務(wù)、網(wǎng)絡(luò)、卷等資源會(huì)統(tǒng)一歸屬于 my-stack 命名空間,格式為 <stack-name>_<service-name>(例如 my-stack_nginx)。
- 管理隔離:允許在同一 Swarm 集群中部署多個(gè)獨(dú)立的應(yīng)用棧(如 prod-stack 和 test-stack),避免名稱沖突。
- 操作目標(biāo):后續(xù)可通過 docker stack rm my-stack 或 docker stack services my-stack 等命令精準(zhǔn)操作該堆棧。
2. 是否可以省略?
- 必須定義:Stack 名稱是強(qiáng)制參數(shù),不能省略。Docker 要求明確指定堆棧名稱以管理資源。
3. 注意事項(xiàng)
- 名稱沖突:如果重復(fù)使用同一名稱部署,Docker 會(huì)更新現(xiàn)有堆棧而非新建。
- 生產(chǎn)建議:在 CI/CD 流程中,可通過環(huán)境變量動(dòng)態(tài)注入堆棧名稱(如 ${ENV}-stack)
--detach=false 參數(shù):
1. 參數(shù)作用
-
false(默認(rèn)即將變更):容器日志直接輸出到當(dāng)前終端,阻塞式運(yùn)行(適合調(diào)試)。 -
true:容器在后臺(tái)運(yùn)行,返回容器ID(生產(chǎn)環(huán)境常用)。
問題說明
出現(xiàn)一下警告解析:

1. container_name和restart配置為單機(jī)模式,在swarm中已棄用
2. 定義--detach=false參數(shù)
3. 查看 Stack 狀態(tài)
[root@manager1 /]# docker stack ls [root@manager1 /]# docker stack services my-stack

4. 刪除 Stack
[root@manager1 /]# docker stack rm my-stack

資源清理:
清理未被使用的 Docker 資源(包括停止的容器、未被任何容器引用的網(wǎng)絡(luò)、懸空鏡像(dangling images,即無標(biāo)簽的鏡像)、構(gòu)建緩存等)
[root@manager1 /]# docker system prune -f # 清理停止的容器等殘留項(xiàng)
到此這篇關(guān)于Docker swarm集群部署包含compose.yml文件詳情的文章就介紹到這了,更多相關(guān)Docker swarm集群內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
docker容器中登陸并操作postgresql的實(shí)現(xiàn)
本文主要介紹了docker容器中登陸并操作postgresql的實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-02-02
docker安裝influxdb的詳細(xì)教程(性能測(cè)試)
這篇文章主要介紹了docker安裝influxdb的詳細(xì)教程,本文通過圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07
Docker配置Redis集群及主從擴(kuò)容與縮容的操作方法
這篇文章主要介紹了Docker配置Redis集群及主從擴(kuò)容與縮容的操作方法,本文給大家介紹的非常詳細(xì),感興趣的朋友跟隨小編一起看看吧2024-06-06

