Docker swarm集群部署过程详解(包含compose.yml文件详情)
作者:佛说"獨"
概述
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 # 清理停止的容器等残留项
到此这篇关于Docker swarm集群部署包含compose.yml文件详情的文章就介绍到这了,更多相关Docker swarm集群内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!