Implist | 駆け出し後エンジニアのための理論と実装

Laravel8.0+MySQL8.0の環境をDockerでインストールして起動する


※DockerはLaravelのインストールとMySQLの起動にのみ使用します。DockerでLaravelは起動させず、クライアントOS上で起動させます。Docker内でLaravelを起動させるとマウント等の関係で、動作が重くなるのでお使いのMacやWindows上でPHPをインストールしてLaravelを起動させてください。

ここではLaravel8.0とMySQL8.0の環境構築をDockerを使って行っていきます。

構築の流れとしては以下です。

  1. composerのコンテナを用意して、Laravelのインストール
  2. MySQLのDockerでの起動
  3. 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で開発することができます。