Dockerを使ったWebアプリのお試し配布

2014-12-11
Docker
Advent Calendar

この記事は、Docker Advent Calendar 2014の12日目の記事です。
自分が作っているアプリを気軽にお試ししてもらう方法をdockerでやってみた話です。

私の主戦場がLAMPなので、PHPで実装するんですがアプリをお試ししてもらうことは大変です。
PHPインストールしてもらって、バージョン合わせてもらって、モジュール入れてもらって・・・

本来であれば =>「アプリを試しに使ってみて欲しい」
なのに =>「アプリを試してもらうにはPHPの知識が結構必要」 ってことになるのは本末転倒です。

そこで今回は、dockerでアプリの配布イメージを作成して、気軽に試してもらおう!というわけです。

お試しアプリ配布の手順概要

Docker Hubというdocker imageをpush出来るリポジトリを使います。

  1. Docker Hubのアカウント作成
  2. docker imageを作る
  3. Docker hubへimageをpush
  4. 別のdockerでimageをpullしてアプリをお試しする。

Docker Hub周りは、@ITの下記の記事が大変参考になりました。
Docker Hubの使い方とGitHubからのDockerイメージ自動ビルド - http://www.atmarkit.co.jp/ait/articles/1408/26/news038.html  

1. Docker Hubのアカウント作成

github連携出来るので、比較的簡単です。 1つだけ注意点ですが、Docker Hubのアカウント名は、docker imageに含まれるアカウント名と同じである必要があります。

私の場合は、githubのアカウント名でDocker Hubのアカウントを作りました。
なので、docker imageの名前は、hanhan1978/[適当なimage名]という形式にしないと駄目です。  

2. docker imageを作る

imageを作るのに利用したのは、centos7上のdockerです。個人のVPS環境です。
OSとdockerのバージョン。※epelリポジトリからインストール出来る最新版を使ってます。

1
2
3
4
5
6
7
8
9
10
11
12
$ docker version
Client version: 1.0.0
Client API version: 1.12
Go version (client): go1.2.2
Git commit (client): 63fe64c/1.0.0
Server version: 1.0.0
Server API version: 1.12
Go version (server): go1.2.2
Git commit (server): 63fe64c/1.0.0

$ cat /etc/redhat-release
CentOS Linux release 7.0.1406 (Core)

お試し用アプリとして選んだのは、私も開発に参加しているowlというオープンソースのcollaborationツールです。
(Qiitaをリスペクトした感じのアレです。)

owlのリポジトリ => https://github.com/fortkle/owl
dockerのbuildに使ったDockerfileやその他設定ファイル系は、githubにアップしておきました。 https://github.com/hanhan1978/docker_owl 詳細な中身は、そちらを参照して下さい。

お試しアプリ配布に伴うdocker image作成でハマったポイントはnginxとphp-fpmを同一コンテナ内で立ち上げることです。
通常は1プロセス1コンテナで作るので、そもそもdockerの使い方として間違っているかもしれませんが・・・。

解決策としては、nginxとphp-fpmを両方立ち上げるシェルスクリプトを作成して、そのスクリプトをdockerの実行コマンド[CMD]にすることで対応しました。
ピンポイントで参考になったブログ => http://www.mceith.com/blog/?p=220

立ち上げスクリプトの中身は↓ php-fpmはバックグラウンド実行、nginxはフォアグラウンドで実行してます。

1
2
#!/bin/bash
/opt/remi/php56/root/usr/sbin/php-fpm -D & /usr/sbin/nginx -g 'daemon off;'

image作成時のコマンドは下記の1行です。

1
$ docker build -t hanhan1978/owl:0.9 .

3. Docker hubへのイメージのpush

Docker Hubにコマンドラインでログインします。

1
2
3
4
5
$ docker login
Username: hanhan1978
Password:
Email: [email protected]
Login Succeeded

