どんな事でもお気軽にお問い合わせください
0120-803-656
24時間受付いたします

懇切丁寧! コピペでできる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を押しながら、PQの順にキーボードを押し、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コンテナのコミットについても触れたいと思います。

 
以上です。


お問い合わせ 採用情報 エンジニアブログ
ISO27001認証
Contact PageTop
株式会社ビヨンド

© beyond Co., Ltd. All rights reserved.