docker-compose启动容器设network_mode:host后容器内部无法访问网络
问题描述
我在容器内运行NGINX,需要将请求代理到本地网络中的上游主机。
当我为容器配置network_mode: host通过docker-compose启动时,预期容器可以和宿主机/笔记本一样访问所有可连通的主机,但实际执行CURL时无法建立连接:
# curl http://127.0.0.1:8888/ curl: (7) Failed to connect to 127.0.0.1 port 8888: Connection refused
相关配置
docker-compose.yaml
version: "3.9" services: mynginx: build: context: ./ dockerfile: ./Dockerfile # Need to be able to access other hosts on network to proxy network_mode: host
host网络详情
执行docker network inspect host输出如下:
[ { "Name": "host", "Id": "5ed504e0e0ccb68011d7ce36e08489638e96f6dda88ab9e277aec81220528341", "Created": "2021-06-28T07:18:36.1419647Z", "Scope": "local", "Driver": "host", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "eac17355dd3004addb521d0ec9cca49cc28be99373260a8754cde9d92650ca21": { "Name": "gkpoc_gatekeeper_1", "EndpointID": "b4f0bf4c04cbf157c03d9f160caa8ffb31b79ef29639158f3cd5f17d9f27c943", "MacAddress": "", "IPv4Address": "", "IPv6Address": "" } }, "Options": {}, "Labels": {} } ]
解决方案
场景1:使用Docker Desktop(macOS/Windows环境)
host网络模式仅在原生Linux Docker环境下完全生效,Docker Desktop底层依赖虚拟化层运行Linux内核,network_mode: host绑定的是虚拟化层的虚拟机网络栈,而非物理宿主机的网络栈,此时访问127.0.0.1实际指向的是虚拟机内部端口,无法访问物理机上启动的8888端口服务。
这种场景不需要使用host网络,直接将请求地址中的127.0.0.1替换为Docker Desktop内置的宿主机域名host.docker.internal即可,即请求地址改为http://host.docker.internal:8888/。
场景2:原生Linux Docker环境
按以下步骤排查:
- 确认宿主机8888端口服务正常运行,且监听地址不是仅绑定指定网卡:执行
ss -tulpn | grep 8888查看监听地址,若显示监听地址为127.0.0.1:8888仅支持本地访问,若显示0.0.0.0:8888则支持所有网卡访问。 - 确认宿主机防火墙/iptables规则没有拦截8888端口的本地请求。
- 确认mynginx容器正常运行且成功加入host网络:执行
docker ps查看容器状态,再执行docker exec -it <mynginx容器ID> ip addr对比输出的网卡信息是否和宿主机一致,确认host网络配置生效。
内容的提问来源于stack exchange,提问作者Marc
相关产品推荐
相关产品推荐

