问题

服务部署于docker容器中,而MongoDB部署在宿主机,在docker容器中访问mongodb://localhost:27017会返回TimedOut

分析

容器与宿主机之间的连接有bridgehost,默认是bridge,也可以是none

当连接模式为bridge时,docker通过docker0虚拟网桥与宿主机连接。

bridge 对宿主机来讲相当于一个单独的网卡设备 对于运行在宿主机上的每个容器来说相当于一个交换机,所有容器的虚拟网线的一端都连接到docker0上。

通常,面对这种情况可以创建自定义网络来解决。但是,如非复杂的需求,创建自定义网络并非最优解。

另一种连接方式host则会与宿主机共用网络。换而言之,容器可以任意访问宿主机本地换回端口,宿主机也可以任意访问容器开放的端口。当然,带来的弊端是容器开放的端口不能与宿主机冲突。

只要将连接方式改为host,便可以实现容器与宿主机MongoDB的连接。

解决

  • docker: 命令加入--net=host参数;

  • docker-compose: 在docker-compose.yaml中加入network_mode: host

参考