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サービスを止めると良いかと思います。

おすすめ

コメントを残す

Amazon プライム対象