Docker Swarm环境下phpMyAdmin登录MySQL报域名解析失败问题咨询
Docker Swarm下phpMyAdmin连接MySQL域名解析失败排查解决
1 优先修正docker-compose.yml语法错误
你的配置存在多处致命语法问题,是导致服务发现失效的核心原因:
- 根节点关键字错误:你使用的
service节点名应为services,Swarm无法识别错误节点下的服务定义 - 缩进错误:
deploy下的placement、resources、restart_policy、update_config等子项缩进全部不符合YAML规范,会导致配置不生效,服务无法正常注册到Swarm DNS - 层级错误:
networks根节点被错误写在services的子级下,应该和services、secrets、volumes平级
修正后的核心结构参考:
version: "3.9" services: db: # 原有db配置,注意所有子项缩进统一 phpmyadmin: # 原有phpmyadmin配置,注意所有子项缩进统一 networks: front-tier: driver: overlay back-tier: driver: overlay volumes: alpine-db_backup: alpine-mysql_logs: alpine-mysql_cnf: secrets: mysql_root_password: external: true mysql_database: external: true mysql_user: external: true mysql_password: external: true
2 验证Swarm服务发现状态
- 进入任意phpMyAdmin容器测试DNS解析:
如果返回正常的db服务虚拟IP,说明服务发现正常,否则继续排查docker exec -it <phpmyadmin容器ID> nslookup db - 检查overlay网络关联状态:
确认db和phpMyAdmin的所有副本容器都在该网络的docker network inspect back-tierContainers列表中 - 检查所有Swarm节点的防火墙规则,放行53端口UDP流量,避免拦截Docker内置DNS(127.0.0.11)的解析请求
3 修正MySQL有状态服务配置
MySQL属于有状态服务,直接部署3个无同步的副本会出现数据不一致,同时Swarm DNS轮询会将请求分发到不同副本导致登录异常,建议先将deploy.replicas改为1,验证连通性正常后再配置MySQL主从集群。
4 验证最终连通性
修正配置后重新部署栈:
docker stack deploy -c docker-compose.yml <你的栈名称>
部署完成后进入phpMyAdmin容器测试端口连通:
docker exec -it <phpmyadmin容器ID> telnet db 3306
连通正常后即可正常访问phpMyAdmin登录MySQL。
内容的提问来源于stack exchange,提问作者user11766958
相关产品推荐
相关产品推荐

