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
相关产品推荐
相关产品推荐

