CentOS8にDockerを入れると、コンテナが名前解決できない
いま巷で話題の(?)CentOS8で、Dockerを使いたいなと思ってハマりました。
はまりポイント1
現時点で、DockerはCentOS8にインストールしようとすると、以下のように表示されてインストールできません。
エラー: 問題: package docker-ce-3:19.03.5-3.el7.x86_64 requires containerd.io >= 1.2.2-3, but none of the providers can be installed - cannot install the best candidate for the job - package containerd.io-1.2.10-3.2.el7.x86_64 is excluded - package containerd.io-1.2.2-3.3.el7.x86_64 is excluded - package containerd.io-1.2.2-3.el7.x86_64 is excluded - package containerd.io-1.2.4-3.1.el7.x86_64 is excluded - package containerd.io-1.2.5-3.1.el7.x86_64 is excluded - package containerd.io-1.2.6-3.3.el7.x86_64 is excluded (try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)
解決方法
メッセージにあるとおり、--nobest
を付けることで最新バージョンではありませんがインストールできます。
# dnf install --nobest docker-ce containerd.io
はまりポイント2
インストールできたのは良いものの、コンテナ内から名前解決ができません。
コンテナ内の/etc/resolv.conf
にも正しいDNSサーバが記載されており、そのDNSサーバへのping疎通もあります。
確認したのは、fedora:latest, debian:latestです。
fedora:latestはpingすら入っていませんでしたが、curlで名前解決できず。
deban:latestではpingを行うと、以下のようなメッセージが表示されました。
root@test:/# ping www.google.com ping: www.google.com: Temporary failure in name resolution
解決方法
CentOS8から採用されたnftablesが原因(正確には、Dockerがnftablesを設定できないことが原因)のようです。
ルールが不足しているか、適切に設定されていないものと推測しています。
iptablesを利用する(ついでにfirewalldを止める)ことで問題が解消することを確認しました。
CentOS8側で以下のようにします。
# systemctl stop firewalld # systemctl disable firewalld # dnf install iptables-services # systemctl enable iptables # systemctl start iptables
もし元々firewalldサービスを止めていて、nftablesサービスを動かしていた場合は、nftablesサービスを止めると良いかと思います。
最近のコメント