Laravel8.0+MySQL8.0の環境をDockerでインストールして起動する
※DockerはLaravelのインストールとMySQLの起動にのみ使用します。DockerでLaravelは起動させず、クライアントOS上で起動させます。Docker内でLaravelを起動させるとマウント等の関係で、動作が重くなるのでお使いのMacやWindows上でPHPをインストールしてLaravelを起動させてください。
ここではLaravel8.0とMySQL8.0の環境構築をDockerを使って行っていきます。
※Laravel9の環境構築は以下を参考にしてください
「Laravel9+Sail(Docker)で環境構築してみた」
構築の流れとしては以下です。
- composerのコンテナを用意して、Laravelのインストール
- MySQLのDockerでの起動
- LaravelとMySQLの連携
ディレクトリ構成も以下に示します。
.
├── container
│ └── mysql
│ ├── Dockerfile
│ ├── conf.d
│ │ └── mysql.cnf
│ └── init.d
│ └── user.sql
├── docker-compose.yml
└── myApp ・・・Laravelプロジェクト
└── ・・・以下省略
この構成をみながらファイルを作成していってください。
composerのコンテナを用意して、Laravelのインストール
composerのコンテナを用意する
docker-composeを使ってcomposerのコンテナを用意します。
バージョンは2.0.8を指定します。常に最新版を使いたい場合はimage: composer:latestのように記述しましょう。
docker-compose.yml
version: "3"
services:
composer:
image: composer:2.0.8
volumes:
- ${PATH_TO_COMPOSER_JSON:-./}:/app
volumesのマウントの設定でどのディレクトリのcomposer.jsonを読むかしていしています。ディレクトリを変更したい場合は、.envのPATH_TO_COMPOSER_JSONのパスを記述してください。
.env
PATH_TO_COMPOSER_JSON=./
この2ファイルを作り終えたら、composerが使用できるか確認します。
$ docker-compose run composer composer -V
対象のイメージをダウンロードして、コンテナ內部のcomposerコマンドでバージョンを表示しています。以下のように表示されるかと思います。
Creating sample_composer_run ... done
Composer version 2.0.12 2021-04-01 10:14:59
Laravelのインストール
以下コマンドでLaravelをインストールしていきます。
docker-compose run composer composer create-project --prefer-dist laravel/laravel=8.0 myApp
結構インストールするのに時間がかかるので気長に待ちましょう。
インストールが完了すると、docker-compose.ymlがあるディレクトリにmyAppというLaravelのプロジェクト(ディレクトリ)が配置されます。
もし他のパス(一つ上や特定のディレクトリ配下等)にプロジェクトを配置したい場合は.envのPATH_TO_COMPOSER_JSONを変更してください。
続いてmyAppディレクトリに移動し、Laravelを起動しましょう
php artisan serve
※Laravel8はPHP7.3.0以上でしか動作しないので、インストールまたはアップデートしてください。
http://localhost:8000にアクセスするとLaravelの初期画面が確認出来ると思います。
MySQLのDockerでの起動
MySQLをDockerで起動させるために、先程のdocker-compose.ymlを以下のように書き換えてください。composerのセクションは同じです
docker-compose.yml
version: "3"
services:
mysql:
build:
context: ./container/mysql
dockerfile: Dockerfile
environment:
MYSQL_DATABASE: ${DB_NAME:-myapp}
MYSQL_USER: user
MYSQL_PASSWORD: user!
MYSQL_ROOT_PASSWORD: root!
TZ: "Asia/Tokyo"
ports:
- ${MYSQL_PORT:-3306}:3306
volumes:
- mysql-data-store:/var/lib/mysql
- ./mysql/logs:/var/log/mysql
- ./container/mysql/init.d:/docker-entrypoint-initdb.d
- ./container/mysql/conf.d:/etc/mysql/conf.d
composer:
image: composer:2.0.8
volumes:
- ${PATH_TO_COMPOSER_JSON:-./}:/app
volumes:
mysql-data-store:
また.envも以下のように書き変えましょう
MYSQL_PORT=3306
MYSQL_DATABASE=myapp
MYSQL_USER=user
MYSQL_PASSWORD=user!
MYSQL_ROOT_PASSWORD=root!
PATH_TO_COMPOSER_JSON=./
次はMySQLのDockerfileを作成します
Dockerfile
FROM mysql:8.0.16
LABEL maintainer "ucan"
COPY conf.d/mysql.cnf /etc/mysql/conf.d/mysql.cnf
RUN set -eux && \
mkdir /var/lib/mysql-files
COPYの行で以下のファイルをDockerコンテナ内にコピーしています。
mysql.cnfはMySQLの設定を記述したものです。
mysql.cnf
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_bin
caching_sha2_password to mysql_native_password
default-authentication-plugin = mysql_native_password
# Error Log
log-error = /var/log/mysql/mysql-error.log
# Slow Query Log
slow_query_log = 1
slow_query_log_file = /var/log/mysql/mysql-slow.log
long_query_time = 5.0
log_queries_not_using_indexes = 0
# General Log
general_log = 1
general_log_file = /var/log/mysql/mysql-query.log
[client]
default-character-set = utf8mb4
以下は初期データです。userテーブルとそのデータをMySQL起動時にインサートします。
user.sql
CREATE TABLE `user` (
`user_id` BIGINT unsigned NOT NULL AUTO_INCREMENT COMMENT 'user id',
`name` VARCHAR(20) NOT NULL COMMENT 'user name',
`email` VARCHAR(256) NOT NULL COMMENT 'user email',
`created_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
`updated_at` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`user_id`),
UNIQUE (`email`)
);
INSERT INTO `user` (`name`, `email`) VALUES ('testname', 'test@example.com');
この状態でdocker-compose upをするとMySQLが立ち上がるのが確認できます。
LaravelとMySQLの連携
LaravelとMySQLが用意できたので、いよいよこれらを連携させていきます。
とはいっても簡単で、myApp/.envを書き換えます。
DBの接続情報を今回作成したMySQLの設定通りに書き換えます。※docker-composeの.envではないので注意してください
myApp/.env
DB_DATABASE=myapp
DB_USERNAME=user
DB_PASSWORD=user!
他の設定
次にmyApp直下でLaravelのtinkerを呼び出します。
php artisan tinker
これでLaravelの機能がコマンドラインから使えるようになるので、DBに接続できているか確認します。
>>> DB::select('select 1');
この結果以下のように表示されれば成功です。
=> [
{#3345
+"1": 1,
},
]
>>>
お疲れさまでした、これでLaravel+MySQLで開発することができます。