Golang客户端Docker容器连接MongoDB容器时出现不可达问题
解决Golang Docker容器无法连接MongoDB容器的问题
我来帮你排查这个连接问题,核心原因其实是Docker容器的网络特性——你在Go代码里用localhost:27017指向的是Go容器自己的localhost,而不是MongoDB容器的地址。下面是具体的修复步骤:
1. 修正Docker Compose配置
首先,我们需要给MongoDB服务添加完整定义,并且确保Go服务能通过服务名访问它。修改你的docker-compose.yml:
version: "3.3" services: api: image: golang:latest volumes: - .:/go working_dir: /go environment: - GOPATH=/go command: go run /go/src/main.go # 修正了命令的拼写错误,原命令的`main...`是不合法的 depends_on: - mongodb # 让API服务在MongoDB启动后再启动,保证依赖顺序 networks: - app-network mongodb: image: mongo:latest ports: - "27017:27017" # 可选映射端口,方便本地直接访问MongoDB networks: - app-network # 如果需要开启认证,可以添加以下环境变量 # environment: # - MONGO_INITDB_ROOT_USERNAME=admin # - MONGO_INITDB_ROOT_PASSWORD=yourpassword networks: app-network: driver: bridge
2. 修改Golang代码的连接字符串
把mgo.Dial里的地址从localhost:27017改成mongodb:27017(这里的mongodb就是Docker Compose里MongoDB服务的名称,Docker会自动在内部网络解析这个名称到对应容器的IP):
func main() { session, err := mgo.Dial("mongodb:27017") // 修改这里的连接地址 if err != nil { panic(err) } defer session.Close() session.SetMode(mgo.Monotonic, true) ensureIndex(session) }
3. 额外排查点
- 如果你的MongoDB设置了认证,记得在连接字符串里带上认证信息,格式为
mongodb://admin:yourpassword@mongodb:27017/ - 可以进入Go容器测试网络连通性:执行
docker exec -it <你的api容器名称> ping mongodb,如果能ping通说明网络层面没问题 - 检查MongoDB容器是否正常启动:执行
docker-compose logs mongodb查看日志,确认没有启动报错
按照这些步骤修改后,你的Go服务应该就能正常连接到MongoDB容器了。
内容的提问来源于stack exchange,提问作者ChrisAdkin
相关产品推荐
相关产品推荐

