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  # 清理停止的容器等残留项
相关推荐
夜月蓝汐17 分钟前
JAVA中的Collection集合及ArrayList,LinkedLIst,HashSet,TreeSet和其它实现类的常用方法
java·开发语言
帅到爆的努力小陈23 分钟前
Java集合框架中List常见问题
java·集合·list集合·java-list
Elastic 中国社区官方博客41 分钟前
在 Windows 上使用 Docker 运行 Elastic Open Crawler
大数据·windows·爬虫·elasticsearch·搜索引擎·docker·容器
玄辰星君1 小时前
【MAC】nacos 2.5.1容器docker安装
macos·docker·nacos
土小帽软件测试1 小时前
docker安装、启动jenkins服务,创建接口自动化定时任务(mac系统)
docker·容器·jenkins
世纪摆渡人1 小时前
部署-k8s和docker、jenkins的区别和联系
docker·kubernetes·jenkins
明天…ling1 小时前
docker+小皮面板
运维·docker·容器
秋千码途2 小时前
小架构step系列17:getter-setter-toString
java·开发语言·架构
吃西瓜不吐籽_2 小时前
Mac 安装及使用sdkman指南
java·笔记
晨启AI2 小时前
Trae IDE:打造完美Java开发环境的实战指南
java·环境搭建·trae