この記事は、Docker Advent Calendar 2014 の12日目の記事です。 自分が作っているアプリを気軽にお試ししてもらう方法をdockerでやってみた話です。
私の主戦場がLAMPなので、PHPで実装するんですがアプリをお試ししてもらうことは大変です。 PHPインストールしてもらって、バージョン合わせてもらって、モジュール入れてもらって・・・
本来であれば =>「アプリを試しに使ってみて欲しい」 なのに =>「アプリを試してもらうにはPHPの知識が結構必要」 ってことになるのは本末転倒です。
そこで今回は、dockerでアプリの配布イメージを作成して、気軽に試してもらおう!というわけです。
お試しアプリ配布の手順概要 Docker Hubというdocker imageをpush出来るリポジトリを使います。
Docker Hubのアカウント作成
docker imageを作る
Docker hubへimageをpush
別の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 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アドレスにアクセスしてみると・・・
ubuntu立ち上げてから、コマンド4つで、サンプルアプリが立ち上がりました。 dockerお持ちの方なら、pullとrunの2つだけですね。 runの時にlocalにイメージが無い時はpullしてくれるようなのでrunだけでもOKかも。
今回はアプリ配布に焦点を当てたので、インスタンス内でnginxとphp-fpmの2つのプロセスを立ち上げたりと、dockerっぽくない使い方をしましたが 工夫次第で、dockerはこんな使い方出来るんだ〜と感動しました。
LL系の言語は、アプリ導入が1つのハードルになると思うので、dockerイメージで軽く試せるimageを作っておけば 布教活動に一役買うのではと思います。