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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 04:22:58