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

Mac M2本地Golang无法连接Docker中ScyllaDB集群求助

解决Mac M2上本地Go程序连接Docker ScyllaDB集群的问题

核心原因

Mac版Docker Desktop基于HyperKit虚拟机运行容器,默认bridge网络的容器IP属于虚拟机内部网段,主机无法直接访问,因此会出现ping不通容器IP、CQL端口连接超时的情况。同时你的docker-compose未配置端口映射,主机无法通过localhost访问容器内的Scylla服务。

分步解决方案

1. 修改docker-compose,添加端口映射

给每个Scylla节点添加ports配置,将容器的9042端口(CQL协议端口)映射到主机的不同端口:

services:
  scylla-node1:
    image: scylladb/scylla:latest
    restart: always
    container_name: scylla-node1
    command: --seeds=scylla-node1,scylla-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0
    volumes:
      - './scylla/scylla.yaml:/etc/scylla/scylla.yaml'
      - './scylla/cassandra-rackdc.properties.dc1:/etc/scylla/cassandra-rackdc.properties'
      - './scylla/mutant-data.txt:/mutant-data.txt'
    networks:
      - myappnetwork
    ports:
      - "9042:9042"  # 主机端口:容器端口

  scylla-node2:
    image: scylladb/scylla:latest
    restart: always
    container_name: scylla-node2
    command: --seeds=scylla-node1,scylla-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0
    volumes:
      - './scylla/scylla.yaml:/etc/scylla/scylla.yaml'
      - './scylla/cassandra-rackdc.properties.dc1:/etc/scylla/cassandra-rackdc.properties'
    networks:
      - myappnetwork
    ports:
      - "9043:9042"

  scylla-node3:
    image: scylladb/scylla:latest
    restart: always
    container_name: scylla-node3
    command: --seeds=scylla-node1,scylla-node2 --smp 1 --memory 750M --overprovisioned 1 --api-address 0.0.0.0
    volumes:
      - './scylla/scylla.yaml:/etc/scylla/scylla.yaml'
      - './scylla/cassandra-rackdc.properties.dc1:/etc/scylla/cassandra-rackdc.properties'
    networks:
      - myappnetwork
    ports:
      - "9044:9042"

networks:
  myappnetwork:
    driver: bridge

2. 确认Scylla配置文件关键参数

确保挂载的scylla.yaml中以下参数配置正确,避免服务仅绑定容器内部IP:

listen_address: 0.0.0.0
rpc_address: 0.0.0.0
broadcast_rpc_address: <你的主机IP或localhost>  # 可选,若集群需要对外广播地址

3. 修改Go连接代码,使用主机映射端口

将连接的hosts改为localhost:9042、localhost:9043、localhost:9044,对应docker-compose中映射的端口:

func Start(log logger.Logger) {
    // 使用主机映射的端口连接
    config := CreateCluster(gocql.Quorum, "catalog", "localhost:9042", "localhost:9043", "localhost:9044")
    session, err := gocql.NewSession(*config)
    if err != nil {
        log.Fatal(err, "db", "Start", "unable to connect to scylla")
    }
    defer session.Close()
}

4. 重启Scylla集群

执行以下命令重启容器,让配置生效:

docker-compose down
docker-compose up -d

额外说明

  • Mac Docker无法直接ping通容器内部IP是正常现象,因为容器运行在HyperKit虚拟机内,主机与容器的网络通过NAT转发,而非直接桥接。
  • 若使用host网络模式(Mac上Docker的host网络仅支持IPv6,IPv4有局限性),不建议作为生产或测试方案,端口映射是更可靠的方式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 20:08:29