
昔はXAMPPを使ってローカル環境構築をしてたけど、今じゃDocker使うのが当たり前。正直まだまだ俺のDockerの理解は浅いんだけど、どうしてもこのクジラをペットにしたいので勉強してみる。
とういうことで今回は最初のステップとして、Laravel + Apache + MySQL + phpMyAdmin のローカル環境構築をDockerを使用してする方法を解説する。

目次:クリックでジャンプ
ゴール

Dockerを使ってLaravelの開発環境を構築する。会社では、リーダーでない限りGitHubやBacklogからリポジトリをローカルにcloneするところから始めることが多い。しかし今回はDockerfileやYMLを作成するところからスタート。
手順は下記。
- ディレクトリとファイルを作成(まだ中身は空でOK)
- Dockerfileの作成
- 000-default.conf(バーチャルホスト)の作成
- php.ini の作成
- my.cnf の作成
- docker-compose.ymlの作成
- コマンドでImage作成してコンテナ起動
- Laravelプロジェクトの作成
- 動作確認
ディレクトリとファイルを作成(まだ中身は空でOK)
フォルダ構成はこんな感じでOK。php.iniはPHP設定用のファイルで000-default.confはApacheの設定ファイル。 dbフォルダのdataフォルダ内にはMySQLのデータを保存して、my.cnfはMySQLの設定ファイル。 srcフォルダにはLaravelのソースを格納するフォルダになる。
Dockerfileの作成
# どんな docker イメージを利用して構築をするかを指定 # FROM : 今回はPHPの公式イメージの「php:8.4-apache」というイメージを指定 # このイメージはPHPとApacheが両方パックでインストールされているイメージで、Docker Hubというサイトからダウンロードされる。 FROM php:8.4-apache # 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる # ADD:ローカルのファイルをDockerコンテナ内にコピーする # 左側の「php.ini」はローカルで右側の「/usr/local/etc/php/」はDockerコンテナ内 ADD php.ini /usr/local/etc/php/ ADD 000-default.conf /etc/apache2/sites-enabled/ # Composerのインストール # RUN:コンテナ内でコマンド実行 RUN cd /usr/bin && curl -s http://getcomposer.org/installer | php && ln -s /usr/bin/composer.phar /usr/bin/composer # ミドルウェアのインストール RUN apt-get update \ && apt-get install -y \ git \ zip \ unzip \ vim \ libpng-dev \ libpq-dev \ && docker-php-ext-install pdo_mysql RUN pecl install xdebug && \ docker-php-ext-enable xdebug # Laravelで必要になるmodRewriteの有効化 RUN mv /etc/apache2/mods-available/rewrite.load /etc/apache2/mods-enabled RUN /bin/sh -c a2enmod rewrite
Dockerfile とは、Dockerイメージを作成するための設定値が記述されるファイルで、このファイルをビルドすることでDockerイメージが作成される。コンテナを作成するときに利用するイメージ情報を主に記述。
000-default.conf(バーチャルホスト)の作成
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/practicedocker/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html/practicedocker/public>
AllowOverride All
</Directory>
</VirtualHost>
「practicedocker」というフォルダは、あとで作成するLaravelプロジェクト名。
php.ini の作成
[Date] date.timezone = "Asia/Tokyo" [mbstring] mbstring.internal_encoding = "UTF-8" mbstring.language = "Japanese" [xdebug] xdebug.mode=debug xdebug.start_with_request=yes xdebug.client_host=host.docker.internal xdebug.client_port=9003 xdebug.log=/tmp/xdebug.log xdebug.log_level=0
my.cnf の作成
[mysqld] character-set-server=utf8
my.cnf とは Linux の設定ファイル。 MySQLの文字コードがをShift-JIS から UTF-8 に変えるために my.cnf を修正。
docker-compose.ymlファイルの作成
# Compose fileのバージョン指定
version: '3.8'
# どんなコンテナを立ち上げるか
services:
# ---laravelを動かすコンテナ --------------------------------------
app:
# どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの80番につなぐ
ports:
- "80:80"
# 先ほど作ったDockerfileを使って、コンテナをビルドするという指定
build: ./docker/app
# コンテナの名前を指定
container_name: laravel_app
# ローカルのディレクトリとコンテナ上のディレクトリのリンクを設定
# ./src は docker-composer.yml のディレクトリ直下にある src を設定している
# コンテナが作成されると src ディレクトリからコンテナの /var/www/html にアクセスすることができる
volumes:
- ./src:/var/www/html
# ---MySQLを動かすコンテナ----------------------------------------
db:
# Docker HubからMySQL5.7の公式イメージをダウンロードしてくる指定
image: mysql:8.0
container_name: laravel_db
# コンテナ内の環境変数を指定。環境変数を渡すとビルド時に設定してくれるDockerイメージがあるので、利用の際はDocker Hubのサイトで確認する
environment:
MYSQL_ROOT_PASSWORD: root
MYSQL_DATABASE: laravel_db
MYSQL_USER: laravel_user
MYSQL_PASSWORD: laravel_pass
TZ: 'Asia/Tokyo'
# 起動時のコマンド
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
# ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
volumes:
- ./docker/db/data:/var/lib/mysql
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- 3306:3306
# phpMyAdminを動かすコンテナ
phpmyadmin:
image: phpmyadmin/phpmyadmin:5
environment:
PMA_HOST: 'db'
PMA_USER: 'laravel_user'
PMA_PASSWORD: 'laravel_pass'
# コンテナの名前
container_name: phpmyadmin
# コンテナと他のサービスを繋げる
links:
- db
# localhost:8080 で phpmyadmin の管理画面にアクセス
ports:
- 8080:80
# セッション情報をボリュームに設定して永続化
volumes:
- ./docker/phpmyadmin/sessions:/sessions
# メール情報を追加
# 1025 - IMAP port メール送信用
# 8025 - localhost:8025 mailpitのWEB UI
mail:
image: axllent/mailpit
container_name: mailpit
ports:
- 8025:8025
- 1025:1025
例えば↓こんな感じにプロジェクト合うように↑を修正。 
launch.jsonにデバッグの設定
VSCODE側の設定としてlaunch.jsonを以下のように設定
"configurations": [
{
"name": "Listen for Xdebug",
"type": "php",
"request": "launch",
"port": 9003, // //php.iniで設定したxdebug用のport番号
"pathMappings": {
"/var/www/html": "${workspaceRoot}/src" // {docker上のdocument root}:{ローカルのdocument root}
}
},
コマンドでImage作成してコンテナ起動
# プロジェクトディレクトリに移動 $ cd PracticeDocker # Dockerイメージを作成(直下にdocker-compose.ymlがあること) $ docker-compose build # Dockerを起動 # -d オプションでバックグランド起動 $ docker-compose up -d # 起動しているコンテナが表示される $ docker ps

compose up -d実行でエラーが出たら以下を参照 https://sneakyblog.com/how_to_solve_port_conflict_error/
Laravelプロジェクトの作成
# appコンテナ(名称:laravel_app)に入る $ winpty docker-compose exec app bash # 以下でもdockerコンテナに入れる $./container.sh # Laravelプロジェクト作成 $ composer create-project --prefer-dist laravel/laravel practicedocker "6.18.*" # laravelバージョン11以上はこっち↓ $ composer create-project --prefer-dist laravel/laravel:^11.0 calendar # Laravelプロジェクト移動 $ cd practicedocker # ストレージの権限変更 $ chmod 777 -R storage/ # composerをインストール $ composer install $ cp .env.example .env $ php artisan storage:link $ php artisan key:generate $ php artisan migrate
ホスト側のsrcディレクトリ直下にもpracticedockerディレクトリが同期される。 
動作確認
上記にアクセスして、Laravel のスタート画面とphpMyAdminの管理画面と受信メール画面が表示されてれば成功。 

セッションの保存先がDBになっているのに、sessionsテーブルが作成されていない内容のエラーが出た場合は、とりあえず .env ファイルの SESSION_DRIVER を file に変更する。そして画面を再度読み込む。
SQLSTATE[HY000]: General error: 8 attempt to write a readonly database (Connection: sqlite, SQL: update "sessions" set "payload" =
.gitignoreファイル追加

db配下のファイルはpushしたくないので、git管理下に置かない。
また、phpmyadmin/sessions/.gitignore を作成する。
shell
container connect
# shell起動 $ ./container.sh root@390cfc38dae:var/www/html# [コマンド]
DB connect
# shell起動 $ ./db-connect.sh mysql> [コマンド]
次にデータベースに接続できるように設定をする必要がある。以下を参照すればOK! https://sneakyblog.com/mysql-laravel-docker/ そのままreactを導入したい場合こちらを参照↓ https://sneakyblog.com/start-laravel-react-tailwind-project/
参照したサイト
下記のサイトがマジ超分かりやすい。当記事の内容は下記のサイトを参照してます。 ⇒https://laraweb.net/environment/8652/