【Laravel】DockerでLaravel+nginx+MySQLの環境を構築してみる

おだねこ

~簡単な自己紹介~

  • 嫁と猫3匹と暮らすフルリモートの三十路SE
  • 投資・節約・副業で資産形成中
  • 現在の金融資産は約1,750万円、めざせアッパーマス層(資産3,000万円)

業務でDockerを使ってLaravel+nginx+MySQLの環境を作ることがあったので、そのときの作業メモ&手順をまとめました。

基本的に下記のQiitaの記事を参考にしています。

【超入門】20分でLaravel開発環境を爆速構築するDockerハンズオン – Qiita

当記事はLaravelが動く環境を作ることが目的の記事になります。

そのため、Dockerファイルやiniファイル、YAMLファイルなどの設定値の解説は省略し、手順の一部簡略化を行っています。

開発環境

  • OS:Windows11
  • Docker Desktopインストール済み
  • VSCodeインストール済み

事前準備

プロジェクトのフォルダを作る

任意の場所に「laravel」フォルダを作ります。

CUIを開く

プロジェクトフォルダをShiftを押しながら右クリックをして、フォルダをターミナルで開きます。

私はWindows標準のターミナルを使っていますが、CUIであればなんでも大丈夫です。

プロジェクトフォルダをVSCodeで開く

下記のコマンドを実行し、プロジェクトフォルダをVSCodeで開く。

code .

VSCode上にターミナルを表示する

メニューの表示からターミナルを表示します。

Ctrl + @がショートカットキーになるので覚えておくと便利です。

アプリケーションの定義ファイル(YAML)を作成する

下記のコマンドを実行し、YAMLファイルを作成します。

type nul > docker-compose.yml

エラーメッセージが表示されますが、YAMLファイルが作成されていれば問題ありません。

下記の内容でYAMLファイルを編集します。

version: "3.9"
services:
  app:
    build: ./infra/php
    volumes:
      - ./src:/data

  web:
    image: nginx:1.20-alpine
    ports:
      - 8080:80
    volumes:
      - ./src:/data
      - ./infra/nginx/default.conf:/etc/nginx/conf.d/default.conf
    working_dir: /data

  db:
    build: ./infra/mysql
    volumes:
      - db-store:/var/lib/mysql
    ports:
      - "3306:3306"

volumes:
  db-store:

アプリケーションコンテナ(PHP)を作成する

phpフォルダを作成する

下記のコマンドを実行し、phpフォルダを作成する。

mkdir -p infra/php

Dockerファイルを作成する

下記のコマンドを実行し、Dockerファイルを作成します。

type nul > infra/php/Dockerfile

エラーメッセージが表示されますが、Dockerファイルが作成されていれば問題ありません。

下記の内容でDockerファイルを編集します。

FROM php:8.1-fpm-buster

ENV COMPOSER_ALLOW_SUPERUSER=1 \
  COMPOSER_HOME=/composer

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

