You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Docker Swarm中如何在管理与工作节点各部署至少一个MySQL/PHP容器?

解决Docker Swarm节点全覆盖部署MySQL和PHP容器的问题

嘿,我来帮你搞定这个Docker Swarm部署的问题!针对你1个管理节点+2个工作节点的架构,要确保每个节点都跑一个MySQL和PHP容器,同时避开global模式无法做复制的问题,这里有两个实用方案:

方案一:利用副本数+节点上限约束自动分配(推荐)

这个方案配置简单,适合节点数量固定的场景,核心是通过replicas设置与节点数一致的副本数,再用max_replicas_per_node限制每个节点最多跑一个副本,让Swarm自动把容器分配到每个节点。

步骤1:确认节点信息

先执行命令查看所有节点的主机名,确保你清楚每个节点的标识:

docker node ls

步骤2:编写Docker Compose配置

创建docker-compose.yml文件,内容如下:

version: '3.8'

services:
  # MySQL服务配置
  mysql:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_secure_password  # 替换成你的密码
    deploy:
      mode: replicated
      replicas: 3  # 副本数等于总节点数
      placement:
        constraints:
          - node.role == manager or node.role == worker  # 允许部署在所有节点
        max_replicas_per_node: 1  # 每个节点最多1个副本
      restart_policy:
        condition: on-failure  # 容器故障自动重启

  # PHP服务配置
  php:
    image: php:8.2-fpm  # 根据你的需求替换PHP版本
    deploy:
      mode: replicated
      replicas: 3
      placement:
        constraints:
          - node.role == manager or node.role == worker
        max_replicas_per_node: 1
      restart_policy:
        condition: on-failure

部署验证

执行部署命令:

docker stack deploy -c docker-compose.yml your_stack_name

部署完成后,用docker stack ps your_stack_name查看容器分布,就能看到每个节点都有一个MySQL和PHP容器了。

方案二:按节点主机名精准绑定(适合需要强控制的场景)

如果需要指定某个容器必须跑在特定节点,可以为每个节点单独创建服务,通过node.hostname约束精准定位。

示例Docker Compose配置

version: '3.8'

services:
  # 管理节点的MySQL
  mysql-manager:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_secure_password
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.hostname == swarm-manager  # 替换成你的管理节点主机名
      restart_policy:
        condition: on-failure

  # 工作节点1的MySQL
  mysql-worker1:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_secure_password
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.hostname == swarm-worker-1  # 替换成你的工作节点1主机名
      restart_policy:
        condition: on-failure

  # 工作节点2的MySQL
  mysql-worker2:
    image: mysql:8.0
    environment:
      MYSQL_ROOT_PASSWORD: your_secure_password
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.hostname == swarm-worker-2  # 替换成你的工作节点2主机名
      restart_policy:
        condition: on-failure

  # 管理节点的PHP
  php-manager:
    image: php:8.2-fpm
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.hostname == swarm-manager
      restart_policy:
        condition: on-failure

  # 工作节点1的PHP
  php-worker1:
    image: php:8.2-fpm
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.hostname == swarm-worker-1
      restart_policy:
        condition: on-failure

  # 工作节点2的PHP
  php-worker2:
    image: php:8.2-fpm
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
          - node.hostname == swarm-worker-2
      restart_policy:
        condition: on-failure

这个方案的优势是完全可控,但缺点是节点数量变化时需要手动修改配置。

额外提示:MySQL复制配置

需要注意的是,Swarm只是帮你把容器部署到每个节点,不会自动配置MySQL复制集群。你需要手动搭建主从复制或者MySQL Group Replication来实现数据同步,比如选一个节点作为主节点,其他作为从节点,或者构建多主集群。

内容的提问来源于stack exchange,提问作者jibin087

火山引擎 最新活动