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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 09:41:41