支援対象地域:札幌、仙台、関東、愛知、関西、広島、福岡


1.はじめに

Docker-Composeを使用したLAMP環境+phpMyAdminを構築するまでの手順です。

作成コンテナ

下記の3つを作成します。

  • PHP7.3+Apache
  • MySQL
  • phpMyAdmin

Dockerイメージ

Docker Hubから下記の公式イメージを使用します。

  • PHP:7.3-Apache
  • MySQL:5.7
  • phpmyadmin/phpmyadmin

環境

Docker Toolbox

コンテナ起動前のディレクトリ構造は以下の通りです。

コンテナ起動前
.
|-php
| |-dockerfile
|-src
| |-index.php
|-docker-compose.yml

2.dockerfileの作成

PHPの公式イメージにはPHP拡張モジュールがインストールされていないため、dockerfileに必要な情報を記載し、公式イメージをもとにしたオリジナルイメージを作成します。

コンテナ起動後にインストールすることもできますが、コンテナをたてる度に手動で行わなければならないので、再現性を高めるためにも必要なものはあらかじめイメージ内で記載しておいた方が良いです。

作成するdockerfileは下記になります。ファイルには拡張子をつけないので注意してください。

dockerfile
FROM php:7.3-apache
RUN apt-get update && \
docker-php-ext-install pdo_mysql mysqli mbstring && \
apt-get install -y vim git && \
a2enmod rewrite

解説

FROM句で基となるイメージを指定しています。

FROM php:7.3-apache

RUN句はイメージ作成時の実行コマンドを記述できます。

まずパッケージリスト更新しています。他コマンドを続けて実行したいため&&で繋げます。改行する場合はエスケープが必要です。

RUN apt-get update && \

インストールするPHPの拡張モジュールを指定しています。

他に必要なものがあれば半角スペース区切りで追加します。

docker-php-ext-install pdo_mysql mysqli mbstring && \

ついでにVimとGitをインストールしておきます。

注意点としてインストール中に確認がはいると、エラーとなってしまうので-yオプションをいれておきます。不要な場合は行ごと削除してください。

他に必要なものがあれば半角スペース区切りで追加します。

apt-get install -y vim git && \

Apacheのモジュールを予め有効にしておきたい場合はこのように記載できます。

例としてrewriteモジュールを有効化しています。

a2enmod rewrite

3.docker-compose.ymlの作成

続いてdocker-compose.ymlファイルです。作成するコンテナについて記述します。

docker-compose.yml
version: '3'

services:
php:
build: ./php
image: php73
container_name: LAMP_php73
volumes:
- ./src:/var/www/html
ports:
- 8080:80

mysql:
image: mysql:5.7
container_name: LAMP_mysql57
volumes:
- ./mysql:/var/lib/mysql
ports:
- 3306:3306
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test_db
- MYSQL_USER=test_user
- MYSQL_PASSWORD=test_password
command: --innodb-use-native-aio=0

phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: LAMP_phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=root
ports:
- 4040:80

解説

PHP7.3+Apacheのコンテナの設定です。

php:  			#サービス名
build: ./php		#dockerfileの格納先
image: php73		#イメージ名を指定
container_name: LAMP_php73 	#コンテナ名を指定
volumes: 			#ボリューム設定
- ./src:/var/www/html
ports: 			#ポートフォワーディング
- 8080:80 

ボリュームの設定については左( ./src)がホスト側、右(/var/www/html)がコンテナ側のディレクトリとなります。今回はコンテナ側のドキュメントルートにマウントをとっています。ホスト側のディレクトリをコンテナと共有していると考えてください。コンテナ側でファイルを消せばホスト側のディレクトリ上でも削除されます。

またブラウザでの確認用に./srcに下記のPHPファイルを配置しておきます。

index.php
docker test

ポートフォワーディング設定は、左側(8080)がホスト側のポートで、右側(80)がコンテナ側のポートとなります。

続いてはMySQLのコンテナです。

mysql:
image: mysql:5.7
container_name: LAMP_mysql57
volumes:
- ./mysql:/var/lib/mysql
ports:
- 3306:3306
environment:                #環境変数の設定
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=test_db
- MYSQL_USER=test_user
- MYSQL_PASSWORD=test_password
command: --innodb-use-native-aio=0    #デフォルトの起動コマンド上書き

PHPのコンテナと違い、公式のイメージをそのまま利用するためbuild句は記載しません。image: {公式イメージ名}を指定します。

また前述したようにコンテナ削除後はデータがすべて消えてしまうため、DBのデータを永続化されるためコンテナ側のディレクトリ(/var/lib/mysql)をマウントします。

ホスト側( ./mysql)のディレクトリはコンテナ起動後に自動的に作成されます。

コンテナ内での環境変数設定します。

  • MYSQL_ROOT_PASSWORD=root
  • MYSQL_DATABASE=test_db
  • MYSQL_USER=test_user
  • MYSQL_PASSWORD=test_password

