树莓派Docker部署Pi-hole与OpenVPN,能否用容器名作为推送DNS地址?
用容器名作为DNS地址的方案完全可行!
当然可以用push "dhcp-option DNS pihole"代替固定IP,这其实是Docker用户定义网络的原生能力,比固定IP配置更灵活省心。下面给你拆解具体实现步骤:
核心原理
Docker的自定义网络(非默认bridge)默认支持容器名称解析——同一个网络内的容器可以直接用对方的容器名互相访问,Docker内置的DNS服务会自动把容器名解析为对应的容器IP。只要你的OpenVPN和Pi-hole容器处于同一个自定义网络中,这个配置就能正常生效。
具体配置步骤
1. 让两个容器共享同一个自定义网络
在你的docker-compose.yml里定义一个共同的网络,然后将两个容器都加入该网络:
version: '3.8' # 定义共享的自定义网络 networks: vpn-dns-network: driver: bridge services: pihole: image: pihole/pihole:latest container_name: pihole # 容器名必须和push指令里的名称完全匹配 # 你的Pi-hole其他配置(ports、volumes、environment等) networks: - vpn-dns-network openvpn: image: kylemanna/openvpn:latest # 你的OpenVPN其他配置(ports、volumes等) # 修改push配置,用容器名替代固定IP environment: - OPENVPN_PUSH=dhcp-option DNS pihole # 如果你是通过挂载server.conf配置OpenVPN,直接在server.conf里修改: # push "dhcp-option DNS pihole" networks: - vpn-dns-network
2. 验证配置是否生效
- 重启容器:
docker-compose up -d - 连接VPN后,在客户端查看DNS服务器地址,应该会指向Pi-hole容器的IP
- 可以进入OpenVPN容器测试名称解析:
docker exec -it openvpn ping pihole,如果能正常ping通,说明解析功能正常
注意事项
- 容器名大小写敏感,确保
pihole和你push指令里的名称完全一致 - 优先使用自定义网络而非Docker默认bridge网络,自定义网络的隔离性和名称解析稳定性更好
- 不需要再给Pi-hole固定IP了,即使Docker重启后给Pi-hole分配了新IP,容器名解析依然会自动同步,比固定IP更可靠
内容的提问来源于stack exchange,提问作者Pierre CORBEL
相关产品推荐
相关产品推荐

