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です。