Docker+Nginx+MySQLでLaravelの開発環境構築 | アントレプログラマー

Docker+Nginx+MySQLでLaravelの開発環境構築

Laravel

こんにちは、ニキです。

この記事はこんな方におすすめです。

  • Docker+PHP-FPMでさくっとLaravelの開発環境構築したい
  • Docker+Nginx+MySQL+PHP-FPMで本番環境を想定したLaravelの開発環境構築をしたい

今回の記事では、docker composeを使って環境構築方法を解説します。初めに、PHP-FPMだけをつかって簡単な方法を解説した後に、Docker+Nginx+MySQL+PHP-FPMを使った方法を解説します。

Takaharu Niki

・Webエンジニア6年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする

環境情報

  • Chip: Apple M1
  • macOS: Ventura 13.2.1
  • Docker: 20.10.22

コンテナ上の環境情報

  • Laravel: 10.16.1 
  • PHP: 8.2.8
  • Nginx: 1.25.1
  • MySQL: 8.0.34

ディレクトリ構成

.
├── compose.yaml
├── mysql
│   ├── data
│   └── my.cnf
├── nginx
│   └── default.conf
└── php
    ├── Dockerfile
    └── src

Docker+PHP-FPMでLaravelの開発環境構築

まずはPHP-FPMコンテナだけで開発環境の構築をします。

Dockerfileの作成

Dockerfileを以下のように作成します。

FROM php:8.2.8-fpm-alpine3.18

COPY --from=composer /usr/bin/composer /usr/bin/composer

RUN docker-php-ext-install pdo_mysql

1行ずつ説明します。まず、FROMです。

FROM php:8.2.8-fpm-alpine3.18

執筆時点での最新バージョンを指定しています。軽量化のためにaplineイメージを使用しています。本番環境では公式イメージの利用を推奨します。

次に、COPYです。

COPY --from=composer /usr/bin/composer /usr/bin/composer

—from=composer でマルチステージビルドを使用しています。

ComposerのDocker Hubのページでもこの方法が推奨されています。

  • (optimal) create your own build image and install Composer inside it.
    Note: Docker 17.05 introduced multi-stage builds, simplifying this enormously:
    COPY --from=composer /usr/bin/composer /usr/bin/composer
引用 https://hub.docker.com/_/composer

COPY --from= を説明しているリファレンスも載せておきます。

  • Optionally a name can be given to a new build stage by adding AS name to the FROM instruction. The name can be used in subsequent FROM and COPY --from=<name> instructions to refer to the image built in this stage.
引用 https://docs.docker.com/engine/reference/builder/#copy

簡潔に書けるだけでなく、Composerのアップデートのたびにハッシュ値を変更しなくてすみます。

WARNING: Please do not redistribute the install code. It will change with every version of the installer. Instead, please link to this page or check how to install Composer programmatically.

引用 https://getcomposer.org/download/

最後に、RUN docker-php-ext-install です

RUN docker-php-ext-install pdo_mysql
  • RUN: コマンドを実行します。ここでのコマンドはdocker-php-ext-installです。
  • docker-php-ext-install: PHPイメージで提供されている便利なスクリプトで、PHPの拡張モジュールをインストールできます。ここでの拡張モジュールはpdo-mysqlです。
  • pdo-mysql: LaravelがPDOを使ってMySQLへアクセスするため、このモジュールが必要です。

compose.yamlの作成

compose.yamlを以下のように作成します。

services:
  app:
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: php
    ports:
      - 8000:8000
    volumes:
      - ./php/src:/var/www/html/example

コンテナの作成・起動

コンテナを作成するために、compose.yamlと同じディレクトリで以下を実行します。

% docker compose up -d

コンテナの一覧が以下のように表示されます。

% docker compose ps -a
NAME                IMAGE               COMMAND                  SERVICE             CREATED             STATUS              PORTS
php                 tmp-app             "docker-php-entrypoi…"   app                 7 seconds ago       Up 4 seconds        0.0.0.0:8000->8000/tcp, 9000/tcp

Laravelプロジェクトの作成

コンテナに入ります。

% docker compose exec app ash

“example”というLaravelプロジェクトを作成します。

# composer create-project laravel/laravel example

ビルトインサーバーを起動します。

# cd example
 
# php artisan serve --host 0.0.0.0

http://localhost:8000 へアクセスして、以下のように表示されれば正常に動作しています。

Docker+Nginx+MySQL+PHP-FPMでLaravelの開発環境構築

次にPHP-FPMだけでなく、本番環境を想定した構成で開発環境を構築します。

Nginxの設定

default.confを作成します。