RUN apt-get update && \
  apt-get -y install --no-install-recommends git unzip libzip-dev libicu-dev libonig-dev && \
  apt-get clean && \
  rm -rf /var/lib/apt/lists/* && \
  docker-php-ext-install intl pdo_mysql zip bcmath

COPY ./php.ini /usr/local/etc/php/php.ini

WORKDIR /data

INIファイルを作成する

下記のコマンドを実行し、INIファイルを作成します。

type nul > infra/php/php.ini

エラーメッセージが表示されますが、INIファイルが作成されていれば問題ありません。

下記の内容でINIファイルを編集します。

zend.exception_ignore_args = off
expose_php = on
max_execution_time = 30
max_input_vars = 1000
upload_max_filesize = 64M
post_max_size = 128M
memory_limit = 256M
error_reporting = E_ALL
display_errors = on
display_startup_errors = on
log_errors = on
error_log = /dev/stderr
default_charset = UTF-8

[Date]
date.timezone = Asia/Tokyo

[mysqlnd]
mysqlnd.collect_memory_statistics = on

[Assertion]
zend.assertions = 1

[mbstring]
mbstring.language = Japanese

srcフォルダを作成する

下記のコマンドを実行して、srcフォルダを作成します。

mkdir src

Webコンテナ(nginx)を作成する

nginxフォルダを作成する

下記のコマンドを実行し、nginxフォルダを作成します。

mkdir infra/nginx

confファイルを作成する

下記のコマンドを実行して、confファイルを作成します。

type nul > infra/nginx/default.conf

エラーメッセージが表示されますが、confファイルが作成されていれば問題ありません。

下記の内容でconfファイルを編集します。

server {
    listen 80;
    server_name example.com;
    root /data/public;

    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-XSS-Protection "1; mode=block";
    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 app:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }

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

DBコンテナ(MySQL)を作成する

mysqlフォルダを作成する

下記のコマンドを実行して、mysqlフォルダを作成します。

mkdir infra/mysql

Dockerファイルを作成する

下記のコマンドを実行して、Dockerファイルを作成します。

type nul > infra/mysql/Dockerfile

エラーメッセージが表示されますが、Dockerファイルが作成されていれば問題ありません。

下記の内容でDockerファイルを編集します。

FROM mysql/mysql-server:8.0

ENV MYSQL_DATABASE=laravel \
  MYSQL_USER=phper \
  MYSQL_PASSWORD=secret \
  MYSQL_ROOT_PASSWORD=secret \
  TZ=Asia/Tokyo

COPY ./my.cnf /etc/my.cnf
RUN chmod 644 /etc/my.cnf

confファイルを作成する

下記のコマンドを実行して、confファイルを作成します。

type nul > infra/mysql/my.cnf

エラーメッセージが表示されますが、confファイルが作成されていれば問題ありません。

下記の内容でconfファイルを編集します。

[mysqld]
# default
skip-host-cache
skip-name-resolve
datadir = /var/lib/mysql
socket = /var/lib/mysql/mysql.sock
secure-file-priv = /var/lib/mysql-files
user = mysql

pid-file = /var/run/mysqld/mysqld.pid

# character set / collation
character_set_server = utf8mb4
collation_server = utf8mb4_ja_0900_as_cs_ks

# timezone
default-time-zone = SYSTEM
log_timestamps = SYSTEM

# Error Log
log-error = mysql-error.log

# Slow Query Log
slow_query_log = 1
slow_query_log_file = mysql-slow.log
long_query_time = 1.0
log_queries_not_using_indexes = 0

# General Log
general_log = 1
general_log_file = mysql-general.log

[mysql]
default-character-set = utf8mb4

[client]
default-character-set = utf8mb4

3つのコンテナをビルド・立ち上げ

下記のコマンドを実行して、コンテナをビルド・立ち上げます。

docker compose up -d --build

下記の3つのコンテナがStartedになっていればOKです。

  • db
  • app
  • web

Dockerの画面で3つのコンテナがRunningになっていればOKです。

Laravelをインストールする

appコンテナに入る

下記のコマンドを実行して、appコンテナに入る。

docker compose exec app bash

Laravelをインストールする

下記のコマンドを実行して、Laravelをインストールします。

composer create-project --prefer-dist "laravel/laravel=9.*" .

最後にsuccessfullyが出力されていればOKです。

アクセス権限を変更する

下記のコマンドを実行して、ディレクトリのアクセス権限を変更します。

chmod -R 777 storage bootstrap/cache

appコンテナから出る

下記のコマンドを実行して、appコンテナから出ます。

exit

3つのコンテナを再起動する

3つのコンテナを停止する

下記のコマンドを実行して、3つのコンテナを停止します。

docker compose down

envファイルを編集する

envファイルのDB関連の部分を下記の内容で編集します。

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=phper
DB_PASSWORD=secret

3つのコンテナを起動する

下記のコマンドを実行して、3つのコンテナを起動します。

docker compose up -d

下記の3つのコンテナがStartedになっていればOKです。

  • db
  • app
  • web

マイグレーションを実行する

appコンテナに入る

下記のコマンドを実行して、appコンテナに入る。

docker compose exec app bash

マイグレーションを実行する

下記のコマンドでマイグレーションを実行します。

php artisan migrate

エラーなく実行でき、すべてがDONEになっていればOKです。

環境が構築できたか確認する

Laravelのウェルカムページにアクセスする

下記のURLを開きます。

http://localhost:8080/

問題なく表示されれば、Laravelとnginxのインストールが無事完了しています。

DBクライアントツールからMySQLに接続する

ここではMySQL Workbenchから接続してみます。

A5M2DBeaverなど、お好きなDBクライアントツールを使っていただいて大丈夫です。

設定値は下記のとおりです。

項目名設定値備考
Connection NameLaravel自分がわかりやすければなんでもOK
Hostnamelocalhost
Port3306初期値が3306のはずなので、そのままでOK
UsernamephperMySQLのDockerファイルの値を使う
PasswordsecretMySQLのDockerファイルの値を使う
Default Schemalaravel

MySQLへの接続を確認する

設定が完了したら、接続ができるかテストをしてみます。

ポップアップメッセージが「Successfully」であればOKです。

以上になります。

お疲れさまでした。

Follow me!

【Laravel】DockerでLaravel+nginx+MySQLの環境を構築してみる” に対して7件のコメントがあります。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA