LoginSignup
6
5

More than 1 year has passed since last update.

Laravel ✖️ MySQL ✖️ Docker 新しいDatabaseを作成しよう

Posted at

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です。



参考資料

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5