DockerでローカルにPHP+Nginx+MySQLの開発環境を作る方法を解説します。
サーバを立てるほどでもないけど、サクッと開発環境を立ち上げて動作確認したい場合に便利です。
Contents
準備
ツール
Docker Desktopをインストールしておきましょう。
$ docker -v
Docker version 20.10.5, build 55c4c88
ディレクトリ構成
ディレクトリ構成は、以下のとおりです。
各サービスを別コンテナで立て、Docker Composeで一括管理します。
今回はphp、nginx、mysqlで別々のサービスとしてコンテナを作成します。
myapp
│
├── docker-compose.yml
├── mysql
│ ├── data/
│ └── initdb.d
├── nginx
│ └── nginx.conf
├── php
│ ├── Dockerfile
│ └── php.ini
└── www
└── html
└── index.php
Dockerコンテナの設定
docker-compose.yml
ComposeファイルはYAMLファイルであり、サービス(services)、ネットワーク(networks)、ボリューム(volumes)を定義します。
2023年2月現在のComposeファイル書式の最新バージョンは3系です。
version: "3" # Composeファイルの書式のバージョン
services:
nginx:
image: nginx:1.18 # nginx:1.18イメージを元にビルド
ports:
- 8080:80 # localhostの8080番ポートとdockerコンテナの80番ポートをバインド
volumes:
# ローカルのリソースをコンテナにマウント
- ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf
- ./www/html:/var/www/html
depends_on:
- php # phpコンテナに依存
php:
build: ./php # php/Dockerfileを元にビルド
volumes:
- ./www/html:/var/www/html # www/htmlをコンテナの/var/www/htmlにマウント
depends_on:
- mysql # dbコンテナに依存
mysql:
image: mysql:8.0 # mysql:8.0イメージを元にビルド
ports:
- 13306:3306 # localhostの13306番ポートとdockerコンテナの3306番ポートをバインド
volumes:
- ./mysql/data:/var/lib/mysql # ./mysql/dataをコンテナの/var/lib/mysqlにマウント
- ./mysql/initdb.d:/docker-entrypoint-initdb.d # ./mysql/initdb.dをコンテナの/docker-entrypoint-initdb.dにマウント
environment:
MYSQL_ROOT_PASSWORD: secret
Dockerfile
# ビルド元のDockerイメージに、php:8.1.16-fpmを指定
FROM php:8.1.16-fpm
# php.iniをコンテナにコピーしたい場合はここに記述
COPY php.ini /usr/local/etc/php/
Dockerコンテナサービスの設定
nginx.conf
server {
# 80番ポートでlisten
listen 80;
server_name _;
# ドキュメントルート
root /var/www/html;
index index.php index.html;
# ログディレクトリ
access_log /var/log/nginx/access.log;
error_log /var/log/nginx/error.log;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
initdb.d
データベースを作成する際に一緒に実行したいSQLを記述することができます。
例えば、sampleデータベースにusersテーブルを作成するとします。
DROP DATABASE IF EXISTS sample;
CREATE DATABASE sample;
USE sample;
DROP TABLE IF EXISTS users;
CREATE TABLE users
(
id INT(10),
name VARCHAR(255),
email VARCHAR(255),
password VARCHAR(255)
);
Dockerコンテナ実行
Dockerイメージをビルド、コンテナを起動
docker-compose.ymlのディレクトリに移動し、以下のコマンドでDockerイメージのビルドからコンテナ起動までの一連の処理を実行します。
cd path/to/docker-compose.yml
docker compose up -d --build
-dオプションは、Dockerコンテナをデタッチドモードで立ち上げるオプションです。
このオプションを付けることで、Dockerコンテナをバックグラウンドで起動することができます。
参考:Docker-docs docker-compose up
作成元のDockerイメージがローカルにない場合は、自動でDocker Hubからダウンロードされてきます。
最後に、以下が表示されれば、Dockerコンテナの作成が成功です。
Creating myapp_mysql_1 ... done
Creating myapp_php_1 ... done
Creating myapp_nginx_1 ... done
Dockerコンテナの起動確認
docker container ls
以下のように、Dockerコンテナが起動していたらOKです。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
799a3676f63e nginx:1.18 "/docker-entrypoint.…" About an hour ago Up 2 seconds 0.0.0.0:8080->80/tcp myapp_nginx_1
8cad107cd07c myapp_php "docker-php-entrypoi…" About an hour ago Up 2 seconds 9000/tcp myapp_php_1
0fac5bb99482 mysql:8.0 "docker-entrypoint.s…" About an hour ago Up 3 seconds 33060/tcp, 0.0.0.0:13306->3306/tcp myapp_mysql_1
Dockerコンテナにログイン
起動しているDockerコンテナにログインして内部を操作したい場合はexecコマンドを使います。
対象のコンテナ名と実行シェルを指定してログインします。
docker compose exec php bash
root@8cad107cd07c:/var/www/html#
phpコンテナの/var/www/htmlにマウントされているファイルが存在していることを確認できます。
root@8cad107cd07c:/var/www/html# ls /var/www/html
index.php
Dockerコンテナサービスの起動確認
NginxとPHP
phpコンテナの./www/html/index.php作成したPHPアプリの内容を確認します。
<?php
phpinfo();
localhost:8080にアクセスし、以下のようにphpinfo画面が表示されたらOKです。
nginxコンテナを経由してphpコンテナへの通信が確立されていることがわかります。