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集群

java 复制代码
[root@manager1 /]# docker swarm init --advertise-addr 192.168.56.100

1.1 查看令牌

java 复制代码
#获取worker(工作节点)令牌
[root@manager1 /]# docker swarm join-token worker
#获取manager(管理节点)令牌
[root@manager1 /]# docker swarm join-token manager

1.2 生成新令牌

java 复制代码
#生成新worker的token
[root@manager1 /]# docker swarm join-token --rotate worker

2. 添加工作节点

添加管理节点可以先通过 docker swarm join-token manager 命令获取token,再进行添加

复制初始化时获取到的命令 重新获取添加工作节点的命令:

java 复制代码
[root@manager1 /]# docker swarm join-token worker

在worker1和worker2服务器执行以下命令:

java 复制代码
[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. 查看节点集群列表

java 复制代码
[root@manager1 ~]# docker node ls

4. 查看的节点详情

java 复制代码
[root@manager1 /]# docker node inspect <HOSTNAME>

5. 退出集群

5.1 工作节点退出集群

在目标服务器(worker1、worker2)中执行下列命令:

java 复制代码
[root@worker1 ~]# docker swarm leave

5.2 管理节点退出集群(需谨慎)

管理节点退出可能影响集群选举(Raft协议),需额外处理:

  1. 降级为工作节点再退出(推荐) ‌:

    java 复制代码
    #先降级为工作节点‌
    [root@manager1 /]# docker node demote <节点ID>
    #再执行退出‌
    [root@manager1 /]# docker swarm leave
  2. 强制退出(风险较高) ‌:
    若无法降级(如单管理节点集群),使用强制命令

    java 复制代码
    #再执行退出‌
    [root@manager1 /]# docker swarm leave --force

5.3 在管理节点中对刚才退出节点进行删除 ‌:

java 复制代码
[root@manager1 /]# docker node rm 节点名称|节点ID

docker service部署

核心作用 ‌:管理 ‌单个服务‌(如 Nginx、MySQL),负责副本调度、滚动更新、健康检查等操作

1. 部署服务

java 复制代码
#命令会创建一个名为 my-nginx 的服务,并在集群中运行二个副本,映射到主机的80端口
[root@manager1 /]# docker service create --name my-nginx --replicas 2 -p 80:80 nginx

2. 更新服务配置

java 复制代码
[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 集群中所有正在运行的服务的概览信息(如服务名称、副本数、镜像等)。

java 复制代码
[root@manager1 /]# docker service ls

关键字段说明

  • ID:服务的唯一标识符。
  • NAME:服务名称(用户自定义)。
  • MODE:服务模式(replicated 副本模式,指定副本数;global 全局模式,每个节点运行一个副本)。
  • REPLICAS:当前运行的副本数/目标副本数(如 3/3 表示所有副本正常运行)。
  • IMAGE:服务使用的容器镜像。
  • PORTS:服务暴露的端口映射(主机端口:容器端口)。

3.2 查看服务的任务(容器)运行状态

功能:查看某个服务的具体任务(Task,Swarm 中服务的实例)在集群节点上的分布和运行状态。

用法docker service ps <服务名或ID>

java 复制代码
[root@manager1 /]# docker service ps my-nginx

关键字段说明

  • ID:任务的唯一标识符。
  • NAME:任务名称(格式:服务名.任务序号,如 web.1 表示服务 web 的第1个任务)。
  • NODE:任务所在的 Swarm 节点。
  • DESIRED STATE:任务的期望状态(如 Running 表示应保持运行)。
  • CURRENT STATE:任务的当前实际状态(如 RunningPreparingFailed 等)。
  • ERROR:任务异常时的错误信息(如启动失败原因)。

3.3 查看服务的详细配置信息

java 复制代码
[root@manager1 /]# docker service inspect my-nginx

4. 扩展服务的副本数量

java 复制代码
[root@manager1 /]# docker service scale my-nginx=3

**5.**删除服务

java 复制代码
[root@manager1 /]# docker service rm my-nginx


docker stack部署

**概述:**Docker Stack 用于在 Swarm 集群上管理多容器应用。它基于 Compose 文件定义应用,并支持复杂的多服务部署。

1. 编写 docker-compose.yml 文件:

java 复制代码
#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

java 复制代码
[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 状态

java 复制代码
[root@manager1 /]# docker stack ls
[root@manager1 /]# docker stack services my-stack

4. 删除 Stack

java 复制代码
[root@manager1 /]# docker stack rm my-stack

完毕!!!

资源清理‌:

清理未被使用的 Docker 资源(包括停止的容器、未被任何容器引用的网络、悬空镜像(dangling images,即无标签的镜像)、构建缓存等)

java 复制代码
[root@manager1 /]# docker system prune -f  # 清理停止的容器等残留项
相关推荐
带刺的坐椅12 分钟前
Solon v3.4.7, v3.5.6, v3.6.1 发布(国产优秀应用开发框架)
java·spring·solon
四谎真好看2 小时前
Java 黑马程序员学习笔记(进阶篇18)
java·笔记·学习·学习笔记
桦说编程2 小时前
深入解析CompletableFuture源码实现(2)———双源输入
java·后端·源码
java_t_t2 小时前
ZIP工具类
java·zip
lang201509282 小时前
Spring Boot优雅关闭全解析
java·spring boot·后端
IT_Octopus2 小时前
triton backend 模式docker 部署 pytorch gpu模型 镜像选择
pytorch·docker·triton·模型推理
pengzhuofan3 小时前
第10章 Maven
java·maven
百锦再4 小时前
Vue Scoped样式混淆问题详解与解决方案
java·前端·javascript·数据库·vue.js·学习·.net
刘一说4 小时前
Spring Boot 启动慢?启动过程深度解析与优化策略
java·spring boot·后端
壹佰大多4 小时前
【spring如何扫描一个路径下被注解修饰的类】
java·后端·spring