如何从Windows10主机连接Docker Swarm集群中CentOS节点的MySQL容器
从Windows 10主机连接Docker Swarm集群中的MySQL实例
针对你的问题,我会分两部分来解答:一是如何从Windows 10的Z主机连接Swarm集群里的MySQL容器,二是解决无法获取容器IP的问题。
一、连接Swarm集群中的MySQL实例
在Docker Swarm模式下,最可靠的外部连接方式是通过服务端口发布,因为Swarm会自动处理请求路由,不管MySQL服务运行在集群哪个节点上。
步骤1:在Compose文件中配置服务端口
修改你的Docker Compose文件,给MySQL服务添加ports字段,将容器的3306端口映射到集群节点的3306端口(也可以用不同的主机端口,比如3307:3306):
version: '3.8' services: mysql: image: mysql:8.0 environment: MYSQL_ROOT_PASSWORD: your_secure_password # 替换成你的密码 MYSQL_DATABASE: your_database_name # 可选:预创建数据库 ports: - "3306:3306" # 主机端口:容器端口,Swarm会把这个端口发布到所有集群节点 deploy: replicas: 1 # 可选:指定服务运行的节点,比如限定在节点A placement: constraints: - node.hostname == A # 可选:挂载数据卷持久化MySQL数据 volumes: - mysql-data:/var/lib/mysql volumes: mysql-data:
部署这个栈到Swarm集群:
docker stack deploy -c docker-compose.yml mysql-stack
步骤2:在Windows 10的Z主机上用MySQL Workbench连接
打开MySQL Workbench,点击「+」新建连接,填写以下信息:
- 连接名称:自定义(比如
Swarm-MySQL-Cluster) - 主机名:填写集群中任意节点(A、B、C)的局域网/公网IP(确保Z主机能ping通该节点)
- 端口:3306(和Compose中配置的主机端口一致)
- 用户名:
root(或者你在MySQL中创建的其他用户) - 密码:填写Compose中设置的
MYSQL_ROOT_PASSWORD
点击「测试连接」,如果配置正确就能成功连接了。
关键注意事项
- 确保CentOS节点的防火墙开放了3306端口:
sudo firewall-cmd --add-port=3306/tcp --permanent sudo firewall-cmd --reload - 如果是云服务器,需要在云平台的安全组中,允许Z主机的IP访问3306端口
- MySQL容器的
bind-address必须设置为0.0.0.0(官方MySQL镜像默认已配置,自定义配置文件时注意不要改成127.0.0.1)
二、解决无法获取容器IP的问题
你用的docker inspect命令只针对默认的桥接网络,而Swarm服务默认使用Overlay网络(比如ingress或者你自定义的网络),所以需要调整命令来读取Overlay网络下的IP:
方法1:通用命令(适配所有网络)
这个命令会输出容器名称和它在所有网络中的IP:
docker inspect --format '{{ .Name }} => {{ range .NetworkSettings.Networks }}{{ .IPAddress }} {{ end }}' $(docker ps -q)
方法2:指定Overlay网络名称
如果你在Compose中定义了自定义Overlay网络(比如mysql-net),可以直接指定该网络来获取IP:
docker inspect --format '{{ .Name }} => {{ .NetworkSettings.Networks.mysql-net.IPAddress }}' $(docker ps -q)
关于容器名称的随机串
Swarm服务默认会给容器名称追加随机后缀,这是为了支持多副本部署时的唯一性。如果你的服务是单副本,确实可以固定容器名,但注意仅单副本服务可用,在Compose中添加container_name字段:
services: mysql: # ...其他配置 container_name: fixed-mysql-container # 固定容器名
内容的提问来源于stack exchange,提问作者Tanmay Bhattacharya
相关产品推荐
相关产品推荐

