Docker或Podman容器内无法解析DNS问题多种解决方案

Docker或Podman容器内无法解析DNS问题多种解决方案

新安装了Centos8使用Podman,但是在容器内怎样都无法解析域名DNS。尝试了网上大多数的解决办法依然无效。在当我一筹莫展之时我想到了奥利给叔告诉过我“遇到什么困难,都不要怕!微笑的面对他”!

最终还是想到了是不是firewalld没有开启IP地址伪装(IP转发)功能。三下五除二赶紧执行firewall-cmd --query-masquerade。果然没有开启,开启后解决问题,瞬间晴朗。

下面是我和网络上其他人对于Docker容器内无法解析DNS地址的问题总结。

开机防火墙IP地址伪装(IP地址转发)功能

如果使用的是Centos(RHEL),并且没有关闭Firewalld防火墙,你需要留意是否开启了IP转发功能。

sudo firewall-cmd --query-masquerade返回的结果为no,则没有开启。yes则为已经开启了IP地址转发,如果问题没有解决,请继续往下看。

sudo firewall-cmd --add-masquerade --permanent && sudo firewall-cmd --reload开启IP地址转发并生效。开启后请再次尝试容器内是否可以正常解析域名。

如果你想了解更多关于firewalld,请看我的另一篇博文这可能是最全的firewalld防火墙常用指令教程

开启内核IP地址转发

cat /proc/sys/net/ipv4/ip_forward查看是否已经开启,0为关闭状态,1为开启状态。如果已经开启请尝试其他解决方案。

如果返回值为0,则为关闭状态。切换到root用户执行echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf,继续执行sysctl -p /etc/sysctl.conf使之永久生效。

之后需要重新启动网络服务来使IP地址转发功能生效:

如果你是Centos(RHEL)系,需要重新启动network服务。执行systemctl restart network重启服务后生效。

如果是Debian/Ubuntu系列的发行版,执行/etc/init.d/procps restart/etc/init.d/procps.sh restart生效。

配置一个正确的DNS

正常情况下,运行的容器会与主机使用相同的resolv.conf文件来进行DNS解析,也就是说如果在本机上可以正常解析域名,那么只要开启了IP地址转发的情况下,容器中也可以正常解析。

你可以先查看你的resolv.conf文件文件配置的是否正确。

cat /etc/resolv.conf

如果发现DNS服务器地址有误,你可以手动编辑此文件,但是NetworkManager会在下次启动时网卡时对该文件还原为它的配置。所以,我们直接使用NetworkManager来更改我们的DNS比较妥当些。如果你的网络不是由NetworkManager管理。你可以试试看直接修改/etc/resolv.conf文件。

执行sudo nmcli connection来查看当前所有网络连接。

sudo nmcli connection modify ethernet-eth0(你的网卡连接名) ipv4.dns=114.114.114.114

sudo nmcli connection up ethernet-eth0(你的网卡连接名)重启网卡,使手动配置的DNS生效。

强制Docker使用自定义的DNS地址

vim /etc/docker/daemon.json修改该文件,如果没有该文件的话直接新建即可。

1
2
3
4
5
6
# 修改该文件内容为如下全部文本,注意花括号也包括在内。DNS服务器我使用的是114DNS,你也可以进行更换。

{
"dns": ["114.114.114.114"]
}

希望这篇文章能解决你的问题!如果还是不行,请在评论区留言,将你的大致情况说说看,我们一起研究研究看。


我是一名Linux初学者,如果你与我一样喜欢折腾,喜欢Linux,那么请加入我的电报群:
https://t.me/yeefire_blog(Telegram),在这里畅所欲言,共同学习进步。