Dockerfileを使いアプリケーションをコンテナ化してみた

SoftLayerの仮想サーバーにインストールしたDocker環境にコンテナを作成します。今回は、アプリケーションとして、[SOY CMS](http://www.soycms.net/)というCMS（コンテンツ・マネージメント・システム）を取り上げます。Dockerfileを作成し、コンテナ・イメージとしてbuildした上で、コンテナ化します。作成したDockerfileは、DockerHubに登録して公開します。

![docker-stages.png](https://qiita-image-store.s3.amazonaws.com/0/63451/5f6e6f8c-835a-f2fe-7541-50de2d8e8911.png)

# SOY CMSとは？
どんなホームページでも簡単に更新できるようになる簡単便利なオープンソースCMSです。WordPressのようにLAMPスタック (Linux/Apache/MySQL/PHP）環境で稼働するPHPアプリケーションです。

# Dockerfileの作成

DockerfileとはDockerコンテナーのインストール・スクリプトや構成スクリプトの内容が記述されたテキスト形式のファイルです。Dockerfileで利用可能な命令文を以下の表に示します。

|命令 | 用途 |
|:-----------|------------:|
|FROM|元となるDockerイメージの指定|
|MAINTAINER|作成者の情報|
|RUN|コマンドの実行|
|ADD|ファイル／ディレクトリの追加|
|CMD|コンテナーの実行コマンド 1|
|ENTRYPOINT|コンテナーの実行コマンド 2|
|WORKDIR|作業ディレクトリの指定|
|ENV|環境変数の指定|
|USER|実行ユーザーの指定 |
|EXPOSE|ポートのエクスポート|
|VOLUME|ボリュームのマウント|

``# docker build``

というコマンドを実行すると、Dockerfileに記述された命令文が上から順番に実行されます。

（参考）Dockerfileとdocker buildコマンドでDockerイメージの作成
http://www.atmarkit.co.jp/ait/articles/1407/08/news031.html

SOY CMSコンテナを自動構築するDockerファイルを記述します。ファイル名はDockerfileとします

`# vi Dockerfile`

```lang:Dockerfile
FROM centos:centos6
RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
RUN yum -y install httpd php php-mysql mysql-server tar wget php-gd php-mbstring
WORKDIR /tmp/
RUN wget http://www.soycms.net/web/files/soycms/soycms_install_1.2.3_sqlite.tar.gz
RUN tar -zxvf ./soycms_install_1.2.3_sqlite.tar.gz
RUN rm -f ./soycms_install_1.2.3_sqlite.tar.gz
RUN mv soycms_installer/* /var/www/html/
RUN chown -R apache.apache /var/www/html/
RUN service mysqld start && mysql -u root -e "CREATE DATABASE soycms; GRANT ALL PRIVILEGES ON soycms.* TO 'soycms'@'localhost' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;" &&  service mysqld stop
RUN echo -e "service mysqld start\nservice httpd start\n/bin/bash" > /startService.sh
RUN chmod o+x /startService.sh
EXPOSE 80
CMD /startService.sh
```

# コンテナ・イメージを作成
Dockerfileのあるディレクトリで以下を実行し、soyという名前で、SOY CMSのコンテナ・イメージを作成します。
`# sudo docker build --rm -t soy .`

```
Sending build context to Docker daemon 23.04 kB
Sending build context to Docker daemon 
Step 0 : FROM centos:centos6
 ---> 25c5298b1a36
Step 1 : RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
 ---> Using cache
 ---> 4646aaa9faec
Step 2 : RUN yum -y install httpd php php-mysql mysql-server tar wget php-gd php-mbstring
 ---> Using cache
 ---> c8ef80fd9628
Step 3 : WORKDIR /tmp/
 ---> Using cache
 ---> 123c8611d1de
Step 4 : RUN wget http://www.soycms.net/web/files/soycms/soycms_install_1.2.3_sqlite.tar.gz
 ---> Using cache
 ---> 4bef70fa7e03
Step 5 : RUN tar -zxvf ./soycms_install_1.2.3_sqlite.tar.gz
 ---> Using cache
 ---> d0f4183b21a4
Step 6 : RUN rm -f ./soycms_install_1.2.3_sqlite.tar.gz
 ---> Using cache
 ---> 63a759aef4b8
Step 7 : RUN mv soycms_installer/* /var/www/html/
 ---> Using cache
 ---> f1222da4a0c1
Step 8 : RUN chown -R apache.apache /var/www/html/
 ---> Using cache
 ---> aebc2b0db237
Step 9 : RUN service mysqld start && mysql -u root -e "CREATE DATABASE soycms; GRANT ALL PRIVILEGES ON soycms.* TO 'soycms'@'localhost' IDENTIFIED BY 'password'; FLUSH PRIVILEGES;" &&  service mysqld stop
 ---> Using cache
 ---> 02f9b0f197ff
Step 10 : RUN echo -e "service mysqld start\nservice httpd start\n/bin/bash" > /startService.sh
 ---> Using cache
 ---> 3dfcff6ee573
Step 11 : RUN chmod o+x /startService.sh
 ---> Using cache
 ---> 9238522020fe
Step 12 : EXPOSE 80
 ---> Using cache
 ---> f63bac97bb22
Step 13 : CMD /startService.sh
 ---> Using cache
 ---> 59fe00d996a2
Successfully built 59fe00d996a2
```

# コンテナを稼働
作成したコンテナ・イメージ（イメージ名：soy）をコンテナとして稼働します。

`# sudo docker run -i -t -d -p 8080:80 --name SOYCMS1 soy`

```
6114a929ea3621b1469d22102dc0145e9ca97e1b917b9603811ed357346a629c
```

# SOY CMSにブラウザでアクセス
ホストマシンのIPアドレスに、コンテナ稼働時に指定したポート番号（ここではhttp://<ホストマシンのIPアドレス>:8080）を加えたURLでブラウザからアクセスします。
![スクリーンショット 2014-12-25 14.23.17.png](https://qiita-image-store.s3.amazonaws.com/0/63451/f513627a-eb9c-5370-b598-aa53b2557667.png)

SOY CMSが稼働していることが分かります。あとはウィザードにしたがいインストールすればOKです。

# Docker Hubに登録
作成したDockerfileをDocker Hubに登録することができます。また、Docker Hubには、多くのDockerfileが登録されていますので再利用することができます。

https://hub.docker.com/
![スクリーンショット 2014-12-25 14.34.02.png](https://qiita-image-store.s3.amazonaws.com/0/63451/115b428a-63bb-d620-6d04-2d27f5243834.png)

Dokerfileは、Dockerが動いている環境であれば、パブリック・クラウドでも、オンプレミスでも再利用できるので便利ですね。