😸

DockerでVolume管理しているデータベースを変更した時のTips

2022/05/02に公開

理解しないといけないこと

Docker では、volume という仕組みがあります。

コンテナは起動し、停止すると毎回破棄してしまうため、コンテナ内にデータを保存しておくことはできません。

保存するなら、volume にデータを保存する運用がよいです。

volume についてはここで説明は省略しますが、下記記事はとてもわかりやすいです。

https://qiita.com/gounx2/items/23b0dc8b8b95cc629f32

一度作成した MySQL データベースから別の名前に変更する場合の注意

docker-compose.ymlを変更するだけではうまくいかない。

その理由は MySQL のデータベースを Docker のvolumeに保存しているから。

docker-compose.ymlのデータベース情報で下記の通り記載している。

volumes:
  - db-volume:/var/lib/mysql

そのため、docker のvolumeも削除しなければならないため、volume 削除も手順として必要になる。

作業内容

  1. Docker-compose.yml の修正
  2. Laravel の.env の修正
  3. Docker volume の削除
  4. Docker の再ビルド
  5. MySQL 認証方法の変更(MySQL 8 のみ)
  6. マイグレーション実行
  7. データベース確認

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_DATABASEMYSQL_USERMYSQL_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_DATABASEMYSQL_USERMYSQL_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)

為になる文献

【Docker】docker-compose.yml の変更が DB に反映されなかった話 - Qiita

Docker volume の削除 - Qiita

GitHubで編集を提案

Discussion