cloudpack の 自称 Sensu芸人 の かっぱこと 川原 洋平(@inokara)です。

Dockerfile 発見

すでに自分の中で 2014 年ソフトウェア大賞にノミネートされている uchiwa ですが GitHub のリポジトリを眺めていて気づきました。Dockerfile が…。

01

作者の方も Docker で uchiwa にポータビリティを持たせたかったのかもしれません。


早速 Fork して…

Dockerfile を作成

以下のような Dockerfile を作成してみました。

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"]

とりあえずコミットして自分のリポジトリに push します。

Docker Hub の Automated Build を利用させていただく

Docker Hub にアクセスして自分のリポジトリと関連付けをしておきましょう。

02

細かい設定についてはこちらを御覧ください。

config.js を修正して push しましょう

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
  }
}}
}

修正したら commit からの push でリポジトリを更新します。

ビルドが開始されます

Automated build 便利ですね。

03

正常にビルドが終了すればオッケーです。


Uchiwa on Docker

docker run

docker pull からの docker run してみましょう。

docker pull inokappa/uchiwa
docker run -t -d 3000:3000 inokappa/uchiwa

アクセス

コンテナをホストしているインスタンスにブラウザからアクセスします。

04

一見、普通にホスト上で uchiwa が起動しているように見えますが、コンテナ内で起動しています。


Docker Hub の Webhook を使ったアプリケーションコンテナの自動デリバリ(デプロイ)

やりたいことのイメージ

05

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 が稼働している前提でジョブを作りましょう。

06

また、token も生成して設定しておきます。

Docker Hub の設定

WebHook に Jenkins のビルド API の URL を設定しましょう。token もお忘れなく。

07

設定したら Test Hook をクリックしてテストしてみましょう。

08

上記のように 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 を上手に使うことでアプリケーションコンテナの自動デリバリを実現することが出来そうです

元記事はこちら