概述
Docker Swarm 是 Docker 的原生集群管理和编排工具,允许您将多个 Docker 主机组合成一个虚拟的 Docker 主机来管理和部署容器。
角色 | 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(工作节点)令牌
[root@manager1 /]# docker swarm join-token worker
#获取manager(管理节点)令牌
[root@manager1 /]# docker swarm join-token manager
1.2 生成新令牌
#生成新worker的token
[root@manager1 /]# docker swarm join-token --rotate worker
2. 添加工作节点
添加管理节点可以先通过 docker swarm join-token manager 命令获取token,再进行添加
复制初始化时获取到的命令或重新获取添加工作节点的命令:
[root@manager1 /]# docker swarm join-token worker
在worker1和worker2服务器执行以下命令:
[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. 查看节点集群列表
[root@manager1 ~]# docker node ls
4. 查看的节点详情
[root@manager1 /]# docker node inspect <HOSTNAME>
5. 退出集群
5.1 工作节点退出集群
在目标服务器(worker1、worker2)中执行下列命令:
[root@worker1 ~]# docker swarm leave
5.2 管理节点退出集群(需谨慎)
管理节点退出可能影响集群选举(Raft协议),需额外处理:
- 降级为工作节点再退出(推荐):
#先降级为工作节点 [root@manager1 /]# docker node demote <节点ID> #再执行退出 [root@manager1 /]# docker swarm leave
- 强制退出(风险较高):
若无法降级(如单管理节点集群),使用强制命令#再执行退出 [root@manager1 /]# docker swarm leave --force
5.3 在管理节点中对刚才退出节点进行删除 :
[root@manager1 /]# docker node rm 节点名称|节点ID
docker service部署
核心作用:管理 单个服务(如 Nginx、MySQL),负责副本调度、滚动更新、健康检查等操作
1. 部署服务
#命令会创建一个名为 my-nginx 的服务,并在集群中运行二个副本,映射到主机的80端口
[root@manager1 /]# docker service create --name my-nginx --replicas 2 -p 80:80 nginx
2. 更新服务配置
[root@manager1 /]# docker service update --image nginx:alpine my-nginx
#强制更新my-nginx服务,--force 参数:强制更新服务
[root@manager1 /]# docker service update --force my-nginx
3. 查看集群中的服务
3.1 列出集群中运行的所有服务
功能:查看当前 Swarm 集群中所有正在运行的服务的概览信息(如服务名称、副本数、镜像等)。
[root@manager1 /]# docker service ls
关键字段说明:
ID
:服务的唯一标识符。NAME
:服务名称(用户自定义)。MODE
:服务模式(replicated
副本模式,指定副本数;global
全局模式,每个节点运行一个副本)。REPLICAS
:当前运行的副本数/目标副本数(如3/3
表示所有副本正常运行)。IMAGE
:服务使用的容器镜像。PORTS
:服务暴露的端口映射(主机端口:容器端口)。
3.2 查看服务的任务(容器)运行状态
功能:查看某个服务的具体任务(Task,Swarm 中服务的实例)在集群节点上的分布和运行状态。
用法:docker service ps <服务名或ID>
[root@manager1 /]# docker service ps my-nginx
关键字段说明:
ID
:任务的唯一标识符。NAME
:任务名称(格式:服务名.任务序号,如web.1
表示服务web
的第1个任务)。NODE
:任务所在的 Swarm 节点。DESIRED STATE
:任务的期望状态(如Running
表示应保持运行)。CURRENT STATE
:任务的当前实际状态(如Running
、Preparing
、Failed
等)。ERROR
:任务异常时的错误信息(如启动失败原因)。
3.3 查看服务的详细配置信息
[root@manager1 /]# docker service inspect my-nginx
4. 扩展服务的副本数量
[root@manager1 /]# docker service scale my-nginx=3
5. 删除服务
[root@manager1 /]# docker service rm my-nginx
docker stack部署
概述:Docker Stack 用于在 Swarm 集群上管理多容器应用。它基于 Compose 文件定义应用,并支持复杂的多服务部署。
1. 编写 docker-compose.yml
文件:
#version: '3'
services:
mysql:
image: mysql:8.0.36
environment:
TZ: "Asia/Shanghai"
MYSQL_ROOT_PASSWORD: 123456
volumes:
# 映射数据库文件目录
- ./mysql/db:/var/lib/mysql
# 映射日志文件目录
- ./mysql/data/log:/data/log
# 映射其他数据目录
- ./mysql/data/data:/data/data
# 映射配置文件目录
- ./mysql/data/conf.d:/etc/mysql/conf.d
# 映射文档目录
- ./mysql/data/documents:/data/documents
# 同步主机和容器的时间,只读
- /etc/localtime:/etc/localtime:ro
ports:
- 3306:3306
deploy:
#设置服务的运行模式为 replicated,表示该服务将在多个节点上复制运行
mode: replicated
#表示该服务将启动 2 个副本(即两个容器实例)
replicas: 2
#给服务添加标签 APP=WEB,可以用于后续的服务筛选或管理
labels: [MY=DB]
resources: #定义服务使用的资源限制和预留
limits:
#每个容器最多使用 0.25 个 CPU(即 25% 的 CPU 资源)
cpus: '0.25'
#每个容器最多使用 512MB 内存
memory: 512M
reservations:
#每个容器至少保证有 0.25 个 CPU 可用
cpus: '0.25'
#每个容器至少保证有 256MB 内存可用
memory: 256M
#重启策略,管理容器‘非计划退出’时的恢复(如进程崩溃、资源不足)
restart_policy:
#只有当容器失败时才重启
condition: on-failure
#每次重启之间等待 5 秒
delay: 5s
#最多尝试重启 3 次
max_attempts: 3
#重启次数统计的时间窗口为 120 秒
window: 120s
#更新策略,控制服务’主动更新‘时的滚动部署(如镜像升级)
update_config:
#每次更新一个副本
parallelism: 1
#每次更新之间等待 10 秒
delay: 10s
#监控更新状态的时间为 60 秒
monitor: 60s
#允许的最大失败比率为 30%
max_failure_ratio: 0.3
#continue:忽略失败继续执行后续操作(风险较高)
#pause:暂停更新流程(需人工干预)
#rollback:自动回滚到上一稳定版本(推荐生产环境使用)
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:先停止旧副本再启动新副本(默认)
#start-first:先启动新副本再停止旧副本(减少中断)
order: start-first
#定义服务调度到哪些节点上
#placement:
#仅将此服务调度到具有 worker 角色的节点上
#constraints: [node.role == Manager]
nacos:
image: nacos/nacos-server:v2.3.2
ports:
# web 界面访问端口
- 8848:8848
# 程序使用 grpc 连接的端口
- 9848:9848
environment:
# 单机模式运行
- MODE=standalone
# 启用账号密码验证
- NACOS_AUTH_ENABLE=true
# 随便使用一个32个字符组成的字符串,生成 base64 字符串,填写到这里即可
- NACOS_AUTH_TOKEN=VGhpc0lzTXlDdXN0b21TZWNyZXRLZXkwMTIzNDU2Nzg=
# 随便填写
- NACOS_AUTH_IDENTITY_KEY=zykey
# 随便填写
- NACOS_AUTH_IDENTITY_VALUE=zyvalue
# 使用 mysql 作为数据库
- 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
# 设置连接 mysql 的连接参数
- 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
对于文件中的敏感信息可以使用docker secret管理,docker secret 是 Docker Swarm 模式下用于管理敏感信息(如密码、密钥、证书等)的核心机制。
2. 部署/更新 Stack
[root@manager1 /]# docker stack deploy -c docker-compose.yml my-stack --detach=false
命令解析
my-stack 参数:
my-stack 是用户自定义的 Stack(堆栈)名称,用于标识和管理一组通过 docker-compose.yml 定义的关联服务
1. my-stack的作用
- 命名空间:所有通过该命令部署的服务、网络、卷等资源会统一归属于 my-stack 命名空间,格式为 <stack-name>_<service-name>(例如 my-stack_nginx)。
- 管理隔离:允许在同一 Swarm 集群中部署多个独立的应用栈(如 prod-stack 和 test-stack),避免名称冲突。
- 操作目标:后续可通过 docker stack rm my-stack 或 docker stack services my-stack 等命令精准操作该堆栈。
2. 是否可以省略?
- 必须定义:Stack 名称是强制参数,不能省略。Docker 要求明确指定堆栈名称以管理资源。
3. 注意事项
- 名称冲突:如果重复使用同一名称部署,Docker 会更新现有堆栈而非新建。
- 生产建议:在 CI/CD 流程中,可通过环境变量动态注入堆栈名称(如 ${ENV}-stack)
--detach=false 参数:
1. 参数作用
-
false
(默认即将变更):容器日志直接输出到当前终端,阻塞式运行(适合调试)。 -
true
:容器在后台运行,返回容器ID(生产环境常用)。
问题说明
出现一下警告解析:
1. container_name和restart配置为单机模式,在swarm中已弃用
2. 定义--detach=false参数
3. 查看 Stack 状态
[root@manager1 /]# docker stack ls
[root@manager1 /]# docker stack services my-stack
4. 删除 Stack
[root@manager1 /]# docker stack rm my-stack
完毕!!!
资源清理:
清理未被使用的 Docker 资源(包括停止的容器、未被任何容器引用的网络、悬空镜像(dangling images,即无标签的镜像)、构建缓存等)
[root@manager1 /]# docker system prune -f # 清理停止的容器等残留项