# 查看当前Docker使用的DNS配置
docker run --rm alpine cat /etc/resolv.conf
# 在daemon.json中指定DNS服务器
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
EOF
# 重启Docker服务
sudo systemctl restart docker
# 运行容器时直接指定DNS服务器
docker run --dns 8.8.8.8 --dns 8.8.4.4 -it alpine ping example.com
# 查看容器网络详情
docker inspect <container_id> | grep -i dns
# 创建自定义网络并指定DNS
docker network create --driver bridge --subnet 172.25.0.0/16 \
--gateway 172.25.0.1 --dns 8.8.8.8 my_network
# 进入容器检查DNS配置
docker exec -it <container_id> sh
cat /etc/resolv.conf
nslookup example.com
ping -c 4 8.8.8.8
# 使用宿主机的网络栈
docker run --network host -it alpine ping example.com
# 检查iptables规则
sudo iptables -L -n -v
# 临时开放DNS端口(53)
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 53 -j ACCEPT
使用dig工具深入分析:
docker run --rm -it tutum/dnsutils dig example.com
检查Docker日志:
journalctl -u docker.service -n 50 --no-pager
测试不同网络模式:
for net in bridge host none; do
echo "Testing $net network:"
docker run --rm --net=$net alpine ping -c 2 example.com
done
使用自定义resolv.conf:
echo "nameserver 8.8.8.8" > custom_resolv.conf
docker run -v $(pwd)/custom_resolv.conf:/etc/resolv.conf alpine ping example.com
在Docker Compose文件中预先配置DNS:
services:
app:
dns: 8.8.8.8
dns_search: example.com
定期检查Docker网络插件和驱动更新
在企业环境中配置内部DNS服务器并确保容器可访问
文档化网络配置要求,特别是对于生产环境
通过以上方法,可以系统地排查和解决Docker容器中的域名解析问题。根据具体环境选择最适合的解决方案。