DockerでLaravel+Apache+MySQLの開発環境を構築する

Dockerはtestvmといった形で用意されているとします。

WordPressをDocker上に建てる

フォルダ構成
----
.
├── docker/
│ ├── app/
│ │ ├ Dockerfile
│ │ ├ php.ini # PHP設定用のファイル
│ │ └ 000-default.conf # Apacheの設定ファイル
│ └── db/
│ ├ data/ # MySQLのデータを保存しておくディレクトリ
│ └ my.cnf # MySQLの設定ファイル

├── src/ # Laravelのソースを格納するディレクトリ
└── docker-compose.yml
----

$ vim Dockerfile
----
# どんなdockerイメージを利用して構築をするか
FROM php:8.0-apache

# 設定ファイルをdockerコンテナ内のPHP、Apacheに読み込ませる
ADD php.ini /usr/local/etc/php/
ADD 000-default.conf /etc/apache2/sites-enabled/

# Composerのインストール
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
----

$ vim 000-default.conf
----
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/laravelapp/public
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
<Directory /var/www/html/laravelapp/public>
AllowOverride All
</Directory>
</VirtualHost>
----

$ vim php.ini
----
[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
internal_encoding = "UTF-8"
mbstring.language = "Japanese"
----

$ vim my.cnf
----
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
[client]
default-character-set=utf8mb4
----

$ vim docker-compose.yml
----
version: '3'
# どんなコンテナを立ち上げるか
services:
# laravelを動かすコンテナ
app:
# どのポートを開いて繋ぐか。下記はコンテナの80番ポートを開いて、ホストの8000番につなぐ
ports:
- "8000:80"
# 先ほど作ったDockerfileを使って、コンテナをビルドするという指定
build: ./docker/app
# コンテナの名前を指定
container_name: laravel_app
# コンテナとホスト側のディレクトリを同期する場所の指定。laravelのソースが入る予定の場所
volumes:
- ./src:/var/www/html
# MySQLを動かすコンテナ
db:
# Docker HubからMySQL5.7の公式イメージをダウンロードしてくる指定
image: mysql:5.7
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=utf8mb4 --collation-server=utf8mb4_unicode_ci
# ディレクトリ同期。設定ファイルとMySQLのデータが保存される場所を同期している。コンテナは基本的に起動時に変更されてもコンテナ自体が止まるとデータが消えてしまうため、保存しておきたいものはホストマシンと同期しておく必要がある。
volumes:
- ./docker/db/data:/var/lib/mysql
- ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
ports:
- 3306:3306
----

$ docker-compose build
$ docker-compose up -d
$ docker-compose stop

$ docker exec -it laravel_app bash
$ composer create-project "laravel/laravel=~9.0" --prefer-dist laravelapp
$ chmod 777 -R laravelapp/storage

ブラウザでアクセス
http://192.168.56.10:8000

$ vim .env
----
DB_CONNECTION=mysql
DB_HOST=laravel_db
DB_PORT=3306
DB_DATABASE=laravel_db
DB_USERNAME=laravel_user
DB_PASSWORD=laravel_pass
----

$ php artisan migrate
$ php artisan migrate:refresh

参考にさせてもらいました!
https://note.com/pocke_techblog/n/n8af813848fa0