nginx-proxy を使った Docker ベースの検証をしてたらリバースプロキシが急に表示できなくなった
メモとして残しておきます。
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 run するときにホストの /etc/localtime をコンテナの /etc/localtime にバインドしてやれば良かったのでした。
-v /etc/localtime:/etc/localtime:ro
なんで思いつかなかったんだろう。すごくシンプルで良いです。