2025年2月4日

DockerでLaravel + MySQL環境を構築する

laravel + mysql + vueの開発環境をdockerで作れるよう勉強しています。いきなりvueまでの環境を作るのは難易度が高そうだったので、まずはvueを除いたlaravel-mysqlの環境を構築したいと思います。
勉強中なので、間違っている点があるかもしれませんが記録として残しています。

フォルダ構成

フォルダ構成は以下のように設定しました。

laravel-dev
└ docker
└ mysql
└ Dockerfile
└ my.cnf
└ php
└ Dockerfile
└ php.ini
└ src
└ testapp
└ docker-compose.yml

docker-compose.yml

コンテナはapacheを入れるappコンテナと、mysql用のdbコンテナを用意します。

version: '1.0'

services:
  app:
    build:
      context: .
      dockerfile: ./docker/php/Dockerfile
    container_name: laravel-dev-app
    ports:
      - "8020:80"
    depends_on:
      - db
    volumes:
      - ./src/:/var/www/html

  db:
    build:
      context: .
      dockerfile: ./docker/mysql/Dockerfile
    container_name: laravel-dev-db
    ports:
       - "23307:3306"
    environment:
      MYSQL_ROOT_PASSWORD: mysql
      MYSQL_DATABASE: laravel_dev
      MYSQL_USER: myuser
      MYSQL_PASSWORD: myuserp
      TZ: 'Asia/Tokyo'
    volumes:
      - mysql-volume:/var/lib/mysql

volumes:
  mysql-volume:

appコンテナ

Dockerfileの内容です。

FROM php:8.4-apache

# 複数のエクステンションをまとめてインストール
RUN apt-get update \
  && apt-get install -y git libzip-dev zip unzip \
  && docker-php-ext-install pdo_mysql mysqli zip

# Apache の rewrite_module を有効化
RUN a2enmod rewrite

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

# Composer install
#COPY --from=composer:2.4.4 /usr/bin/composer /usr/bin/composer
COPY --from=composer /usr/bin/composer /usr/bin/composer

#sedコマンドを使ってApacheのドキュメントルート(Webサーバがリクエストを流す場所)を書き換えています。
#Laravelの場合は、publicディレクトリ配下のindex.phpで最初にリクエストを処理する仕様になっているため、Apacheドキュメントルートにpublicディレクトリを指定する必要があります。
#今回はsedコマンド(ファイル内の記述を置換するコマンド)を使って/etc/apache2/sites-available/*.conf内の/var/www/htmlを/var/www/html/testapp/publicに書き換えました。
ENV APACHE_DOCUMENT_ROOT /var/www/html/testapp/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
#RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf

#ドッカーのターミナルの場所
WORKDIR /var/www/html/testapp

EXPOSE 80

php.iniファイルは最低限の設定をしています。
4行目のmbstring.internal_encodingはPHP8.xでは、mbstring.internal_encoding is deprecated というエラーが表示されるので無効化しています。

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
;mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

dbコンテナ

Dockerfileは以下のようにしました。mysqlのバージョンは8です。

FROM mysql:8.0.31

COPY ./docker/mysql/my.cnf /etc/my.cnf

my.cnfファイルは以下のようにしました。

[mysqld]
user=mysql
character_set_server = utf8mb4
collation_server = utf8mb4_0900_ai_ci

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

[mysql]
default-character-set = utf8mb4

[client]

実行手順

いよいよ実行です。

コマンドプロンプトを起動し、laravel-devフォルダに移動します。

コンテナ作成

コンテナを作成します。コンテナが作成され起動していることを確認します。

docker-compose build && docker-compose up -d

appコンテナのターミナルに入ります。
docker-compose exec {サービス名} bash となっているので、サービス名にappを指定しました。

docker-compose exec app bash

laravelインストール

laravelをインストールします。laravel-dec/src/testappにlaravelのファイルが出来ていることを確認します。
※私がインストールしたlaravel11では自動でphp artisan key:generate、およびphp artisan migrate が実行されました。されない場合は、ターミナルで実行しておく必要があります。migrateでmysqlにテーブルが作成されています。

composer create-project --prefer-dist laravel/laravel .
chmod -R 777 storage bootstrap/cache

権限エラーを回避します。

.envファイルの設定

laravelインストール当初、.envファイルが以下のようになっていました。

DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=

mysqlを使用するので以下のように変更しました。

DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel_dev
DB_USERNAME=root
DB_PASSWORD=mysql

確認

ブラウザに http://localhost:8020 でアクセスしてlaravelの画面が表示されればOKです。

Share this content: