cloudpack の 自称 Sensu芸人 の かっぱこと 川原 洋平(@inokara)です。
Dockerfile 発見
すでに自分の中で 2014 年ソフトウェア大賞にノミネートされている uchiwa ですが GitHub のリポジトリを眺めていて気づきました。Dockerfile が…。
作者の方も Docker で uchiwa にポータビリティを持たせたかったのかもしれません。
早速 Fork して…
Dockerfile を作成
以下のような Dockerfile を作成してみました。
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 | <pre class= "brush: bash; title: ; notranslate" title= "" >FROM centos RUN rpm -- import http: //ftp .riken.jp /Linux/fedora/epel/RPM-GPG-KEY-EPEL-6 RUN rpm -ivh http: //ftp .riken.jp /Linux/fedora/epel/6/x86_64/epel-release-6-8 .noarch.rpm RUN yum install -y git RUN yum -y install --enablerepo epel nodejs npm RUN npm install pm2@latest -g RUN mkdir -p /opt/uchiwa ADD . /opt/uchiwa RUN cd /opt/uchiwa ; npm install EXPOSE 3000 CMD [ "node" , "/opt/uchiwa/app.js" , "-c" , "/opt/uchiwa/config.js" ] < /pre > |
とりあえずコミットして自分のリポジトリに push します。
Docker Hub の Automated Build を利用させていただく
Docker Hub にアクセスして自分のリポジトリと関連付けをしておきましょう。
細かい設定についてはこちらを御覧ください。
config.js を修正して push しましょう
01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 | <pre class= "brush: bash; title: ; notranslate" title= "" >module.exports = { sensu: [ { name: 'API 1' , host: 'xxx.xxx.xxx.xxx' , ssl: false , port: 4567, user: '' , pass: '' , path: '' , timeout: 5000 } ], uchiwa: { user: 'hoge' , pass: 'hugabaz' , stats: 10, refresh: 10000 } }} } < /pre > |
修正したら commit からの push でリポジトリを更新します。
ビルドが開始されます
Automated build 便利ですね。
正常にビルドが終了すればオッケーです。
Uchiwa on Docker
docker run
docker pull からの docker run してみましょう。
1 2 3 | <pre class= "brush: bash; title: ; notranslate" title= "" >docker pull inokappa /uchiwa docker run -t -d 3000:3000 inokappa /uchiwa < /pre > |
アクセス
コンテナをホストしているインスタンスにブラウザからアクセスします。
一見、普通にホスト上で uchiwa が起動しているように見えますが、コンテナ内で起動しています。
Docker Hub の Webhook を使ったアプリケーションコンテナの自動デリバリ(デプロイ)
やりたいことのイメージ
Webhook 機能
uchiwa の話からは脱線してしまいますが Docker Hub に設置しているリポジトリには Webhook 機能が備わっています。詳細についてはドキュメント等を改めて読んでみたいと思いますが、この Webhook 機能を使えば docker build 後、docker push まで完了した後に何らかの処理をさせることが出来そうです。
Jenkins 先生にお願い
ということで Jenkins 先生にお願いして Automated Build が正常に終わったら Webhook で Jenkins の Build API を叩いて docker pull から docker run して uchiwa の自動デプロイを試してみたいと思います。
Jenkins の準備
すでに Jenkins が稼働している前提でジョブを作りましょう。
また、token も生成して設定しておきます。
Docker Hub の設定
WebHook に Jenkins のビルド API の URL を設定しましょう。token もお忘れなく。
設定したら Test Hook をクリックしてテストしてみましょう。
上記のように Jenkins 側で build が通ればオッケーです。お疲れ様でした。
あとは…
Dockerfile を煮るなり、焼くなりして都度、push すれば、自動的に新しいコンテナ環境を Jenkins が docker pull して起動してくれるでしょう。
注意点
今回、この自動デリバリ環境を作るにあたって以下のような点に注意する必要があるかと思います。
- Jenkins のビルド API をソース IP を絞ることが出来ない
- master ブランチ以外では push して自動ビルドが動かなかった
Jenkins のビルド API をソース IP を絞ることが出来ない
Webhook 機能が利用する IP を制御したかったが、IP アドレス帯は公開されておらず(自分が探した範囲では…)、また AWS で運用されているようで複数の IP からアクセスがあり絞り込むことが出来なかった。回避策としては…
- ビルド API は token を設定
- Web UI は認証を設定
- Jenkins のデフォルトポート以外で運用
上記の三点を設定して最低限のセキュリティを担保した。
master ブランチ以外では push して自動ビルドが動かなかった
設定に誤り、もしくは自分の認識違いがあるかもしれないので断言は出来ないが、master ブランチ以外に push した場合には docker build は自動実行されなかった。引き続き、調査したい。
まとめ
やったこと
- Uchiwa を Docker コンテナで動かしてみました
- ソースコードや設定を GitHub に push したタイミングで docker build が走る Automated build を利用しました
- Docker Hub の Webhook と Jenkins を組み合わせて Uchiwa コンテナを自動で実行させるようにしました
気づいたこと
- Uchiwa は簡単に Docker コンテナでも動かすことが出来そうです
- Automated Build と Webhook を上手に使うことでアプリケーションコンテナの自動デリバリを実現することが出来そうです
元記事はこちら