You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Docker Swarm创建同实例MySQL容器?部署遇问题求助

问题解决与实现建议

1. Docker Compose文件replicas配置报错的解决

你使用的Compose v3规范中,replicas属于部署专属配置,不能直接放在service节点下,必须嵌套在deploy块内,且需通过docker stack deploy命令部署,而非传统的docker-compose up。修正后的Compose文件如下:

version: '3.8' # 建议使用更高版本规范,兼容性更强
services:
  mysql_service:
    image: mysql:latest
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 123
      MYSQL_DATABASE: testdb
      MYSQL_ROOT_HOST: "%" # 提前解决后续连接权限问题
    ports:
      - '3306:3306'
    networks:
      - mysql_network
    volumes:
      - mysql_volume:/var/lib/mysql
    deploy:
      replicas: 2 # 将replicas放在deploy块内
networks:
  mysql_network:
    external: true # 关联你提前创建的overlay网络
volumes:
  mysql_volume:
    external: true # 关联你提前创建的卷

部署命令:

docker stack deploy -c docker-compose.yml mysql_stack

2. 数据库未生成在指定卷中的原因与解决

核心问题:Swarm本地卷的局限性

你创建的mysql_volume是默认的local类型卷,在Swarm集群中,local卷仅存在于单个节点。若两个MySQL副本被调度到不同节点,每个副本会使用各自节点上自动创建的mysql_volume,导致数据不共享,看起来像是“数据库未生成在指定卷”。

解决方法:改用NFS共享卷(匹配你的后续计划)

替换local卷为NFS卷,确保所有节点挂载同一共享目录:

  1. 在NFS服务器上创建共享目录并配置权限
  2. 在Swarm所有节点安装NFS客户端(如apt install nfs-common)
  3. 创建Swarm兼容的NFS卷:
docker volume create --driver local \
  --opt type=nfs \
  --opt o=addr=<NFS服务器IP>,rw \
  --opt device=:/path/to/nfs/share \
  mysql_nfs_volume

后续创建服务或部署Stack时,使用此mysql_nfs_volume即可。

3. MySQL连接权限报错的解决

报错Host '10.0.0.2' is not allowed to connect是因为MySQL默认仅允许root用户从localhost连接,有两种快速解决方式:

方式一:启动时设置环境变量

MySQL官方镜像支持MYSQL_ROOT_HOST变量,设置为%允许所有主机连接:

docker service create --name mysql_service --replicas 2 \
  --network mysql_network \
  --env MYSQL_DATABASE=testdb \
  --env MYSQL_ROOT_PASSWORD=123 \
  --env MYSQL_ROOT_HOST="%" \
  --mount type=volume,src=mysql_nfs_volume,dst=/var/lib/mysql \
  -p 3306:3306 mysql:latest

方式二:进入容器手动授权

若已创建服务,进入任意一个MySQL容器执行授权命令:

# 进入容器
docker exec -it <容器ID> mysql -uroot -p123
# 执行授权
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;
FLUSH PRIVILEGES;

关键提醒:Swarm replicas≠MySQL集群

你当前用Swarm replicas创建两个MySQL容器的思路,并非真正的数据库集群:

  • 即使共享NFS卷,两个MySQL实例同时写入会直接导致数据损坏(MySQL不支持多实例并发写入同一数据目录)
  • 正确的MySQL集群需依赖自身机制实现:
    • 主从复制:一主多从,主库负责写入,从库负责读取
    • 组复制(MGR):多节点可读写,自动同步数据
      Swarm仅负责容器的编排与高可用管理,无法实现数据库层面的同步逻辑。

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 09:25:13