HRForecastのdocker imageを作成してみた。

# HRForecastのdocker imageを作ってみた。

[docker](http://www.docker.io/)というものに前から興味があるので、作ってみた。

![スクリーンショット 2014-01-13 21.28.02.png](https://qiita-image-store.s3.amazonaws.com/0/3985/576bffed-5dd2-b1a7-2063-55b2f4d9cd87.png)

## 動かし方

[dockerのVagrantfile](https://github.com/dotcloud/docker/blob/master/Vagrantfile)を参考にして、
[github.com/futoase/docker-tempate](https://github.com/futoase/docker-template) を git cloneし、vagrant up --provisionを行えば良いようにしてみた。



```
> git clone https://github.com/futoase/docker-template
> cd docker-template/hrforecast
> vagrant up --provision
```

以上のコマンドを実行し、

http://192.168.33.100/

にアクセスすれば立ち上がったHRForecastのindex pageが出る。
APIに向けてcurlコマンドを実行しても問題がない。
よかった。作れた。

**2014/1/21更新**

[TrustedBuildというgithub連携の仕組み](http://blog.docker.io/2013/11/introducing-trusted-builds/)を利用するようにした。
合わせて、リポジトリも作りなおした。

https://index.docker.io/u/futoase/docker-hrforecast/

リポジトリの対象が変わったため、以下の形でhrforecastのdocker containerを立ち上げ、アクセスを行う。

```
> git clone https://github.com/futoase/docker-hrforecast.git
> cd docker-hrforecast
> vagrant up --provision
> open http://192.168.33.100/
```

# docker imageを作るまで

以下の環境でdocker imageを作り、
docker pushを行ってdocker indexに登録するまでの流れを実践してみた。


## docker が動く Vagrant box を利用する

自分の開発環境はMac OS Xなので、
dockerリポジトリに有るVagrantfileを利用し、
Vagrant boxを利用する。

[github.com/dotcloud/docker](https://github.com/dotcloud/docker) のリポジトリをgit cloneする。

```
> git clone https://github.com/dotcloud/docker.git
> cd docker
```

そのあと、vagrant up --provisionを実行する。
これでvagrantの環境が立ち上がる。

## Dockerfileを作成する

Dockerfileを作成する。

HRForecastをインストールするため、
以下の環境を構築した。

- perl-5.18を利用する
- mysqlをインストールする
- nginxを使ってHRForecastとのリバースプロキシとして利用する
- mysqladminにてHRForecastが利用できるDB userを作成する
- schema.sqlを使ってHRForecast向けのDBを作成する
- HRForecastのconfig.plを環境に合わせた形に変える

作成したDockerfileが長い。
デバッグ用にopenssh-server入れたりしてる。

```csh
FROM centos
 
MAINTAINER Keiji Matsuzaki <futoase@gmail.com>
 
# setup network
# reference from https://github.com/dotcloud/docker/issues/1240#issuecomment-21807183
RUN echo "NETWORKING=yes" > /etc/sysconfig/network
 
# setup remi repository
RUN wget http://dl.fedoraproject.org/pub/epel/6/i386/epel-release-6-8.noarch.rpm
RUN wget http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
RUN curl -O http://rpms.famillecollet.com/RPM-GPG-KEY-remi; rpm --import RPM-GPG-KEY-remi
RUN rpm -Uvh remi-release-6*.rpm epel-release-6*.rpm
 
# setup nginx repository
ADD ./template/nginx.repo /etc/yum.repos.d/nginx.repo
 
# setup tools
# reference from http://blog.nomadscafe.jp/2013/12/centos-65dockergrowthforecast.html
RUN yum -y groupinstall --enablerepo=epel,remi "Development Tools"
RUN yum -y install --enablerepo=epel,remi pkgconfig glib2-devel gettext libxml2-devel pango-devel cairo-devel git ipa-gothic-fonts
RUN yum -y install --enablerepo=epel,remi mysql mysql-server mysql-devel
 
# install sshd
RUN yum -y install --enablerepo=epel,remi openssh-server openssh-client
 
# install nginx
RUN yum -y install --enablerepo=nginx nginx
 
# setup perlbrew
RUN export PERLBREW_ROOT=/opt/perlbrew && curl -L http://install.perlbrew.pl | bash
RUN source /opt/perlbrew/etc/bashrc && perlbrew install perl-5.18.1
RUN source /opt/perlbrew/etc/bashrc && perlbrew use perl-5.18.1 && perlbrew install-cpanm
 
# install HRForecast
RUN git clone https://github.com/kazeburo/HRForecast.git /root/HRForecast
RUN source /opt/perlbrew/etc/bashrc && cd /root/HRForecast && perlbrew use perl-5.18.1 && cpanm -n -lextlib --installdeps .
 
# setup mysql
RUN chkconfig --level 2345 mysqld on
RUN service mysqld start && mysqladmin -h localhost -u root create hrforecast
RUN service mysqld start && cd /root/HRForecast && mysql -h localhost -u root hrforecast < schema.sql
RUN service mysqld start && mysql -u root -e "GRANT CREATE, ALTER, DELETE, INSERT, UPDATE, SELECT ON hrforecast.* TO 'hrforecast'@'localhost' IDENTIFIED BY 'hrforecast';"
RUN cd /root/HRForecast && sed -i -e "s/username => ''/username => 'hrforecast'/g" config.pl
RUN cd /root/HRForecast && sed -i -e "s/password => ''/password => 'hrforecast'/g" config.pl

# nginx setup
ADD ./template/nginx.conf /etc/nginx/conf.d/hrforecast.conf
RUN rm /etc/nginx/conf.d/default.conf
RUN rm /etc/nginx/conf.d/example_ssl.conf
RUN service nginx restart
 
# startup
ADD ./template/iptables-setting.sh /root/iptables-setting.sh
RUN chmod +x /root/iptables-setting.sh
ADD ./startup.sh /root/startup.sh
RUN chmod +x /root/startup.sh
ENV PATH /opt/perlbrew/perls/perl-5.18.1/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 
EXPOSE 80
CMD ["/root/startup.sh"]
```

```csh
CMD ["/root/startup.sh"]
```

これは、```docker run``` を行った時に
```/root/startup.sh``` というshell scriptを実行する。

## Docker imageに転送するファイルを作成する

nginx yum repositoryの登録や
Docker containerを立ち上げる時にサービスを起動しなければいけない。

今回はtemplateというディレクトリを用意し、
逐次```/root/``` 以下にADDする形を取った。

[template 参考](https://github.com/futoase/docker-template/tree/master/hrforecast/template)

## Docker imageをbuildする

Dockerfileがあらかたできただろ、という段階で
docker build を実行する。
ついでにリポジトリ名も設定する。

```
> docker build -t futoase/hrforecast .
```

![スクリーンショット 2014-01-13 23.43.35.png](https://qiita-image-store.s3.amazonaws.com/0/3985/9d6a0f1d-b9b6-f824-08f7-9dbd3cbad255.png)

無事 docker build ができたら、
imageの動作チェックを行う。

## docker runによるテスト

先ほど作成したimageを```docker run```を使って起動する。

![スクリーンショット 2014-01-13 23.45.37.png](https://qiita-image-store.s3.amazonaws.com/0/3985/e8c00d78-e6af-6c7b-5ca2-ebfd80c5f97c.png)

Docker container IDを利用し、Docker containerに割り当てられている
IPアドレスを確認する。

```
> docker ps
```

![スクリーンショット 2014-01-13 23.46.48.png](https://qiita-image-store.s3.amazonaws.com/0/3985/0766cae8-a5aa-8d07-6715-f0bb261828b8.png)

```
> docker inspect 0c3bf860190a
```

![スクリーンショット 2014-01-13 23.47.28.png](https://qiita-image-store.s3.amazonaws.com/0/3985/8f6d0274-4f97-e039-6a71-7894f1af2c5d.png)

wget http://172.17.0.27/ を実行し、
HRForecastのindex pageを取得出来るか確認する。

```
> wget http://172.17.0.27/
```

![スクリーンショット 2014-01-13 23.48.35.png](https://qiita-image-store.s3.amazonaws.com/0/3985/ce5f551c-bbe8-1671-20dc-0a0e7bea4daa.png)

問題なさそう。

## Docker container を docker pushする

Docker Indexに futoase/hrforecast として Docker imageをpushしてみた。
以下のコマンドを実行し、docker build時にリポジトリ名を付けるようにする。
Docker IndexにSign upしていることが前提。

```
docker build -t futoase/hrforecast . 
```

その後、```docker login``` コマンドを実行し、
dockerにログイン可能な状態にする。

![スクリーンショット 2014-01-13 23.54.27.png](https://qiita-image-store.s3.amazonaws.com/0/3985/c6c52bcb-8b70-9245-e938-69d3b78e9a09.png)

docker loginにて、docker pushの準備が整ったら以下のコマンドを実行すればよい。

```
> docker push futose/hrforecast
```

RUNを実行する度に差分となるimageがちょこまかと
Docker Indexにpushされていく。

しばらく待つと終わる。
(途中、失敗したら再度docker pushする)

![スクリーンショット 2014-01-14 0.08.23.png](https://qiita-image-store.s3.amazonaws.com/0/3985/2b9e79b5-6891-517d-6411-71bdbc47b5a5.png)

Docker Indexの自分のアカウントに対して
ページができてることを確認したら
ページ情報を更新して自己満足に浸る。

[futoase/hrforecast](https://index.docker.io/u/futoase/hrforecast/)

![スクリーンショット 2014-01-14 0.11.12.png](https://qiita-image-store.s3.amazonaws.com/0/3985/731464f7-8367-9a94-0831-efe0c9c271f7.png)

# Dockerは楽しい

Docker、Cent OSかUbuntuであれば
色々なコンテナ作れるし、楽しい。

# 参考にしたサイト

以下のサイト・ブログエントリがなければdocker imageは作れなかった。
なんかよくわからないし。
大変感謝しています...

- [CentOS 6.5にDockerいれてGrowthForecastを動かしてみた](http://blog.nomadscafe.jp/2013/12/centos-65dockergrowthforecast.html)
- [serfとDockerでクラスタを組んでみる](http://shibayu36.hatenablog.com/entry/2013/12/08/170547)
- [Dockerfile の書き方「私的」なベストプラクティス](http://inokara.hateblo.jp/entry/2013/12/28/121828)