Docker + Nginx (+ Fabric)でブルーグリーンデプロイを実現する

neocorno.hatenablog.com

に引き続き、今度は

1つのアプリケーションサーバにNginxとDockerコンテナ2つをホスティングすることでブルーグリーンデプロイを実現する方法を紹介する。

nulab-inc.com

を参考にしたが、改めて見ると参考というかそのまんまな気がしてきた。

実現したいこと

  • Dockerコンテナでアプリケーションを動かし、ダウンタイムを限りなく0に近い方法でデプロイしたい
  • デプロイ後に問題が発覚したら素早く元のバージョンに戻したい

使用したツール

  • Nginx
  • Docker Engine

方法

ブルーグリーンデプロイを行う。 アプリケーションサーバに2つのアプリケーションコンテナを用意し、片方は普段停止しておく。 もう片方の稼働しているコンテナにNginxがリクエストをフォワードしておく。 デプロイ時には停止しているコンテナを起動し、ソースコードをデプロイする(デプロイの仕方は自由。コンテナを新しく作り直しても良い)。 この間、もう片方のコンテナはそれまで通り稼働したままである。 デプロイに問題が起こっても、サービスが停止したりはしない。 デプロイが完了したらNginxのフォワード先を変更し、元のコンテナを停止する。

概要図

draw.ioで図を描いてみた。

f:id:neocorno:20160716155846p:plain

NginxはDockerコンテナじゃないの?

基本自分はあらゆるアプリケーション、ミドルウェアをDockerコンテナとして動かすべきなのではとまで思っているが、 今回のNginxはDockerコンテナではなくホストOSにインストールしている。 NginxをDockerコンテナとして動かす場合、Nginxコンテナ作成時にフォワードするコンテナをlinkオプションで指定しないといけず、 後からアプリケーションコンテナを作り直したりする際に困るため。

github.com

みたいに動的にフォワードできたら良いのだけれど、どうやるのかよくわからない。

Nginxのフォワード先の切り替え方

/etc/nginx/nginx.confから /etc/nginx/conf.d/upstream.confという設定ファイルをインクルードする。 それとは別に2つの設定ファイル /etc/nginx/conf.d/app1.confと /etc/nginx/conf.d/app2.confを用意し、 /etc/nginx/conf.d/upstream.confはこの2つの設定ファイルのどちらかへのシンボリックリンクとなっている。 このリンク先を切り替えることでフォワード先を切り替えている。