如何在Docker自定义网络中配置指向本地主机的host-network DNS映射
解决Docker自定义网络中访问本地SSH隧道端口的问题
核心原因
你之前尝试的extra_hosts: - "host.docker.internal:host-gateway"无效,是因为host-gateway指向的是主机物理网卡的IP,而你的SSH隧道仅绑定在本地回环(lo,127.0.0.1)上,主机的外部IP无法访问仅绑定在lo的端口。
可行解决方案
方案1:修改SSH隧道绑定地址(最简单)
将SSH隧道的本地绑定IP从127.0.0.1改为0.0.0.0,让端口开放在主机的所有IP上,包括Docker网关能访问的地址。
然后在你的docker-compose.yml中添加如下配置:
version: '3.8' networks: customnet: driver: bridge services: your-app: image: your-app-image networks: - customnet extra_hosts: - "host-network:host-gateway" # 将host-network映射到主机网关IP # 你的其他应用配置
此时容器内的host-network会解析到主机的网关IP,直接就能访问SSH隧道暴露的端口(比如MongoDB的27017)。
方案2:端口转发+自定义DNS映射(不修改SSH隧道)
如果不想修改SSH隧道的绑定地址,可在主机上用socat做端口转发,将Docker网关IP的端口转发到lo的隧道端口:
# 转发MongoDB端口(27017) socat TCP-LISTEN:27017,bind=172.17.0.1,fork TCP:127.0.0.1:27017 # 转发Postgres端口(5432)同理 socat TCP-LISTEN:5432,bind=172.17.0.1,fork TCP:127.0.0.1:5432
注:
172.17.0.1是Docker默认网桥的网关IP,若你的自定义网络网关不同,可通过docker network inspect customnet查看Gateway字段获取。
之后在docker-compose.yml中添加映射:
version: '3.8' networks: customnet: driver: bridge services: your-app: image: your-app-image networks: - customnet extra_hosts: - "host-network:172.17.0.1" # 替换为你的Docker网关IP # 你的其他应用配置
方案3:启用Docker的host.docker.internal(Linux专属配置)
Linux下Docker默认不支持host.docker.internal,需先修改Docker daemon配置:
- 编辑
/etc/docker/daemon.json(不存在则新建):
{ "extra_hosts": ["host.docker.internal:172.17.0.1"] }
- 重启Docker服务:
systemctl restart docker
之后在docker-compose.yml中直接使用自定义映射:
version: '3.8' networks: customnet: driver: bridge services: your-app: image: your-app-image networks: - customnet extra_hosts: - "host-network:host.docker.internal" # 你的其他应用配置
此方案同样需要配合SSH隧道绑定0.0.0.0,或用socat转发lo端口。
关键提醒
- 绝对不需要使用
--net=host,自定义网络+extra_hosts的组合完全能满足需求,还能避免端口冲突。 - 如果你的SSH隧道需要严格绑定lo(仅主机本地访问),方案2是最优选择,通过转发实现容器的间接访问。
内容的提问来源于stack exchange,提问作者Rajesh Paudel
相关产品推荐
相关产品推荐

