Docker Swarm部署mysql/mysql-cluster时服务名无法解析问题求助
核心错误原因
MySQL Cluster 管理节点进程 ndb_mgmd 启动时会优先解析配置文件中指定的 HostName,但这个执行时机早于 Docker Swarm 内置DNS完成服务名注册的时间,同时默认创建的容器主机名和配置文件中填写的服务名不一致,最终导致解析失败。
排查步骤
- 临时修改management1服务的启动命令为
sleep 3600后重新部署,进入容器执行以下命令验证基础网络是否正常:- 执行
cat /etc/resolv.conf确认DNS服务器为Swarm内置的127.0.0.11 - 执行
nslookup management1验证服务名是否能正常解析到容器IP - 执行
hostname查看容器当前主机名是否等于management1
- 执行
解决方案
方案1:显式指定容器主机名(最稳定)
在docker-compose.yml的每个服务配置块中,添加hostname字段,值和mysql-cluster.cnf中配置的HostName保持一致,修改后的服务配置示例:
services: management1: image: mysql/mysql-cluster command: ndb_mgmd hostname: management1 # 新增字段 networks: - "meroex-network" deploy: mode: replicated replicas: 1 placement: constraints: - node.role == manager ndb1: image: mysql/mysql-cluster command: ndbd hostname: ndb1 # 新增字段 networks: - "meroex-network" deploy: mode: replicated replicas: 1 placement: constraints: - node.role == manager ndb2: image: mysql/mysql-cluster command: ndbd hostname: ndb2 # 新增字段 networks: - "meroex-network" deploy: mode: replicated replicas: 1 placement: constraints: - node.role == manager mysql1: image: mysql/mysql-cluster ports: - "3306:3306" restart: always command: mysqld hostname: mysql1 # 新增字段 depends_on: - "management1" - "ndb1" - "ndb2" networks: - "meroex-network" deploy: placement: constraints: - node.role == manager
修改后执行以下命令重新部署即可:
docker stack rm vossibility # 等待10秒左右让所有旧资源清理完成 docker stack deploy --compose-file docker-compose.yml vossibility
方案2:添加启动延迟适配DNS注册时机
如果不想修改主机名配置,可以给ndb_mgmd加启动延迟,等待Swarm DNS注册完成后再启动进程,修改management1的command为:
command: sh -c "sleep 5 && ndb_mgmd"
这个方案适配性稍差,若Swarm集群负载高时可能需要调整延迟时长。
部署完成后可进入management1容器执行 ndb_mgm -e show 验证所有节点是否正常接入集群。
内容的提问来源于stack exchange,提问作者Olisan
相关产品推荐
相关产品推荐

