1

在启动时运行容器时,我注意到一些在 systemd-resolved 使用 DHCP 从默认值更新之前使用 resolv.conf。这意味着启动后过早启动的容器无法解决任何问题,需要重新启动才能使用正确的 DNS 设置。对于 rkt 和 Docker 来说,发生这种情况的原因各不相同;Docker 更新容器内 resolv.conf 的方法与覆盖文件系统驱动程序不兼容,并且由于 systemd-resolved 不会就地更新文件(而是创建一个临时文件并重命名),rkt 的绑定安装不会更新容器看到的内容。

目前我正在使用一个 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 更新。

4

1 回答 1

0

在用户定义的网络上运行容器,以便它们使用嵌入式 DNS 服务器,将查找转发到系统 DNS。

默认docker0网桥有一些特殊的规则,这些规则是为遗留支持而保留的。使用挂载/etc/resolv.conf是那些遗留问题之一。

如果 rkt 不支持相同类型的 DNS,那么一般的解决方案可能是设置一个像Unbound这样的 DNS 服务器作为本地转发解析器。然后容器有一个静态 DNS 服务器可以引用。

于 2017-11-15T00:07:26.650 回答