web-technical-blog

web開発に関する技術メモ

Docker Hubのオフィシャルイメージを使ったLAMP環境(Apache+PHP+MySQL)

PHP+Apacheのイメージをつかってみる

$ docker rund -d php:5.6-apache

PHP+ApacheのイメージをDocker Hubから取得し、コンテナを起動

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
php                 5.6-apache          61a89dae852c        3 weeks ago         378MB

取得したイメージを一覧を表示する STATUSの欄がUpになっていれば起動

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
0877ed1b4e88        php:5.6-apache      "docker-php-entrypoi…"   5 minutes ago       Up 5 minutes        80/tcp              agitated_wright

ブラウザで確認する

上の方法では、起動しているコンテナのポートが内部で閉じているのでブラウザで確認することはできない。コンテナのポートを公開する

$ docker run -p 80:80 -d php:5.6-apache

-pオプションでホストのポートとコンテナのポートを結びつける。コロンの左側がホスト側、右側がコンテナ側のポート番号。

コンテナを削除する

$ docker rm -f コンテナID

これで削除できる。コンテナIDは以下で確認できる

$ docker ps -a

コンテナを一括で全て削除することも可能

$ docker rm -f $(docker ps -a -q)

コンテナを作成する

1.コンテナに入ってファイルを作成する

$ docker run -p 80:80 --name php -d php:5.6-apache

分かりやすように、--nameオプションでコンテナにphpという名前をつけている

$ docker exec -ti php bash

phpコンテナ内に入ることができる。-tiをつけないとターミナルを開くことはできない

ドキュメントルートの/var/www/htmlにいるはずなので、

# echo '<?php phpinfo();' > index.php

ブラウザでサーバーのURLを開きphpinfoの画面が確認できる

2.コンテナのディレクトリとホストのディレクトリを結びつける

コンテナは永続かされないので、コンテナを削除するとコンテナ内で作成したファイルも消えてしまう。ホスト側にファイルを置き、そのディレクトリをコンテナ側から参照する手法を試す

ホスト側のファイルを置くディレクトリは/Users/121799/docker/wwwどこにおいても問題ない 以前のコンテナを削除してから、以下を実行する

$ docker run -p 80:80 -v /Users/121799/docker/www:/var/www/html --name php -d php:5.6-apache

-vオプションでホストのディレクトリとコンテナのディレクトリを結びつける。コロンの左側がホスト側、右側がコンテナ側のディレクトリ。

MySQLのイメージを使ってみる

起動してコマンドラインから操作してみる

$ docker run --name mysql -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7

MySQL5.7のイメージをDocker Hubから取得し、起動する -eオプションは環境変数を設定するもので、rootのパスワードをpsssに設定している

コンテナに入る MySQLの操作ができるようになる

$ docker exec -ti mysql bash
$ mysql -ppass

PHPMySQLの連携

DockerfileによるPHPイメージのカスタマイズ

オフィシャルのPHPコンテナは最小限のオプションでコンパイルされている。そのままではMySQLと連動するのが難しい。 Dockerfileを使うと、既にあるイメージをカスタマイズして新しいイメージを作ることができる

Dockerfileの場所はどこでも良い。今回は/docker/phpに作成する ホスト側で/docker/php/Dockerfileを以下の内容で作成する

FROM php:5.6-apache
RUN apt-get update && \
  docker-php-ext-install pdo_mysql mysqli mbstring

FROMは元となるイメージを指定する RUMコマンドを指定する。docker-php-ext-installはphp:5.6-apacheイメージに含まれるユーティリティで、オプションを追加してPHPをリコンパイルするもの

docker-php-ext-install 引数を元にエクステンションをインストールしてくれる

Dockerfileが用意できたら、新しいイメージをビルドする

docker build -t php:custom /docker/php

/docker/phpにあるDockerfileを元にphp:customというイメージを作成する。docker imagesで確認する

MySQLイメージの設定を変更する

先ほど、作成したコンテナは削除しておく

Docker HubのMySQLイメージはcharacter setがlatin1になっている部分があるので設定ファイルを追加する /docker/mysql/custom.confを以下の内容で作成

[mysqld]
character-set-server=utf8
$ docker run --name mysql -v /docker/mysql:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=pass -d mysql:5.7

-vオプションでホスト側の/docker/mysqlディレクトリとコンテナ側の/etc/mysql/conf.dディレクトリを結びつけている

PHPコンテナをMySQLコンテナとリンクして起動する

$ docker run -p 80:80 -v /docker/www:/var/www/html --link mysql:mysql -name php -d php:custom

--linkオプションでコンテナmysqlを連携する。 コロンの左側にコンテナ名を指定する

連携が取れているか確認する

$ docker exec -ti php bash
$ cat /etc/hosts172.17.0.2  
mysql d5ca7e687d9b

--linkオプションで指定した名前でホスト名にアクセスできる コロンの右側で指定した名前

phpMyAdminを導入して確認

連携の確認用にphpMyAdminをホスト側に導入

cd /docker/www
wget https://files.phpmyadmin.net/phpMyAdmin/4.4.13.1/phpMyAdmin-4.4.13.1-all-languages.tar.gz
tar zxf phpMyAdmin-4.4.13.1-all-languages.tar.gz
rm phpMyAdmin-4.4.13.1-all-languages.tar.gz
mv phpMyAdmin-4.4.13.1-all-languages myadmin
cd myadmin/
cp config.sample.inc.php config.inc.php

config.inc.php

$cfg['Servers'][$i]['host'] = 'mysql'

hostをlocalhostから--linkオプションにより設定されたホスト名mysqlに変更する