iyuichiの私的開発ログ

渋谷で働くWebエンジニアのログ. Java, Android, iOS, Docker, GCP, AWS, ゲーム開発

CentOS7上でNodeをDockerで動かす ~ コンテナbuild時に名前解決ができない時にしたこと

docker composerを使ってnode.jsのコンテナをビルドしようとしたら結構はまったのでメモ。

環境としては、
ホスト: CentOS Linux release 7.2.1511 (Core)

$ docker version
Client:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   5604cbe
 Built:        Wed Apr 27 00:34:42 2016
 OS/Arch:      linux/amd64

Server:
 Version:      1.11.1
 API version:  1.23
 Go version:   go1.5.4
 Git commit:   5604cbe
 Built:        Wed Apr 27 00:34:42 2016
 OS/Arch:      linux/amd64

$ docker-compose --version
docker-compose version 1.7.1, build 0a9ab35

こんな感じです。

コンテナのイメージはDocker Hubにあるものを利用します。
https://hub.docker.com/_/node/
onbuildというイメージをベースに使うとnpm installしてnpm startしてくれるみたいなのでこれを使ってみることにしました。

Dockerfileには1行だけ記述してpackage.jsonと同じディレクトリに置きます。

FROM node:6-onbuild

docker composerも使うので、docker-composer.ymlを以下のように記述。
nodeappの下にDockerfileとpackage.jsonがあります。

version: '2'
services:
  node-app:
    build: ./nodeapp
    image: node-app:20160616

ファイルの構成としてはこんな感じ。

├── docker-compose.yml
└── nodeapp
    ├── Dockerfile
    ├── README.md
    ├── app.js
    └── package.json

これでdocker-compose up すればうまくいくはず!だったんですがnpm installでリポジトリが見つからずbuildのところで失敗。
DNSが引けてないんだろうというところまではすぐあたりがつきましたがその解決方法をググってやってみてもなかなかうまくいかず、はまりポイント。

自分の環境では、/etc/sysconfig/docker とか /etc/default/docker といったファイルがなく、
それぞれファイルを作って

DOCKER_OPTS="--dns 8.8.8.8"
OPTIONS="--dns 8.8.8.8"

なんて書いてdockerのサービスを再起動してみても状況が変わらず。

自分の環境でうまくいったのは、/usr/lib/systemd/system/docker.service を以下のように変更

ExecStart=/usr/bin/docker daemon -H fd:// 
↓
ExecStart=/usr/bin/docker daemon -H fd:// -dns=8.8.8.8

その後以下のようにデーモンの再読み込みとDockerのサービスを再起動をして解決!

$ sudo systemctl daemon-reload
$ sudo systemctl restart docker

とりあえずうまくいってよかった。