Docker

systemd起動のDockerでdnsオプションを有効にする

More than 1 year has passed since last update.


はじめに

Proxy配下のUbuntu上で docker build の際にdns設定で困ってしまいました。Dockerfileに書かれたyumの最中に、外部のネットワークに到達できずに止まってしまいます。

proxy設定はbuildのオプションで渡せますが、dnsのオプションはありません。対処方法をメモに残します。


環境


  • Ubuntu 16.04

  • Docker 1.12.1

Dockerはパッケージでインストールしています。


そもそもの原因


  • dockerのホストであるUbuntuでは、デフォルトでdnsmasq が有効になっていて、 /etc/resolv.confが下記のように自分を見る設定になっている。


/etc/resolv.conf

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)

# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 127.0.1.1
search xxx.jp


/etc/resolv.conf

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)

# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
search xxx.jp

nameserver 8.8.8.8
nameserver 8.8.4.4



  • docker build中にyumやらやっていると、proxyの名前解決をしようとして、8.8.8.8に問い合わせしようとするが、ネットワーク的に到達できずにこける。

ちなみにbuildしようとしているDockerfileはこちら。

https://github.com/Mashape/docker-java8/blob/master/Dockerfile

yumやらwgetやらやっています。


対応方法

はじめ、 /etc/default/docker を修正しましたが、設定が効きませんでした。dockerがsystemd起動なので、/etc/default のほうは見ないらしいです。

http://docs.docker.jp/engine/admin/systemd.html#custom-docker-daemon-options

を参考に以下のようにしています。


/etc/systemd/system/docker.service.d/docker.conf

[Service]

Environment="DOCKER_NETWORK_OPTIONS=--dns dnsサーバのIP"
ExecStart=
ExecStart=/usr/bin/dockerd -H fd:// $DOCKER_NETWORK_OPTIONS

本当はお作法的にはEnvironmentFileを設定してそちらにEnvironmentを書くべきだと思うのだけれど、どこにファイルを作るかを考えあぐねてこうなっています。

systemdのリロードとdockerの再起動。

$ sudo systemctl daemon-reload

$ sudo systemctl restart docker

念のためshowで確認。

$ systemctl show --property=Environment docker

Environment=DOCKER_NETWORK_OPTIONS=--dns\x20dnsサーバのIP HTTP_PROXY=http://your-proxy:port/

HTTP_PROXYを/etc/systemd/system/docker.service.d/http-proxy.conf で設定しているので一緒に見えています。

この状態で docker build したらやっと最後までできました。

$ docker build -t centos_java8 --build-arg http_proxy=http://your-proxy:port/ --build-arg https_proxy=http://your-proxy:port/  .


もしや

buildで引き渡すhttp_proxyをIPで書けばこんなことしなくてもいいんじゃネ、って気がしなくもないけど試してない。