メモとして残しておきます。
本番環境の CentOS7 と、その検証環境(Vagrant on Mac)で
Ansible 経由で Docker をインストールして使っていたのですが、
ある日 ansible-playbook
を実行すると急に表示できなくなりました。
(Chef を使ってたころはこういうの頻発してたなあ・・・)
その間は Vagrant のアップデートくらいしかしてなかったので、 順に確認していくことに。
nginx-proxy のログは
lrwxrwxrwx 1 root root 11 Aug 24 03:51 access.log -> /dev/stdout
lrwxrwxrwx 1 root root 11 Aug 24 03:51 error.log -> /dev/stderr
のような感じで、特に何も指定してなければ外にログとして出るようになってます。
docker logs -f nginx-proxy
などとしてログを表示させたりしても特に問題は見受けられず。
また、 /etc/nginx/conf.d/default.conf のファイルも特に問題なく、 コンテナが作られると適切に設定が書き換わっているようでした。
次に ansible のレイヤーで問題が起きている可能性を考えて、 自動で作った Docker コンテナをそのまま手動で作ってみました。
するとコンソールに見慣れないメッセージが。
WARNING: IPv4 forwarding is disabled. Networking will not work.
なんだこれ。
さらに、本番環境と検証環境とで同様にコンテナを作って比較してみると、 上記メッセージは表示されずに、問題なくコンテナが作成されました。
ここまでくるとローカルの環境に何かしら問題が起きた可能性があるので、 先ほどのメッセージも加味して調べると、以下のような情報が引っかかりました。
http://chrisgilmerproj.github.io/ubuntu/network/docker/2013/09/05/ipv4-forwarding-and-docker.html
どうやら sysctl
コマンドでカーネルパラメータを変更して、
IPv4 を有効にしてやる必要があるようなのですが、
正直どうしてこうなった感が満載です。
うーん・・・今まで問題なく動作していたんですが。 (とはいえ、ここから先の原因追求は不毛なのでやめておきます。)
ローカルの VM にのみ起きる問題であるため、こちらについては Ansible で行おうとせず、 その手前の Vagrantfile で VM を作る段階で差分を吸収することにします。
config.vm.define "vmname" do |node|
# for docker networking
node.vm.provision "shell", :inline => "sudo sysctl -w net.ipv4.ip_forward=1", run: "always"
end
調べる途中で nginx-proxy のログのタイムゾーンが UTC だったので、 これなんとかならんかなーと思って少し寄り道して調べてたのですが、 スマートな方法があったのでついでに。
http://qiita.com/ganta/items/a0f34866c994ebaeef69
docker run するときにホストの /etc/localtime をコンテナの /etc/localtime にバインドしてやれば良かったのでした。
-v /etc/localtime:/etc/localtime:ro
なんで思いつかなかったんだろう。すごくシンプルで良いです。
この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります