CentOS7サーバ上DockerコンテナでDNS解決されない時は

2019-09-23

dockerコンテナ内でDNS名前解決されない

本番サーバーを以下の環境で構築する場合。

  • CentOS7
  • Docker

Dockerコンテナ内から外部のエンドポイントにアクセスするとき、DNS名前解決できず困ったことがある。 以下の2つのうちどちらかの方法でコンテナにDNSを指定することで解決できた。

docker-compose.ymlでDNS直接指定

docker-compose.ymlに以下のように記述。

version: '3.3'
services:
  app:
      restart: always
      dns: 8.8.8.8

resolv.confマウント

以下のresolv.confを作成し、コンテナ内の/etc/resolv.confにvolumeマウント。

search google.internal
nameserver 8.8.8.8
options ndots:0

サーバー再起動後にdockerコンテナ内でDNS名前解決されない

上記対策をしたにも関わらず、サーバーがrebootした後、DNSによる名前解決がなされないことがある。

docker.serviceが起動する時に、network-online.targetが先に起動していることが必要で、docker.serviceの[Unit]はデフォルトで以下のようになっている。

[Unit]
Description=Docker Application Container Engine
Documentation=https://docs.docker.com
BindsTo=containerd.service
After=network-online.target firewalld.service containerd.service
Wants=network-online.target
Requires=docker.socket

これでもなぜかサーバーのネットワークの設定が終わりきる前にdocker.serviceが起動してしまうことがあるのだ。そんな時はdocker.serviceの[Service]に以下を追加するという情報を発見。

[Service]
ExecStartPre=/bin/sleep 5

5秒待つという無理やりな方法。しかしこれで問題なく起動した。
参考: https://github.com/clearlinux/distribution/issues/157