みずりゅの自由帳

主に参加したイベントやソフトウェア技術/開発について記録しています

UbuntuデスクトップでDockerコンテナに任意のdnsを設定する

先日、ハマったproxy関連の対応についての続報。

mzryuka.hatenablog.jp

Ubuntu デスクトップ(19.04)でdnsの参照先が自身のIPアドレスしかない場合、コンテナ内の「/etc/resolv.conf」には勝手に「nameserver 8.8.8.8」「nameserver 8.8.4.4」が追加される。
そして、Proxy環境下ではこの設定が邪魔をして、elixirのmixコマンドが実行できなかった。

これに対応する場合の処理を見つけたので記述しておく。

docker run時に指定する場合

docker run時に指定する場合には、オプション「--dns=IPアドレス」を設定する。

# docker run --dns=192.168.xxx.yyy ~

docker build時に指定する場合

docker run時と異なり、docker build時にはdnsを明示的に指定するオプションがない。

そのため、そもそものコンテナ(イメージ?)の作成時に設定される「/etc/resolv.conf」の値をデフォルト値から変更する。

コンテナ内のデフォルトDNSを設定する

Docker コンテナのデフォルトDNSを設定する場合、ホストマシン上のDoockerサービスの設定ファイルである「/etc/docker/daemon.json」にdnsの設定を追記する。
ファイルが無い場合は、新規に作成する。(※ただし、root権限が必要)

dnsの設定は、json形式で「"dns": ["xxx.xxxx.xxxx.xxxx", "yyy.yyy.yyy.yyy",・・・]」で記述する。

今回は、自環境でコンテナ内の「/etc/resolv.conf」に自動で設定される「"192.168.26.2"」を指定した。この値については、自分の環境で有効な値に修正してくれればよい。
おまけとして、「"8.8.8.8"」「"8.8.4.4"」も追記しておいた。
順番的に、先頭のnameserverで探しにいってくれれば問題ないはず。

$ sudo vim /etc/docker/daemon.json
$ cat /etc/docker/daemon.json
{
  "dns": ["192.168.26.2", "8.8.8.8", "8.8.4.4"]
}

/etc/docker/daemon.jsonの値は、ホストマシン上のDockerサービスの値である。
そのため、値を読み込ませるためにDockerサービスを再起動させる。

$ sudo systemctl restart network-manager.service

Dockerサービスの再起動が完了すると、コンテナ内の「/etc/resolv.conf」に設定が反映される。
実際に、Dockerイメージ作成中に「/etc/resolv.conf」の値を出力してみたら以下のように出力された。

Step 5/9 : RUN set -x     && cat /etc/resolv.conf
 ---> Running in 1724551472ba
search localdomain
nameserver 192.168.26.2
nameserver 8.8.8.8
nameserver 8.8.4.4
+ cat /etc/resolv.conf

その後、Docker イメージ作成中に「mix local.hex」を実行してみたが、問題なく実施できた。

Step 7/9 : RUN set -x     && mix local.hex --force     && mix local.rebar --force     && mix archive.install hex phx_new ${PHX_VERSION} --force
 ---> Running in 049552c76df1
+ mix local.hex --force
* creating root/.mix/archives/hex-0.20.1
+ mix local.rebar --force
* creating root/.mix/rebar
* creating root/.mix/rebar3
+ mix archive.install hex phx_new 1.4.9 --force
Resolving Hex dependencies...
Dependency resolution completed:
New:
  phx_new 1.4.9
* Getting phx_new (Hex package)
All dependencies are up to date
Compiling 10 files (.ex)
Generated phx_new app
Generated archive "phx_new-1.4.9.ez" with MIX_ENV=prod
* creating /root/.mix/archives/phx_new-1.4.9

補足:参考情報

解決にあたり、以下の記事を参考にさせて頂いた。
最初はelixir(&mix)ベースで調査していたためなかなかたどり着けなかったが、ホストマシンがUbuntuでコンテナ側のresolv.confの値という観点で調べていくと、たくさん見つかった。

qiita.com

tsunokawa.hatenablog.com

twkmn.hateblo.jp

github.com

qiita.com

docs.docker.com

docs.docker.com