DockerでVolume管理しているデータベースを変更した時のTips
理解しないといけないこと
Docker では、volume という仕組みがあります。
コンテナは起動し、停止すると毎回破棄してしまうため、コンテナ内にデータを保存しておくことはできません。
保存するなら、volume にデータを保存する運用がよいです。
volume についてはここで説明は省略しますが、下記記事はとてもわかりやすいです。
一度作成した MySQL データベースから別の名前に変更する場合の注意
docker-compose.yml
を変更するだけではうまくいかない。
その理由は MySQL のデータベースを Docker のvolume
に保存しているから。
docker-compose.yml
のデータベース情報で下記の通り記載している。
volumes:
- db-volume:/var/lib/mysql
そのため、docker のvolume
も削除しなければならないため、volume 削除も手順として必要になる。
作業内容
- Docker-compose.yml の修正
- Laravel の.env の修正
- Docker volume の削除
- Docker の再ビルド
- MySQL 認証方法の変更(MySQL 8 のみ)
- マイグレーション実行
- データベース確認
Docker-compose.yml の修正
下記の通り記載しているファイルを変更します。
変更前
#データベースのコンテナ
mysql:
image: mysql:8.0
container_name: mysql
ports:
- "4306:3306"
environment:
MYSQL_DATABASE: test
MYSQL_USER: docker
MYSQL_PASSWORD: docker
MYSQL_ROOT_PASSWORD: root
TZ: "Asia/Tokyo"
volumes:
- db-volume:/var/lib/mysql
MYSQL_DATABASE
、MYSQL_USER
、MYSQL_PASSWORD
を修正します。
変更後
#データベースのコンテナ
mysql:
image: mysql:8.0
container_name: mysql
ports:
- "4306:3306"
environment:
MYSQL_DATABASE: test-2
MYSQL_USER: docker-2
MYSQL_PASSWORD: docker-2
MYSQL_ROOT_PASSWORD: root
TZ: "Asia/Tokyo"
volumes:
- db-volume:/var/lib/mysql
Laravel の.env 修正
下記の通り記載しているファイルを変更します。
変更前
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test
DB_USERNAME=docker
DB_PASSWORD=docker
MYSQL_DATABASE
、MYSQL_USER
、MYSQL_PASSWORD
を修正します。
変更後
DB_CONNECTION=mysql
DB_HOST=mysql
DB_PORT=3306
DB_DATABASE=test-2
DB_USERNAME=docker-2
DB_PASSWORD=docker-2
Docker volume 削除
volume 確認
ホスト側のターミナル(or コマンドプロンプト)にて、下記コマンドを実行します。
docker volume ls
下記volume
があることを確認します。
local ****_db-volume
volume 削除
※docker のコンテナが動いている時にやるとエラーを起こす。必ずコンテナを停止してからやること
Error response from daemon: remove ****_db-volume: volume is in use - [48abed9a0abfe9b06a5bba351f0ea862d16ead41d40e48a50981a0dec5c72a29]
コンテナ停止を確認したら下記実行します。
$ docker volume rm ****_db-volume
// 削除後volumeがないことを確認する
$ docker volume ls
Docker の再ビルド
docker-compose.yml
が変更され、volume
も削除されているため、再度ビルドを実行。
下記コマンドでビルドとコンテナ起動を同時に可能。
docker-compose up -d -build
MySQL 認証方法の変更
MySQL 8 のみ実行します。
マイグレーション実行
Laravel でマイグレーションを実行するため、Laravel プロジェクトが入っている php コンテナへログインします。
$ docker-compose exec php bash
以下、コンテナ内での作業となります
/var/www/html# php artisan migrate
データベース確認
マイグレーション実行後、テーブルができているかを確認。
MySQL コンテナに入り、root ユーザーでログイン。
その後、修正したデータベース(test-2
)にテーブルがあるかを確認する。
matsunoMBP:crm-backend naoki$ docker-compose exec mysql bash
root@0573a3c19569:/# mysql -u root -p
Enter password:
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 8.0.23 MySQL Community Server - GPL
Copyright (c) 2000, 2021, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql> use test-2
Database changed
mysql>
mysql> show tables;
+-----------------------+
| Tables_in_crm_test_db |
+-----------------------+
| course |
| migrations |
| term |
| user |
+-----------------------+
4 rows in set (0.01 sec)
Discussion