在启动时运行容器时,我注意到有人在使用systemd-resolved使用DHCP将其更新为默认值之前使用了resolv.conf。这意味着在启动后启动太早的容器无法解决任何问题,需要重新启动才能使用正确的DNS设置。出于rkt和Docker的不同原因而发生这种情况; Docker用于更新容器内部的resolv.conf的方法是not compatible with the overlay filesystem driver,并且由于systemd-resolved不会就地更新文件(而是创建一个临时文件并重命名),因此rkt的绑定(bind)安装不会更新容器看到的内容。
目前,我正在使用hacky systemd.unit来延迟docker.service和我的rkt pod所依赖的network-online.target。
[Unit]
Description=Wait for DNS
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/sh -c 'while ! getent ahosts google.com >dev/null; do sleep 1; done'
[Install]
WantedBy=network-online.target
但这大大延迟了我的启动时间
# systemd-analyze blame
18.068s wait-for-dns.service
...
如果resolv.conf再次更改,将无济于事。所以我想知道是否有一个更优雅的解决方案来解决我的问题。理想情况下,我希望能够在每次更改时在rkt和Docker容器中触发resolv.conf更新。
最佳答案
在user defined network上运行容器,以便它们将使用embedded DNS server将查询转发到系统DNS。
默认的docker0
桥具有一些保留旧支持的特殊规则。使用已挂载的/etc/resolv.conf
是这些遗留事物之一。
如果rkt不支持相同类型的DNS,那么一般的解决方案可能是将DNS服务器(如Unbound)设置为local forwarding resolver。然后,容器具有要引用的静态DNS服务器。
关于docker - 如何触发容器中resolv.conf的重新加载?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47297238/