前提確認
docker inspect --format '{{.Mounts}}' で /var/lib/mysql がボリューム/バインドになっているか確認。
Source が /var/lib/docker/volumes/.../_data やホストパスならデータはボリューム側で、docker commit では持ち出せない。
元PC: ボリュームをバックアップ
例(元コンテナのボリューム名が aaaa...bbbb の場合):
docker run --rm \
-v aaaaxxxxbbbb:/v \
-v "$PWD":/out \
alpine sh -c "cd /v && tar czf /out/mysql_volume.tgz ."
このコマンドを分解すると、
- docker run --rm ... alpine ...: 一時的に Alpine Linux コンテナを起動し、終了後コンテナを自動削除。
- -v aaaaxxxxbbbb:/v: 元の MySQL データが入っている Docker ボリュームをコンテナ内 /v にマウント。
- -v "$PWD":/out: 現在のホスト作業ディレクトリをコンテナ内 /out にマウント(できあがったファイルをホスト側に書き出すため)。
- sh -c "cd /v && tar czf /out/mysql_volume.tgz .": コンテナ内でシェルを実行。
- cd /v: マウントしたボリュームの中へ移動。
- tar czf /out/mysql_volume.tgz .: ボリューム内の全内容を gzip 圧縮した tar (.tgz) にまとめ、マウントされた /out(=ホストのカレントディレクトリ)へ mysql_volume.tgz という名前で出力。
5.結果: 指定ボリュームの中身がホスト側に mysql_volume.tgz として保存される。
元PC: コンテナをイメージ化しTarで持ち出す
docker commit <container_name> <image_name>
docker save -o mysql_image.tar <image_name>
新PC: イメージとデータを復元
イメージをロード:
docker load -i mysql_image.tar
ボリュームを作成しデータ展開:
docker volume create mysql-data
docker run --rm -v mysql-data:/v -v "$PWD":/in alpine sh -c "cd /v && tar xzf /in/mysql_volume.tgz"
新PC: コンテナ起動
docker run -d --name my-mysql -v mysql-data:/var/lib/mysql <image_name>:latest
初期化済みデータを持ち込んでいるため MYSQL_ROOT_PASSWORD は指定不要・無視され、元のパスワードでログイン可能。
動作確認と備え
- docker logs my-mysql で起動時エラーがないか確認。
- docker exec -it my-mysql bash で入り mysql -u root -p などでログイン確認。
- 念のため mysqldump で新環境のバックアップを取得。
- 再起動テスト: docker restart my-mysql で問題ないか確認。
まとめ
- MySQLデータがボリューム/バインドなら docker commit に含まれない。必ずボリューム中身をコピーする。
- 初回起動時のみ MYSQL_ROOT_PASSWORD が必要。既存データを復元する場合は元のパスワードが有効。
- データ移行は「イメージ(ソフト)+ボリューム(データ)」の両方をセットで持っていくのが安全。