ブロックチェーン・AI・システム開発の株式会社INDETAIL

Docker 再入門 (4) 〜 コンテナ連携その2 簡単なBlue-Green Deployment

2015.05.11
tacck

5月の連休も終わり、札幌の桜もピークを過ぎました。大通公園では、これからライラックのシーズンとなります。
GW中はほぼPCを触らずに、だいぶリフレッシュしたtacckです、こんにちは。

前回は、Dockerのコンテナ連携を使ってWebコンテンツの差し替えを行なってみました。
しかし、差し替えを行なう間はWebシステムが停止するような構成となっていました。

今回はもう少し発展させて、ダウンタイムのほぼ無い簡単なBlue-Green Deploymentを実現させてみたいと思います。

今回の環境

引き続き、Dockerのイメージを作るためにPackerを使います。
使い方は、私の以前の記事を参考に。

ホスト側の準備

今回は、ホストにnginxを導入しupstreamの設定を利用することでコンテナ切り替え時のダウンタイムを吸収するようにします。

/etc/nginx/sites-enabled/server

ファイルを配置したら、下記コマンド実行して利用可能な状態とします。

ここでは、ホストの8080番に接続が来た時にlocalhostの9080か9081のオンラインになっている方に接続する、という動きになるようにしています。
どちらもオンラインであれば、ロードバランサーとして両方に振り分ける動きとなりますが、オンラインとなるサーバが1つであればそちらだけに接続してくれるので、それを利用する形です。

上記ファイルを配置したら、nginxサーバの再起動を行なっておきましょう。

Dockerイメージ関連

今回は、nginxコンテナ用イメージ、Blueコンテナ用イメージ、Greenコンテナ用イメージ、の3つを作成します。

ファイルを下記のように配置して作業しています。

nginxコンテナ用イメージ

まずは、nginxコンテナ用イメージを作成します。

works/server.conf

works/packer-nginx.json

nginxコンテナ用イメージを作成します。

Blueコンテナ用イメージ

こちらは、下記のindex.htmlを配置しただけのイメージです。

works/site-blue/index.html

works/site-blue/packer-content.json

では、Blueコンテナ用イメージを作成します。

こちらも、簡単に作成できました。

Greenコンテナ用イメージ

こちらも、下記のindex.htmlを配置しただけのイメージです。
bodyタグ内の"blue"が"green"になっただけです。

works/site-green/index.html

works/site-green/packer-content.json

では、Greenコンテナ用イメージを作成します。

こちらも、問題なく作成できました。

ここまでで、下記のようなイメージが作成できていることが確認できます。

コンテナ作成と切り替え確認

Blueコンテナの構築と確認

では、まずBlueコンテナから作成して、コンテナの9080ポートとホストの8080ポートとを結びつけます。

ここでlocalhostの9080ポートへとアクセスすると、Blueコンテナのindex.htmlが取得できるはずです。
確認しましょう。

無事に取得できましたね。

同じく、8080ポートに接続しても、Blueコンテナのindex.htmlが取得できることを確認しましょう。

こちらでも無事に取得できました。

Greenコンテナの構築と確認

次にGreenコンテナを作成して、コンテナの9081ポートとホストの8080ポートとを結びつけます。

Blueのときと同じようにlocalhostの9081ポートへとアクセスすると、Greenコンテナのindex.htmlが取得できるはずです。
確認しましょう。

無事に取得できました。

BlueからGreenへ切り替え

現在は、下記のようにBlue・Greenの両コンテナともに起動した状態です。

では、Blueコンテナを停止して、再度localhostの8080ポートへ接続してみましょう。

狙い通りに、Greenコンテナのindex.htmlが表示されました。

再度Blueへ切り替え

では、再度Blueへ切り替えてみましょう。
状況としては、新しくデプロイしたアプリ(Greenコンテナ)にバグが見つかったため以前の状態(Blueコンテナ)に戻したい、、、というようなところですね。

はい、あっさりとBlueコンテナのindex.htmlに戻りました。

まとめ

前回・今回で、Dockerコンテナの連携、Blue-Green Deploymentへの応用、を行ないました。

実際の運用面を見据えたBlue-Green Deploymentとするためには、Jenkinsなどとの連携、切り替え処理のスクリプト化、など、やることは色々とありますが、そもそもの基盤を作るところがDockerによって簡単に実現できると感じている方も多いと思います。
また、切り替えの時間・コンテナ作成の時間はかなり短いので、開発に取り込むことができれば動作確認を気軽に行なうこともでき、結果的にプロダクトの品質もあげられると思います。

積極的に取り込んで、素敵な開発ライフを過ごしましょう。

関連タグ:

tacck Takuya KIHARA

エンジニア (モバイルアプリ、フロントエンド、バックエンド、インフラ) 得意なことは、領域をまたいで考え、開発すること。 ブログでは、主にAnsible、Docker、Raspberry Piのことを書いています。 好きなフィギュアスケートの技は、スプレッド・イーグルです。

「いいね」ボタンを押すと、最新情報をすぐに確認できます。