如何在支持端口转发的前提下从Docker容器内访问本地MongoDB
解决方案
问题根因
你遇到的报错本质是两个配置不匹配导致的:
- 配置
extra_hosts: ["host.docker.internal:host-gateway"]后,容器内需要用host.docker.internal代替localhost指向主机,你当前代码仍在请求容器自身的localhost:27017,自然连接被拒绝 - Ubuntu系统下MongoDB默认仅绑定
127.0.0.1,仅接受本地环回地址的请求,Docker网桥发来的请求会被直接拦截
操作步骤
- 修改MongoDB监听配置
编辑主机上的MongoDB配置文件/etc/mongod.conf,找到net配置段,修改bindIp参数:
net: port: 27017 bindIp: 127.0.0.1,172.17.0.1 # 172.17.0.1为Docker默认网桥网关,生产环境请勿直接设为0.0.0.0
修改后执行sudo systemctl restart mongod重启MongoDB服务生效。
修改应用Mongo连接地址
将你代码中Mongo连接串的localhost:27017替换为host.docker.internal:27017即可。补充端口转发配置
直接在docker-compose.yml的对应服务下添加ports配置即可,完全不影响主机MongoDB的访问,完整示例:
version: '3.9' services: engine: build: . entrypoint: - /bin/bash extra_hosts: - "host.docker.internal:host-gateway" ports: - "8080:8080" # 按需替换为你需要转发的端口,可添加多条规则
- 连通性验证
进入容器执行curl host.docker.internal:27017,如果返回It looks like you are trying to access MongoDB over HTTP on the native driver port.则说明连接正常。
后续跨系统适配说明
后续需要适配OS X、Windows系统时,这两个系统的Docker默认已内置host.docker.internal指向主机,仅需要保留连接串的host.docker.internal配置,不需要额外加extra_hosts参数即可通用。
内容的提问来源于stack exchange,提问作者herdogan
相关产品推荐
相关产品推荐

