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
PHPとMySQLの連携
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
に変更する
- http://localhost/myadmin
- ID:root
- PW:pass