Laravel ✖️ MySQL ✖️ Dockerの環境構築は以下の資料を参考に構築しました。一度構築してしまえば、git cloneなんかで開発環境をローカルに再度取り入れることができるので便利です。
しかし、新しいアプリを作ろうとなった時、データベースを新規に作成したいってなるんですよね。
記事内にその方法が記載されていなかったので、実装してみました。
そのためには、知っていないといけない知識があるのでご紹介します。
ボリューム(Data Volume)とは
ボリュームとは、Dockerコンテナにおいて生成され利用されるデータを、永続的に保持する目的で利用される仕組み。
コンテナ と ボリューム の違いについて
- コンテナ内部にデータ(ファイル)を保存しても、コンテナ破棄すると消えてしまう。
- なので、データを永続化したいときは、コンテナの外にデータを置く必要がある。その場所のことを、ボリュームと呼ぶ。
ここからは新しいDatabaseを作成していきます。
データベース名、パスワード、ユーザー名の変更。
infra/mysql/Dockerfile
FROM mysql/mysql-server:8.0
ENV MYSQL_DATABASE=変更するデータベース名 \
MYSQL_USER=変更するユーザー名 \
MYSQL_PASSWORD=変更するパスワード \
MYSQL_ROOT_PASSWORD=変更するパスワード \
TZ=Asia/Tokyo
COPY ./my.cnf /etc/my.cnf
RUN chmod 644 /etc/my.cnf
[mac] $ code src/.env
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=変更するデータベース名
DB_USERNAME=変更するユーザー名
DB_PASSWORD=変更するパスワード
[mac] $ vim src/.env.example
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=変更するデータベース名
DB_USERNAME=変更するユーザー名
DB_PASSWORD=変更するパスワード
Docker volume 削除
docker volume lsと打つと、現在のコンテナ内のvolumeを確認することができます。
% docker volume ls
DRIVER VOLUME NAME
local docker-laravel-handson_db-store
local laravel_environment_db-store
volumeの削除
新規にデータベースを作成するにあたって、現在のvolumeを削除します。
※docker のコンテナが動いている時にやるとエラーを起こすします。必ずコンテナを停止してからやること
% docker volume rm docker-laravel-handson_db-store
% docker volume rm laravel_environment_db-store
Dockerの再ビルド
docker-compose up -d -build
マイグレーション実行
$ docker-compose exec php bash
root/data# php artisan migrate
ここでマイグレーションができていれば、MySqlに新しいデータベースが作成されていると思います。
マイグレーション時のエラー
私が実際に遭遇したエラーです。
root/data# php artisan migrate
QLSTATE[HY000] [1045] Access denied for user (using password: YES) (SQL: select * from information_schema.tables where table_schema = ~ and table_name = migrations and table_type = 'BASE TABLE')
at vendor/laravel/framework/src/Illuminate/Database/Connection.php:712
708▕ // If an exception occurs when attempting to run a query, we'll format the error
709▕ // message to include the bindings with SQL, which will make this exception a
710▕ // lot more helpful to the developer instead of just the database's errors.
711▕ catch (Exception $e) {
➜ 712▕ throw new QueryException(
713▕ $query, $this->prepareBindings($bindings), $e
714▕ );
715▕ }
716▕ }
+33 vendor frames
34 artisan:37
Dockerの再ビルド時にdocker compose up -d でビルドしてしまったことが原因でした。
以下のコマンドで
% docker compose down --volumes --rmi all
% docker compose up -d --build
設定ファイルがない状態でMySQLの初期化が行われたでデータが永続化されてしまってるので一度ボリューム毎削除してビルドし直せばokです。
参考資料