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.

なんだこれ。

本番環境と検証環境

さらに、本番環境と検証環境とで同様にコンテナを作って比較してみると、 上記メッセージは表示されずに、問題なくコンテナが作成されました。

最後にググる

ここまでくるとローカルの環境に何かしら問題が起きた可能性があるので、 先ほどのメッセージも加味して調べると、以下のような情報が引っかかりました。

ipv4 Forwarding and Docker chrisgilmerproj.github.io

どうやら 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 だったので、 これなんとかならんかなーと思って少し寄り道して調べてたのですが、 スマートな方法があったのでついでに。

Dockerでホストと同じタイムゾーンをコンテナ起動時に設定する - Qiita イメージのタイムゾーンは基本的にUTCになっています。 $ docker run --rm -ti ubuntu date Mon Nov 10 05:16:46 UTC 2014 … qiita.com Dockerでホストと同じタイムゾーンをコンテナ起動時に設定する - Qiita

docker run するときにホストの /etc/localtime をコンテナの /etc/localtime にバインドしてやれば良かったのでした。

-v /etc/localtime:/etc/localtime:ro

なんで思いつかなかったんだろう。すごくシンプルで良いです。