どうも、自称 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