Code PHP

【Docker】PHP+Nginx+MySQLの開発環境を作る方法

2021年1月17日

DockerでローカルにPHP+Nginx+MySQLの開発環境を作る方法を解説します。
サーバを立てるほどでもないけど、サクッと開発環境を立ち上げて動作確認したい場合に便利です。

準備

ツール

Docker Desktopをインストールしておきましょう。

>> Docker Desktopダウンロードサイト

$ docker -v
Docker version 20.10.5, build 55c4c88

ディレクトリ構成

ディレクトリ構成は、以下のとおりです。
各サービスを別コンテナで立て、Docker Composeで一括管理します。

今回はphpnginxmysqlで別々のサービスとしてコンテナを作成します。

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コンテナへの通信が確立されていることがわかります。

-Code, PHP

© 2024 トンボのようにまっすぐ進んでいたい Powered by AFFINGER5