懇切丁寧! コピペでできるdocker入門
目次
こんにちは。
開発チームのワイルド担当、まんだいです。
PHP7が公開されてから、しばらく経ちますが、現在も頻繁にマイナーバージョンアップが発生していて
どのタイミングでPHPを差し替えるか、非常に重要な問題かと思います。
アップデートが頻発するのは面倒だ。
でも最新版は使いたい。
こんな時に、dockerはいかがでしょうか。
公式dockerイメージもあるこのご時世、一度は使ってみるしかないんじゃないでしょうか。
やった気になれるコピペ用コマンド付きでお届けします!
作業用のUbuntu Serverの用意(windowsでもコマンドは共通です)
ということで、今回は、vagrantとvirtualboxを使って、ubuntu server 15.10 を用意し、その上でdockerと戯れたいと思います。
# 適当にディレクトリを作成 mkdir ubuntu1510 cd ubuntu1510 vagrant init boxcutter/ubuntu1510 vagrant up --provider virtualbox #--providerのところは適宜変更のこと。
dockerのインストール
基本的には、https://docs.docker.com/engine/installation/ubuntulinux/ に載ってる作業と一緒です。
以降、ubuntu内で作業を進めていきます。
GPGキーの取得
vagrant@vagrant:~$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D
aptリポジトリの追加
vagrant@vagrant:~$ echo "deb https://apt.dockerproject.org/repo ubuntu-wily main" | sudo tee /etc/apt/sources.list.d/docker.list
aptリポジトリの更新
vagrant@vagrant:~$ sudo apt-get update
不要なaptパッケージのパージ
vagrant@vagrant:~$ sudo apt-get purge lxc-docker
linux-image-extraのインストール
vagrant@vagrant:~$ sudo apt-get install linux-image-extra-$(uname -r)
dockerをインストール
vagrant@vagrant:~$ sudo apt-get install docker-engine
vagrantユーザーをdockerグループに追加
vagrant@vagrant:~$ sudo usermod -aG docker vagrant # 追加しない場合、dockerの実行にsudo が必要になる # 検証環境以外では常にsudoを付けて実行する方がセキュリティ的に良いようです
PHP7.0.2環境をささっと構築してみる
vagrant@vagrant:~$ docker pull php:7.0.2-apache # 今回はapache環境で実行できるPHPをチョイス
諸々のダウンロードが完了したら、dockerが認識しているか確認してみます。
vagrant@vagrant:~$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE php 7.0.2-apache 797e8c22cdde 6 days ago 521 MB
インポートしたdockerイメージを動かしてみる
vagrant@vagrant:~/docker_php7$ docker run php:7.0.2-apache AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message [Tue Feb 16 08:19:41.424790 2016] [mpm_prefork:notice] [pid 1] AH00163: Apache/2.4.10 (Debian) PHP/7.0.2 configured -- resuming normal operations [Tue Feb 16 08:19:41.426135 2016] [core:notice] [pid 1] AH00094: Command line: 'apache2 -D FOREGROUND'
いい感じに動作しているようですが、Ctrl+z でも一時停止できず、入力を受け付けなくなってしまったので、Ctrl+cで一旦止めます。
dockerイメージをバックグラウンドで動作させる
何となくapacheが起動しているという事以外、何が起こっているのか、さっぱり分からないので、先ほどのdockerイメージをバックグラウンドで動作するようにしてみます。
docker run -d php:7.0.2-apache
どう動いているか、docker psコマンドで確認してみます。
vagrant@vagrant:~$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5cce300a61e5 php:7.0.2-apache "apache2-foreground" 8 seconds ago Up 6 seconds 0.0.0.0:80->80/tcp small_lovelace
とりあえず動いている事が確認できました。ワクワクします。
何もしてないけど。。。
dockerコンテナの中身を見てみる
動いているdockerコンテナの中身を覗いてみて、どういった設定になっているのか確認してみます。
先ほどバックグラウンドに起動したdockerコンテナを止めてみます。
稼働中のdockerコンテナを止めるには、docker stopコマンドを使用します。
vagrant@vagrant:~$ docker stop 5cce300a61e5 5cce300a61e5
5cce300a61e5というのは、docker psした時のコンテナIDというもので、先ほどはIDを全て入力しましたが、1つしかdockerコンテナが起動していないなら、docker stop 5cc のように不完全な文字列でもマッチするIDを持つコンテナを停止できます。
このコンテナIDは起動時に付けられる一意なものですので、別の環境で実行した場合は、異なるコンテナIDが付けられることになります。
dockerコンテナの中身を見るには、docker run する時に iオプションとtオプションを指定すると、コンテナ内を確認できるようになります。
dockerイメージを起動する時のコマンドは以下のようになります。
docker run -it php:7.0.2-apache /bin/bash
プロンプトの表記が以下のように変わりました。
root@ac4e7280d147:/var/www/html#
psコマンドで現在動いているプロセスを確認します。
root@b679b610fdae:/etc/apache2# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 20248 3320 ? Ss 17:56 0:00 /bin/bash root 113 0.0 0.0 17500 2068 ? R+ 18:01 0:00 ps aux
何にも動いていないようです。
コンテナ内のプロセスが、ホストOSから切り離されているのが分かります。
とりあえず、apacheを起動してみます。
root@b679b610fdae:/etc/apache2# /etc/init.d/apache2 start [....] Starting web server: apache2AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 172.17.0.2. Set the 'ServerName' directive globally to suppress this message. ok # psコマンドでapacheプロセスを確認 root@b679b610fdae:/etc/apache2# ps auxf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 20248 3320 ? Ss 17:56 0:00 /bin/bash root 130 0.0 0.3 166704 15264 ? Ss 18:02 0:00 /usr/sbin/apache2 -k start www-data 133 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k start www-data 134 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k start www-data 135 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k start www-data 136 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k start www-data 137 0.0 0.2 166728 8548 ? S 18:02 0:00 _ /usr/sbin/apache2 -k start root 188 0.0 0.0 17496 2104 ? R+ 18:42 0:00 ps auxf
無事起動しているようです。
面白い事に、今回使用しているdockerイメージの中には、curlが用意されているので、それを使ってdockerコンテナ内でHTTP通信できるか試してみます。
# レスポンス用のデータを用意 root@b679b610fdae:/etc/apache2# echo "hogehoge test" > /var/www/html/index.html root@b679b610fdae:/etc/apache2# curl http://127.0.0.1/ hogehoge test
内部のapacheから正常にレスポンスが返ってくるのを確認しました。
これを外部からアクセスしたい訳ですが、今の状態では、外部からこのdockerコンテナへ接続する方法がないので、一旦exitでコンテナから抜けます。
ホストOSにdockerコンテナのポートをマッピングしてみる
再度dockerコンテナを起動する訳ですが、この際に、テストとしてホストOSの8080番ポートにdockerコンテナ内の80番ポートをマッピングするよう設定を追加してdockerコンテナを起動してみます。
vagrant@vagrant:~$ docker run -it -p 8080:80 php:7.0.2-apache /bin/bash # -p 8080:80 でホストOSをの8080番をdockerコンテナの80番にポートマッピングするという意味
起動したら、psコマンドでapacheプロセスを確認します。
root@949dd89c3341:/var/www/html# ps auxf USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.0 20248 3296 ? Ss 19:09 0:00 /bin/bash root 57 0.0 0.0 17496 2068 ? R+ 19:12 0:00 ps auxf
apacheが起動していないですね。
実は、これがdockerコンテナの重要な性質で、毎回、docker runした段階で、元になるdockerイメージ(今回はphp:7.0.2-apache)からコンテナを作成します。
よって、前回/var/www/html/index.htmlにファイルを設置した、私の作業は残りません。
docker runしたら、必ず開始時の状態は同じになります。
これでは、定型的な作業(今回だと、apacheを起動したり、index.htmlを作ったり)を毎度毎度やる必要があります。
本格的な開発で使うのなら、apache起動、コンテナへファイル転送だけで終わるはずがないです。
また、定型的な手続きでさえも、時間の流れで変化します。
そのために、起動時の手続きをDockerfileにしたためて自動で行ったり、それらの手続きを済ませた状態のdockerイメージを作成したりする訳ですが、それは次回以降にやる予定です。
ひとまず、今回は、手動でapacheの起動とコンテンツの配置を行います。
root@949dd89c3341:/var/www/html# echo "hogehoge test" > /var/www/html/index.html root@949dd89c3341:/var/www/html# /etc/init.d/apache2 start
では、外部からdockerコンテナにアクセスするため、一度dockerコンテナから抜け、ホストOSへ戻ります。
この動作をデタッチというようで、ショートカットキーが用意されています。
exitコマンドを入力すると、dockerコンテナ自体が停止してしまうのは、先ほどの通りなので
今度はCtrlを押しながら、P→Qの順にキーボードを押し、ubuntuのターミナルへ戻ります。
root@949dd89c3341:/var/www/html# # この状態でCtrl+P、Qと押すと root@949dd89c3341:/var/www/html# vagrant@vagrant:~$
この通り、起動中のままです。
ちなみに再度dockerコンテナに戻るには
vagrant@vagrant:~$ docker attach 949dd
とします。コンテナからホストOSへ戻るのがデタッチなので、その逆はアタッチですね。
949ddというのは、今起動中のdockerコンテナのコンテナIDの一部になります。
では、ubuntuからcurlを使って8080番ポートにリクエストを飛ばしてみます。
vagrant@vagrant:~$ curl http://localhost:8080 hogehoge test
無事データが返ってきました。
ちなみに、ホストOSのどのポートにdockerコンテナのポートがマッピングされているか確認するには、ホストOSでiptablesを参照すると分かります。
ネットワーク周りの設定は、ipコマンドやiptablesコマンドで確認できるので、わかりやすいですね。
PHPも動くのか?
今回使ったdockerイメージは、記事を書いている時点で最新のPHP 7.0.2入りのdockerイメージで、本来はPHPの動作確認をしたかったので、簡単な動作確認をしてみます。
先ほどのdockerコンテナにアタッチします。
vagrant@vagrant:~$ docker attach 949dd
今度は、PHPの動作確認では定番の、アレを実行させてみます。
root@949dd89c3341:/var/www/html# echo "<?php phpinfo();" > /var/www/html/info.php
コンソールにPHPの情報が流れたら、問題なくPHPは動作しています。
とまぁ、これがdockerのスタートラインになると思います。
次回があれば、Dockerfileやディレクトリ共有、dockerコンテナのコミットについても触れたいと思います。
以上です。