はじめに
最近、サーバー内の Docker でホストしていたアプリを別サーバーに移行する作業を行ったので、備忘録として記事にまとめます。
DB などのデータを蓄積するコンテナは、ボリュームのデータを正しく移行しないとデータが失われるため注意が必要です。本記事ではボリュームのデータも含めた移行手順を紹介します。
前提
- 新サーバーには旧サーバーと同じディレクトリ構成でアプリがセットアップされていること
マウントがローカルにされていた場合、マウントポイントがずれると移行後にコンテナがデータを認識できなくなるため、ディレクトリ構成は旧サーバーと揃えておく必要があります。 もしディレクトリ構成が異なる場合は、移行後にマウントポイントを修正するなどの対応が必要になります。
手順
1. 既存のコンテナをリストアップする
移行対象のコンテナを確認します。
docker ps > list.txt
後から参照できるようにファイルに出力しておくと便利です。
2. 各コンテナのボリュームを確認する
各コンテナがどのディレクトリをマウントしているか確認します。
docker inspect <コンテナ名 or ID> | grep -A 10 "Mounts"
出力例:
"Mounts": [
{
"Type": "bind",
"Source": "/srv/myapp/data",
"Destination": "/var/lib/myapp/data",
...
}
]
Source がホスト側のパス、Destination がコンテナ内のパスです。Source のパスを控えておきましょう。これが移行対象のデータになります。
3. コンテナを停止する
データ整合性を保つため、コンテナを停止してからデータをコピーします。
docker compose down
または個別に停止する場合:
docker stop <コンテナ名 or ID>
4. ボリュームを一時ディレクトリにコピーする
確認したマウントポイントのデータを作業用ディレクトリにコピーします。
cp -a /srv/myapp/data /tmp/migration/data
NOTE: マウントポイントの権限によっては sudo が必要な場合があります。
5. 必要に応じて圧縮する
転送量を減らしたい場合は tar で圧縮します。
tar czf /tmp/migration/data.tar.gz -C /tmp/migration data
6. 新サーバーに転送する
scp を使って新サーバーに転送します。
scp /tmp/migration/data.tar.gz user@new-server:/tmp/migration/
圧縮しない場合はディレクトリをそのまま転送できます。
scp -r /tmp/migration/data user@new-server:/tmp/migration/
7. 新サーバーで展開する
新サーバーにログインし、転送したファイルを展開します。
ssh user@new-server
cd /tmp/migration
tar xzf data.tar.gz
8. マウントポイントにデータを同期する
展開したデータを新サーバーの正しいマウントポイントへ同期します。
rsync -a --delete /tmp/migration/data/ /srv/myapp/data/
--delete オプションを付けると転送元にないファイルが削除されるため、クリーンな状態で同期できます。
9. 動作確認
新サーバーでコンテナを起動し、データが正しく引き継がれているか確認します。
docker compose up -d
docker ps
docker logs <コンテナ名>
DB コンテナであればログインしてデータが存在するかも確認しておきましょう。
まとめ
Docker コンテナの移行は、コンテナイメージだけでなくボリュームのデータも含めて移行する必要があります。手順をまとめると以下のようになります。
- 移行対象コンテナとボリュームのパスを確認
- コンテナを停止してからデータをコピー
scpで新サーバーに転送rsyncで正しいマウントポイントへ配置- 起動して動作確認
事前にディレクトリ構成を揃えておくことが移行をスムーズに進めるポイントです。


コメント