Docker hubにイメージをプッシュ。参考記事ではタグ無しだったけど、タグ指定にしてみた。(後でちょっと困ることになりますw)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
$ docker push hanhan1978/owl:0.9
The push refers to a repository [hanhan1978/owl] (len: 1)
Sending image list
Pushing repository hanhan1978/owl (1 tags)
511136ea3c5a: Image already pushed, skipping
34e94e67e63a: Image already pushed, skipping
b1bd49907d55: Image already pushed, skipping
df7df6c85649: Image successfully pushed
254cedc77fe7: Image successfully pushed
c8b5515243b2: Image successfully pushed
4902befa9a53: Image successfully pushed
2c4f24f89089: Image successfully pushed
8be82dd43bcc: Image successfully pushed
281a799000c2: Image successfully pushed
56fc4782c58b: Image successfully pushed
babc8f0336e8: Image successfully pushed
e46c4fa04974: Image successfully pushed
a336c673cda3: Image successfully pushed
dc628cb5de6f: Image successfully pushed
c77a2dbcf895: Image successfully pushed
2891d79c2058: Image successfully pushed
5773273be2af: Image successfully pushed
cb3b98ae5868: Image successfully pushed
e5228b0366bc: Image successfully pushed
7ed1d79aaaf5: Image successfully pushed
bdf912d5ff46: Image successfully pushed
9460f658bba3: Image successfully pushed
5d598e4d2b80: Image successfully pushed
Pushing tag for rev [5d598e4d2b80] on {https://cdn-registry-1.docker.io/v1/repositories/hanhan1978/owl/tags/0.9}

Docker Hubにイメージがpushされた!

Docker Hub

これにて、docker hubへのイメージアップロードは終わった。
果たして、私のdocker imageは簡単にお試し出来る状態になっているのだろうか?

4. EC2でdocker立ち上げて確認してみる。

試しにEC2でdocker立ち上げて、owlをpullする。
ubuntu 14.04 LTSを使用。t2.microなので、ちょっと試す程度なら無料!
Dockerのinstallは公式ドキュメントに従った。 https://docs.docker.com/installation/ubuntulinux/

1
2
$ sudo apt-get update
$ sudo apt-get install docker.io

dockerがインストールされたら、即効pull

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
$ sudo docker pull hanhan1978/owl
Pulling repository hanhan1978/owl
5d598e4d2b80: Download complete
511136ea3c5a: Download complete
34e94e67e63a: Download complete
b1bd49907d55: Download complete
df7df6c85649: Download complete
254cedc77fe7: Download complete
c8b5515243b2: Download complete
4902befa9a53: Download complete
2c4f24f89089: Download complete
8be82dd43bcc: Download complete
281a799000c2: Download complete
56fc4782c58b: Download complete
babc8f0336e8: Download complete
e46c4fa04974: Download complete
a336c673cda3: Download complete
dc628cb5de6f: Download complete
c77a2dbcf895: Download complete
2891d79c2058: Download complete
5773273be2af: Download complete
cb3b98ae5868: Download complete
e5228b0366bc: Download complete
7ed1d79aaaf5: Download complete
bdf912d5ff46: Download complete
9460f658bba3: Download complete

pullが終わったら、起動!そして失敗!

1
2
3
4
$ sudo docker run -t -i -d -p 80:80 hanhan1978/owl
Unable to find image 'hanhan1978/owl' locally
Pulling repository hanhan1978/owl
2014/12/07 05:25:07 Tag latest not found in repository hanhan1978/owl

latestっていうタグが見つからないから駄目よとのこと。
なるほど、latestのタグのイメージをpushしないと、タグ無指定では動かない。

latestタグは後でやるとして、タグ指定で起動してみる。

1
2
$ sudo docker run -t -i -d -p 80:80 hanhan1978/owl:0.9
d59ff86c3eb7635725af9fac23ff3ca439539e131fbb829b03a2043c6237f67d

見事に起動!プロセスを確認

1
2
3
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d59ff86c3eb7 hanhan1978/owl:0.9 /usr/bin/run.sh 8 seconds ago Up 7 seconds 0.0.0.0:80->80/tcp desperate_mcclintock

該当IPアドレスにアクセスしてみると・・・

owl

ubuntu立ち上げてから、コマンド4つで、サンプルアプリが立ち上がりました。
dockerお持ちの方なら、pullとrunの2つだけですね。
runの時にlocalにイメージが無い時はpullしてくれるようなのでrunだけでもOKかも。

今回はアプリ配布に焦点を当てたので、インスタンス内でnginxとphp-fpmの2つのプロセスを立ち上げたりと、dockerっぽくない使い方をしましたが
工夫次第で、dockerはこんな使い方出来るんだ〜と感動しました。

LL系の言語は、アプリ導入が1つのハードルになると思うので、dockerイメージで軽く試せるimageを作っておけば
布教活動に一役買うのではと思います。