Docker-ComposeでLAMP環境構築
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は下記になります。ファイルには拡張子をつけないので注意してください。
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ファイルです。作成するコンテナについて記述します。
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ファイルを配置しておきます。
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は環境のスクラップ&ビルドが簡単にできるので、コンテナ内を気軽に触れるのがいいですね。