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




