ようへいの日々精進XP

よかろうもん

gistub を公開するのに docker 使ってみて Blue-Green Deployment をちょっと体感した

どうも、自称 docker 芸人の川原です。

はじめに

gistub という gist の互換ツールをローカルな環境で公開することになったが、お試しでという要望だったのでローカル PCdocker コンテナに作った gistub 環境をそのまま公開してみて、ああ、これが Blue-Green Deployment って言うのかしら*1...って思ったりしたのでメモ。


参考


やったこと

こんな感じ

f:id:inokara:20140320084838p:plain

概要

作業の概要は以下の通り。

  1. ローカル PC 内のコンテナに gistub 環境を構築(検証しながら手動で構築)
  2. 適当な VMdocker-registy で即席パーソナルリポジトリを構築
    1. で作ったコンテナを即席リポジトリに一旦 push
  3. VM 内でとりあえず pull して run して一旦公開
  4. コンテナをデーモンモードで動かしたかったのでチョット修正
  5. デーモンモードで起動しておいて proxy の切り替え

おお、Blue-Green Deployment か!?*2

ということで、以下は各作業のブレイクダウン。

ローカル PC 内のコンテナに gitub 環境を構築

  • こっちの Dockerfile で構築(※デーモンモードで起動するコンテナ用)
  • 特に難しいこと無し

docker-registry で社内に即席 docker リポジトリを構築

適当な VMdocker が利用出来るようにしてから以下のように docker-registry コンテナを起動する。

sudo docker run -p 5000:5000 -d stackbrew/registry

とっても簡単にプライベート docker リポジトリが出来上がる。詳しい使い方等はこちらが参考になる。

ローカル PC で作ったコンテナを docker リポジトリに push

上記で作った gistub 入りのコンテナを以下のようにしてプライベート docker リポジトリに push する。

sudo docker push ${docker_registry_hostname}:5000/gistub

ちょっと大きいので時間がかかるかも。

一旦公開

プライベート docker リポジトリpush したコンテナを VM 内で起動する。

sudo docker run -i -t -p 3000 ${docker_registry_hostname}:5000/gistub /bin/bash

コンテナが起動したら gistub を起動する。

cd /var/gistub/gistub
bin/rails s

gistub はコンテナのポート 3000 番で Listen するので VM で動いている Web サーバー(Nginx 等)でプロキシしてあげるとコンテナ外のクライアントからもアクセスすることが出来る。Nginx の場合は以下のようにすればいい。

server {
    listen       1919;
    server_name  gistub.intra;
    access_log   /var/log/nginx/gistub.intra.access.log;

    location / {
        proxy_pass http://${container_IP}:3000;
    }
}

ちょっと修正して改めて公開

当初はコンテナをデーモンモードで起動するようにしてなかったので以下のように修正してデーモンモードで起動するように修正。

EXPOSE 3000
RUN cd /var/gistub/gistub
CMD /var/gistub/gistub/bin/rails s

修正したコンテナをデーモンモードで起動、コンテナの IP を確認して上記の Nginx プロキシを修正して改めて公開。

gistub は以下のようなイメージ

f:id:inokara:20140320064105p:plain

簡単に構築出来て、使い易い!


  • 色々楽ちんだった
  • gistub 自身の構築が一番時間が掛かったような気がする
  • バックアップはどうしよう...なんて悩まずコンテナごとバックアップするのが良さそう
  • 言わなきゃ誰も気づかない手動 Blue-Green Deployment の事例でしたw

*1:大げさ

*2:またまた、大げさ...