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)で環境構築してみた

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

  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で開発することができます。

シェアしてね〜🤞