Docker中Host网络容器与桥接容器主机名DNS解析失效问题解决
解决Host网络容器与自定义桥接容器的主机名DNS解析问题
问题根源
使用network_mode: host的容器会直接复用宿主机的网络栈,包括DNS解析规则;而Docker自定义桥接网络(如配置中的local)自带的DNS服务仅对加入该网络的容器生效,因此host模式的app2无法通过Docker内置DNS解析到自定义桥接网络里app1的主机名。
可行解决方案
方法1:修改宿主机hosts文件
直接在宿主机的/etc/hosts中添加app1的主机名与固定IP的映射,host模式容器会自动继承宿主机的hosts配置:
echo "10.0.0.8 app1" >> /etc/hosts
执行后,app2内部访问app1时会直接解析到10.0.0.8。
方法2:给host模式容器挂载自定义hosts文件
若不想修改宿主机全局hosts,可为app2单独挂载自定义hosts文件,修改docker-compose.yml中app2的配置:
app2: container_name: app2 hostname: app2 image: app2/app2 restart: always network_mode: host volumes: - /host:/container - ./custom_hosts:/etc/hosts
在宿主机当前目录创建custom_hosts文件,需包含必要的本地映射和app1的解析规则:
127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 10.0.0.8 app1
方法3:调整宿主机DNS配置,引入Docker自定义桥接DNS
Docker自定义桥接网络的DNS服务器地址通常是该网络的网关IP(默认是子网的第一个IP,如10.0.0.1)。在宿主机的/etc/resolv.conf中添加该DNS服务器:
nameserver 10.0.0.1
这样宿主机及host模式容器的DNS查询会优先访问Docker内置DNS,从而解析到app1的主机名。注意此操作会影响宿主机整体DNS解析逻辑,需根据实际场景评估是否适用。
内容的提问来源于stack exchange,提问作者BulBul
相关产品推荐
相关产品推荐

