2015年4月22日水曜日

Docker を利用した Web アプリケーションのデプロイ(私の場合)

先日、「クックパッド開発者ブログ」で「Docker を利用した Web アプリケーションのデプロイ」という記事があがっていた。
僕の関わっているプロダクトでもDockerを採用していて、ほとんどデプロイの仕方が同じだった。

私の構成

クックパッドさんと異なる点としては
・Nginxもコンテナとして起動している
・UnixソケットではなくコンテナのIPを直接してアプリケーション・サーバーと繋げている
というところ。

あと環境変数の共有とかはいまのところ必要性を感じていないのでやっていない。

うちのNginxの設定はちょっとトリッキーかもしれない。
設定ファイルはerbテンプレートから出力する。変数は環境変数として持っておく。

Nginxの向き先を新しいアプリケーション・サーバーに向けるスクリプトはこんな感じだ。

# switch.sh
export WEBAPP_HOST=${1}
erb /docker/etc/nginx.conf.erb > /etc/nginx/nginx.conf
/etc/init.d/nginx reload

そしてこれがNginxの設定ファイルのテンプレートの一部

/docker/etc/nginx.conf.erb
location / {
  proxy_pass http://<%= ENV['WEBAPP_HOST'] %>/;
}

Nginxに限らず多くの設定ファイルがerbテンプレートを使用している。
基本的に設定の変数には環境変数を使っていきたいと考えたが、多くの設定ファイルは環境変数を参照するといったことはできない。sedなどでは対応しにくいパターンもある。なのでなるべく柔軟に対応できるようにテンプレートシステムを使うことにした。erbにこだわりがあるわけではなくphpでもよかったと思う。
最初に導入したのがruby製であるfluentdの設定ファイルを作成していたときなので自然と?erbになってしまっただけだ。

実際のオペレーション方法

基本的なオペレーションはAnsibleで包んでいる。

だから新しいAPIサーバーをデプロイするには下記のようなコマンドを実行するだけでいい。(versionはコンテナ名のSuffixになる)

ansible-playbook -i hosts/production playbooks/api-server-start.yml -e "version=1"
ansible-playbook -i hosts/production playbooks/reverse-proxy-switch.yml -e "version=1"

ansible-playbookを実行するWebフロントエンドも開発済みで開発環境では既にAnsibleのコマンドを叩く必要もないところまで自動化できている。

課題

Dockerによるデプロイ体制は整ってきたが、気になっているのが修正の反映をするのにかかる時間だ。
ソースを修正して環境に反映するのには下記の手順が必要になる。

  1. ソースを修正する
  2. Dockerイメージをビルドする
  3. docker pushする
  4. docker pullする
  5. イメージを起動する
  6. リバースプロキシの向き先を変える

たった1行のコード修正であろうと 2~4 の手順にどうしても時間がかかってしまう。
git pullするだけで反映が終わるような仕組みも用意すべきか否か悩んでいる最中だ。



0 件のコメント:

コメントを投稿