15
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Docker Desktop(WSL2)でMySQLコンテナのボリュームを永続化する方法

Posted at

概要

  • Windows環境でDocker Desktop(WSL2バックエンド)を利用してMySQLコンテナを立ち上げた場合、
    再起動時にデータが消える 問題に遭遇することが多い。
  • 原因は「コンテナ内の /var/lib/mysql ディレクトリが一時ストレージとして扱われる」ためであり、
    永続化するには Docker Volume を正しく設定する必要がある。
  • 本ナレッジでは、Windows + WSL2 環境でMySQLコンテナのデータを永続化する正しい構成方法と、
    Windows特有の罠(パス/権限/速度問題) について解説する。

手順

1. 環境の前提

  • OS:Windows 10 / 11
  • Docker Desktop:v4.0 以降(WSL2バックエンド)
  • WSLディストリビューション:Ubuntu 20.04 など
  • MySQLイメージmysql:8.0 推奨

2. Volumeを利用したMySQL起動

docker-compose.yml 例

version: '3.9'
services:
  db:
    image: mysql:8.0
    container_name: mysql_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: app_db
      TZ: Asia/Tokyo
    ports:
      - "3306:3306"
    volumes:
      - mysql_data:/var/lib/mysql

volumes:
  mysql_data:
    driver: local

💡 volumes で定義した mysql_dataDocker管理下の永続ストレージ に保存されるため、
コンテナを削除してもデータは残る。


3. 永続化の確認

# コンテナ停止・削除
docker compose down

# Volumeが残っているか確認
docker volume ls

# 再度コンテナ起動(データが残っていることを確認)
docker compose up -d

4. Windows環境固有の罠

問題点 内容 対処方法
bind mountでCドライブを指定すると遅い WSL⇔Windows間のI/O遅延が発生 Docker Volumeを使う(/var/lib/docker/volumes/... 内で完結)
⚠️ パス区切り文字の違い C:\Users\xxx 形式はDocker内部で正しく解釈されない /mnt/c/Users/... 形式を使用
⚠️ 権限エラー Windows側のNTFS権限とLinux側のUID/GID不一致 chmod -R 777 または chown mysql:mysql を実行
⚠️ WSLディストリビューション削除で全データ消失 Docker VolumeはWSL内に保存 定期的に docker volume inspect でパス確認&バックアップを推奨

5. 明示的にホストディレクトリをマウントしたい場合

テスト用途などで、ホスト側に直接データを置きたい場合。

volumes:
  - ./mysql_data:/var/lib/mysql

⚠️ ただしこの方法は Cドライブ直下では非常に遅い ため、
以下のように WSL内ディレクトリに配置 するのが推奨:

cd /home/youruser/projects/app
mkdir -p mysql_data
volumes:
  - /home/youruser/projects/app/mysql_data:/var/lib/mysql

注意点・Tips

  • Docker Volumeの実体確認

    docker volume inspect mysql_data
    

    "Mountpoint" に実際の保存パスが表示される(例:/var/lib/docker/volumes/mysql_data/_data

  • バックアップ/リストア

    docker run --rm -v mysql_data:/volume -v $(pwd):/backup busybox tar czf /backup/mysql_backup.tgz -C /volume . 
    
  • MySQLデータを消したい場合

    docker volume rm mysql_data
    

まとめ

  • Windows(WSL2)環境では、Volume方式が最も安定
  • bind mount でWindowsパスを直接指定すると、速度・権限トラブルが頻発する。
  • docker volume inspect で保存パスを定期確認し、
    WSL再インストール時のデータ消失リスク に備えてバックアップを取るのが重要。

改訂履歴

  • v1.0 (2025-11-06):初版作成(Windows環境でのVolume永続化方法を追加)
15
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
15
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?