【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【大阪 / 横浜 / 徳島】インフラ / サーバーサイドエンジニア募集中!

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【導入実績 500社以上】AWS 構築・運用保守・監視サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【CentOS 後継】AlmaLinux OS サーバー構築・移行サービス

【WordPress 専用】クラウドサーバー『ウェブスピード』

【WordPress 専用】クラウドサーバー『ウェブスピード』

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【格安】Webサイト セキュリティ自動診断「クイックスキャナー」

【予約システム開発】EDISONE カスタマイズ開発サービス

【予約システム開発】EDISONE カスタマイズ開発サービス

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【100URLの登録が0円】Webサイト監視サービス『Appmill』

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【200ヶ国以上に対応】グローバル eSIM「ビヨンドSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【中国への旅行・出張・駐在なら】中国SIMサービス「チョコSIM」

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【グローバル専用サービス】北米・中国でも、ビヨンドのMSP

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

【YouTube】ビヨンド公式チャンネル「びよまるチャンネル」

懇切丁寧! コピペでできる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コンテナのコミットについても触れたいと思います。

 
以上です。

この記事がお役に立てば【 いいね 】のご協力をお願いいたします!
0
読み込み中...
0 票, 平均: 0.00 / 10
1,128
X facebook はてなブックマーク pocket
【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

【2025.6.30 Amazon Linux 2 サポート終了】Amazon Linux サーバー移行ソリューション

この記事をかいた人

About the author

萬代陽一

ソーシャルゲームのウェブ API などの開発がメイン業務ですが、ありがたいことにマーケティングなどいろんな仕事をさせてもらえています。
なおビヨンド内での私の肖像権は CC0 扱いになっています。