在启动时运行容器时,我注意到一些容器在systemd-resolve使用DHCP从默认值更新之前使用了resolv.conf。这意味着启动后过早启动的容器无法解决任何问题,需要重新启动才能使用正确的DNS设置。这是由于rkt和Docker的不同原因而发生的;Docker在容器内更新resolv.conf的方法与覆盖文件系统驱动程序不兼容,并且由于systemd-resolved不会在适当的位置更新文件(而是创建一个临时文件并重命名),rkt的绑定挂载不会更新容器看到的内容。
目前,我正在使用一个黑客系统。单位来延迟网络上线。目标是docker.service和我的rkt吊舱所依赖的。
[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更新。
在用户定义的网络上运行容器,以便它们使用嵌入式DNS服务器,该服务器将查找转发到系统DNS。
默认的docker0
网桥有一些特殊的规则,这些规则是为旧版支持而保留的。使用挂载的/etc/resolv.conf
就是其中一个遗留问题。
如果rkt不支持相同类型的DNS,那么一般的解决方案可能是设置一个像Unbound这样的DNS服务器作为本地转发解析程序。然后容器有一个静态DNS服务器可供参考。