nginx-proxy を使った Docker ベースの検証をしてたらリバースプロキシが急に表示できなくなった

この記事は書かれてから1年以上が経過しており、最新の情報とは異なる可能性があります

メモとして残しておきます。

ansible-playbook で急に表示できなくなった

本番環境の 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年以上が経過しており、最新の情報とは異なる可能性があります

もし記事内に誤りなどございましたら、 @girigiribauer @girigiribauer.com までご一報いただけると助かります。

Related articles