うえから

  • ルートユーザーのパスワード
  • 起動時に作成するデータベース名(オプション)
  • 作成する新規ユーザー名(オプション)
  • 新規ユーザーのパスワード(オプション)

を設定しています。

Docker Toolboxを使用している場合のみ下記を指定してを無効化します。
command: --innodb-use-native-aio=0 

MySQLのデフォルトではlinuxの非同期I/Oが設定されていますが、Docker Toolboxでは使用できないためエラーとなるようです。

その他のDockerを使用している場合は不要なのでこの行を削除してください。

最後はphpMyAdminのコンテナです。

phpmyadmin:
image: phpmyadmin/phpmyadmin
container_name: LAMP_phpmyadmin
environment:
- PMA_ARBITRARY=1
- PMA_HOST=mysql
- PMA_USER=root
- PMA_PASSWORD=root
ports:
- 4040:80

コンテナ内での環境変数設定します。

  • PMA_ARBITRARY=1
  • PMA_HOST=mysql
  • PMA_USER=root
  • PMA_PASSWORD=root

うえから

  • 任意のサーバーへのログインを有効化
  • 接続するホスト名
  • 接続するユーザー名
  • 接続するユーザーのパスワード

を設定しています。

ホスト=mysqlとなっていますが、これはymlファイルで指定しているサービス名となります。

Docker-Composeで作成したコンテナ間の通信はサービス名で名前解決されます。

4.コンテナの起動

ymlファイルがあるディレクトリで下記コマンドを実行します。
docker-compose up -d

しばらくすると以下のように表示されます。

Creating LAMP_mysql57    ... done
Creating LAMP_phpmyadmin ... done
Creating LAMP_php73      ... done

コマンド(docker ps)を実行し、STATUSがすべてUPとなっていれば起動に成功しています。

$ docker ps
CONTAINER ID        IMAGE                   COMMAND                  CREATED             STATUS              PORTS                               NAMES
f4a13cba642c        phpmyadmin/phpmyadmin   "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:4040->80/tcp                LAMP_phpmyadmin
af8b2578d6d1        php                     "docker-php-entrypoi…"   3 seconds ago       Up 2 seconds        0.0.0.0:8080->80/tcp                LAMP_php73
d33f3fb4d7ec        mysql:5.7               "docker-entrypoint.s…"   3 seconds ago       Up 2 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp   LAMP_mysql57

コンテナ起動後のディレクトリ構造は以下の通りです。MySQLのディレクトリが追加されています。このディレクトリを残しておけば一度コンテナを削除して立て直してもデータが維持されます。新しくDBやユーザを作りたい場合にはこれを削除するだけでOKです。

コンテナ起動後
.
|-mysql
| |-(省略)
|-php
| |-dockerfile
|-src
| |-index.php
|-docker-compose.yml

5.ブラウザでの確認

ブラウザからアクセスして確認します。ブラウザにindex.phpの内容(docker test)が表示されます。

  • Docker Toolboxの場合 http://192.168.99.100:8080/
  • Docker Toolbox以外 http://localhost:8080/

Docker Toolboxの仮想マシンのIPアドレスは以下のコマンドで確認できます。

$ docker-machine ip default
192.168.99.100

phpmyadminは4040を指定したので下記でアクセスできます。環境変数で指定したデータベースtest_dbが作成されています。

  • Docker Toolboxの場合 http://192.168.99.100:4040/
  • Docker Toolbox以外 http://localhost:4040/

6.コンテナへのアクセス

下記コマンドでコンテナへのアクセスできます。Windowsの場合はwinptyが必要です。コンテナID、コンテナ名はdocker psで確認できます。

winpty docker exec -it {コンテナID ot コンテナ名} bash

phpコンテナに接続するとドキュメントルートにいます。

xホスト側の./srcとマウントしているので、lsコマンドで確認するとindex.phpが確認できます。

root@af8b2578d6d1:/var/www/html# ls
index.php

試しにコンテナ側でファイルを作成してみます。予めインストールしておいたVimを使用します。

root@af8b2578d6d1:/var/www/html# vim test.php

docker new fileと入力して保存して終了(:wq)します。ブラウザで確認してみます。

  • Docker Toolboxの場合 http://192.168.99.100:8080/test.php
  • Docker Toolbox以外 http://localhost:8080/test.php

docker new fileと表示されるはずです。またホスト側の./srcディレクトリにもtest.phpファイルが追加されています。

7.コンテナ停止・再起動・削除

Docker-Composeで作成したコンテナは一括で停止や再起動などの操作ができます。

またコンテナを削除するとマウントをとっているディレクトリ以外の変更はすべて削除されるので注意してください。

docker-compose stop #停止
docker-compose start #再起動
docker-compose rm  #削除

8.最後に

以上がDocker-Composeを使用したLAMP環境の構築手順となります。

Dockerは環境のスクラップ&ビルドが簡単にできるので、コンテナ内を気軽に触れるのがいいですね。