どうも、自称 docker 芸人の川原です。
はじめに
gistub という gist の互換ツールをローカルな環境で公開することになったが、お試しでという要望だったのでローカル PC の docker コンテナに作った gistub 環境をそのまま公開してみて、ああ、これが Blue-Green Deployment って言うのかしら*1...って思ったりしたのでメモ。
参考
やったこと
こんな感じ

概要
作業の概要は以下の通り。
- ローカル PC 内のコンテナに
gistub環境を構築(検証しながら手動で構築) - 適当な VM に
docker-registyで即席パーソナルリポジトリを構築 - で作ったコンテナを即席リポジトリに一旦
push
- で作ったコンテナを即席リポジトリに一旦
VM内でとりあえずpullしてrunして一旦公開- コンテナをデーモンモードで動かしたかったのでチョット修正
- デーモンモードで起動しておいて
proxyの切り替え
おお、Blue-Green Deployment か!?*2
ということで、以下は各作業のブレイクダウン。
ローカル PC 内のコンテナに gitub 環境を構築
- こっちの Dockerfile で構築(※デーモンモードで起動するコンテナ用)
- 特に難しいこと無し
docker-registry で社内に即席 docker リポジトリを構築
適当な VM で docker が利用出来るようにしてから以下のように 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 は以下のようなイメージ

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