同一Docker自定义桥接网络内容器无法通过IP互访是什么原因?
Docker同网络容器端口无法访问问题解决方案
问题根源
核心问题是service_main的日志输出套接字绑定在了容器自身的环回地址127.0.0.1上:
- 容器内的
127.0.0.1仅对当前容器自身可见,不会暴露到Docker自定义桥接网络中 - 你之前同网络可正常通信的postgresql默认监听
0.0.0.0(所有网卡地址),因此可以通过容器IP直接访问,和当前场景的配置差异就在这里
可用解决方案
方案1:修改service_main的绑定地址(推荐)
将service_main的日志输出地址从127.0.0.1:6000改为0.0.0.0:6000,让端口监听在所有网卡上,同网络的其他容器就可以通过service_main的容器IP访问6000端口,无需额外配置expose或publish端口,Docker自定义同网络默认放开所有端口访问。
修改后无需调整现有docker-compose的网络、IP配置,仅修改service_main的启动参数即可。
方案2:共享网络命名空间
如果无法修改service_main的绑定地址,可以让两个容器共享网络栈,此时service_listener可以直接访问service_main的环回地址,配置示例:
version: "3" services: service_main: image: someimage1 networks: some_network: ipv4_address: 100.100.100.2 service_listener: image: someimage2 # 共享service_main的网络命名空间,无需再单独配置网络 network_mode: "service:service_main" entrypoint: some_app # 直接访问本地环回地址即可 command: listen 127.0.0.1:6000 networks: some_network: driver: bridge ipam: driver: default config: - subnet: 100.100.100.0/24 gateway: 100.100.100.1
之前尝试失败的原因
expose仅为端口声明标识,不会修改服务本身的网卡绑定逻辑,也不会放开端口访问限制publish是将容器端口映射到宿主机,前提是容器内的服务已经绑定到非环回地址,否则即使映射端口也无法访问- 你尝试修改日志输出到
100.100.100.21时,需要同时保证service_listener监听的是0.0.0.0:6000而非自身的127.0.0.1:6000,否则流量无法到达。
内容的提问来源于stack exchange,提问作者Archirk
相关产品推荐
相关产品推荐

