Laravelで使用するMySQLをDockerで用意する【M1 Mac】

Laravelで使用するMySQLをDockerで用意する【M1 Mac】

ローカルでLaravelのプロジェクトを作成し、データベースだけをDockerで用意する方法をまとめました。

環境

PC:Apple M1 Pro

作成するMySQLバージョン:8.0

Laravelのプロジェクトを作成する

例: SampleApp というプロジェクト名でバージョン8.xを使用する場合


composer create-project laravel/laravel --prefer-dist SampleApp "8.x"

cd SampleApp

この先実行するコマンドは基本的にSampleAppで実行します。

データベースのデータ用フォルダ、設定ファイルを作成する

Laravelプロジェクト内にdockerというフォルダを作成し、その中にDockerコンテナ内で作成する、MySQLのデータを保存する用のフォルダと、MySQLに追記する設定ファイルを記載します。


mkdir docker

cd docker

mkdir db 

touch mysql.cnf

mysql.cnfを以下のように編集します。文字設定、照合順序を指定しています。


[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

[mysql]
default-character-set = utf8mb4
 
[client]
default-character-set = utf8mb4

文字設定をutf8にしない場合、日本語が以下のように文字化けしてしまします。


mysql> select * from customers;
+----+---------+---------------------+---------------------+
| id | name    | created_at          | updated_at          |
+----+---------+---------------------+---------------------+
|  1 | ???? ?? | 2022-02-12 08:22:22 | 2022-02-12 08:22:22 |
|  2 | ???? ?? | 2022-02-12 08:22:22 | 2022-02-12 08:22:22 |
+----+---------+---------------------+---------------------+
2 rows in set (0.01 sec)

dbフォルダは、空のままにしておきます。

docker-compose.ymlを作成

docker-composeを用いてMySQLコンテナを作成します。
Laravelプロジェクト内で、docker-compose.ymlを作成し、編集します。


touch docker-compose.yml

version: '3.8'

services:
  db:
    platform: linux/x86_64 # M1チップはこの記載が必要
    image: mysql:8.0
    environment:
        MYSQL_ROOT_PASSWORD: root
        MYSQL_DATABASE: sample
        MYSQL_USER: user
        MYSQL_PASSWORD: pass
        TZ: 'Asia/Tokyo'
    volumes:
        - ./docker/db:/var/lib/mysql
        - ./docker/mysql.cnf:/etc/mysql/conf.d/mysql.cnf
    ports:
        - 3306:3306

コンテナを立ち上げ、MySQLにアクセスする


# コンテナ立ち上げ
docker-compose up -d

# コンテナへ入る
docker-compose exec db bash


# テーブルを指定してMySQLへアクセス
mysql -u user -ppass sample

mysql>

MySQLへアクセスできたら、以下コマンドで先程設定した文字設定が確認できます。


mysql> SHOW VARIABLES LIKE "chara%";
+--------------------------+--------------------------------+
| Variable_name            | Value                          |
+--------------------------+--------------------------------+
| character_set_client     | utf8mb4                        |
| character_set_connection | utf8mb4                        |
| character_set_database   | utf8mb4                        |
| character_set_filesystem | binary                         |
| character_set_results    | utf8mb4                        |
| character_set_server     | utf8mb4                        |
| character_set_system     | utf8mb3                        |
| character_sets_dir       | /usr/share/mysql-8.0/charsets/ |
+--------------------------+--------------------------------+
8 rows in set (0.06 sec)

MySQL、コンテナから抜けるにはexitを使用します。


mysql> exit
Bye
root@e40224abf02:/# exit
exit

Laravelからデータベースへアクセスする

MySQLのコンテナが用意できたので、Laravelからコンテナへアクセスするように設定していきます。

データベースへ接続するために、.envファイルの以下の部分を編集します。


DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=sample
DB_USERNAME=user
DB_PASSWORD=pass

.envファイルを変更したら、以下コマンドを実行して反映させます。


php artisan cache:clear

マイグレーションを実行します。


php artisan migrate

Migration table not found.
Migration table created successfully.
Migrating: 2019_12_14_000001_create_personal_access_tokens_table
Migrated:  2019_12_14_000001_create_personal_access_tokens_table (188.85ms)

問題なく実行できていたら完了です!

フォルダ構成

最終的なフォルダ構成は以下のようになっています。


├── app

# Laravelのフォルダ郡

├── webpack.mix.js
├── docker # ここから下が、今回独自に作成したフォルダ・ファイル
│   ├── db
│   └── mysql.cnf
└── docker-compose.yml
docker