server {
    listen 80;
    listen [::]:80;
    server_name localhost;
    root /var/www/html/example/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

    index index.php;

    charset utf-8;

    location / {
        try_files $uri $uri/ /index.php?$query_string;
    }

    location = /favicon.ico { access_log off; log_not_found off; }
    location = /robots.txt  { access_log off; log_not_found off; }

    error_page 404 /index.php;

    location ~ \\.php$ {
        fastcgi_pass php:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

    location ~ /\\.(?!well-known).* {
        deny all;
    }
}

各ディレクティブについては以下記事で解説しています。

MySQLの設定

MySQLの設定ファイルのmy.cnfを作成します。

[mysqld]
character_set_server = utf8mb4
collation_server = utf8mb4_general_ci

[client]
default-character-set = utf8mb4

MySQLの環境構築については以下の記事で解説しています。

compose.yamlの修正

compose.yaml を以下のように修正します。

services:
  app:
    build:
      context: ./php
      dockerfile: Dockerfile
    container_name: php
    volumes:
      - ./php/src:/var/www/html/example
  web:
    image: nginx:1.25.1-alpine-slim
    container_name: nginx
    ports:
      - 8080:80
    volumes:
      - ./php/src:/var/www/html/example
      - ./nginx/default.conf:/etc/nginx/conf.d/default.conf
  db:
    image: mysql:8.0.34
    container_name: mysql
    ports:
      - 3306:3306
    environment:
      MYSQL_DATABASE: laravel
      MYSQL_ROOT_PASSWORD: root
      TZ: Asia/Tokyo
    volumes:
      - ./mysql/my.cnf:/etc/mysql/conf.d/my.cnf
  • MYSQL_DATABASE: ここで”laravel”を指定するとlaravelという名前でデータベースを作成してくれます。アプリケーションで使用するDBを作成する必要があるので、ここで設定しておきます。

コンテナの再作成・起動

コンテナを削除し、再度作成するために、compose.yamlと同じディレクトリで以下を実行します。

% docker compose down

% docker compose up -d

コンテナの一覧が以下のように表示されます。

% docker compose ps -a
NAME                IMAGE                      COMMAND                  SERVICE             CREATED             STATUS              PORTS
mysql               mysql:8.0.34               "docker-entrypoint.s…"   db                  7 seconds ago       Up 6 seconds        0.0.0.0:3306->3306/tcp, 33060/tcp
nginx               nginx:1.25.1-alpine-slim   "/docker-entrypoint.…"   web                 7 seconds ago       Up 6 seconds        0.0.0.0:8080->80/tcp
php                 tmp-app                    "docker-php-entrypoi…"   app                 7 seconds ago       Up 6 seconds        9000/tcp

http://localhost:8080 へアクセスして、先ほどと同様の表示されれば正常に動作しています。

まとめ

docker composeを使って以下の2種類のニーズに応えられるように環境構築方法を解説しました。

  • Docker+PHP-FPMでさくっとLaravelの開発環境構築したい
  • Docker+Nginx+MySQL+PHP-FPMで本番環境を想定したLaravelの開発環境構築をしたい

続いて、必要な初期設定については以下の記事で解説しています。

Laravel BreezeとNext.jsを使ったフロントエンドとの認証方法については、以下の記事で解説しています。

Docker/Kubernetes 実践コンテナ開発入門

コンテナ技術をこれから学びたい方、あるいはすでに基本的な知識を持っているが実践的なスキルを伸ばしたい方に最適な書籍です。この書籍では、Dockerの基本操作から始まり、Kubernetesでのクラスタ管理、サービスの自動化、スケーリング、ネットワークの設定といった高度な内容に至るまで、手厚くガイドしてくれます。

nginx実践入門

Nginxの構築と運用に関する幅広い知識を得られます。リアルなユースケースを元にした具体例が豊富に紹介されており、初心者から上級者まで、あらゆるレベルのエンジニアにとって実際の問題解決に役立ちます。

PHPフレームワークLaravel Webアプリケーション開発 バージョン8.x対応

既にLaravelの基本を知っていてスキルアップを図りたい開発者にとって、かなりおすすめです。クリーンなコーディング、保守性、テストの容易さなど、Laravelの提供する現代的なWeb開発のベストプラクティスを体系的に学べる内容が含まれています。

Takaharu Niki

・Webエンジニア6年目。
・バックエンドを中心に、フロントエンドやDevOps業務も経験。
・現在は、自社サービス企業のテックリードとして従事。

Takaharu Nikiをフォローする
Laravel
Takaharu Nikiをフォローする
アントレプログラマー
タイトルとURLをコピーしました