どうやってDockerコンテナを別のホストにコピー/移動するか

Dockerコンテナはソフトウェアの小さな箱なので、簡単にコンピュータからコンピュータにコピーしたり移動したりできます。ローカルコンピュータでDockerインスタンスに取り組み、その後より強力なサーバに移動することを決定したかもしれません。または、カスタムコンテナを複数のコンピュータに展開したいだけかもしれません。「コピー&ペースト」して回すだけです。他の時には、クラウドコンピューティングプロバイダに不満があり、別のプロバイダに切り替えたいと思うこともあります。ここでは、既存のDockerコンテナイメージとデータボリュームを1つのLinuxホストから別のホストに移動する方法を示します。
目次
- ソースホストからコンテナイメージを保存
- コンテナからDockerボリュームをエクスポート
- 宛先ホストでコンテナイメージを読み込む
- コンテナにDockerボリュームをインポート
- ファイルを作成せずにイメージを転送
- Docker Composeを使用して全体のDocker展開を移動
知っておくと良いこと: LinuxディストリビューションにDockerをインストールして、コンテナの使い始めをしましょう。
ソースホストからコンテナイメージを保存
まず、システムで実行中のDockerコンテナのリストを表示します。私の場合、Nginx Dockerコンテナを新しいマシンにエクスポートしたいです:
docker ps
コピーしたいコンテナを見つけたら、インスタンスを停止します:
docker stop NAME_OF_INSTANCE
Dockerコンテナは、一般的な初期イメージから構築されます。時間が経つにつれて、このベースイメージに自分の変更を追加していきます。コンテナ内で実行されているプロセスも、自分のデータを保存したり、他の変更を加えたりすることがあります。これらすべてを保存するためには、コンテナの現在の状態を新しいイメージにコミットします:
docker commit NAME_OF_INSTANCE mycontainerimage
インスタンスが現在実行中の場合、このアクションはその内容が保存されている間に一時停止します。これが問題であれば、docker commit -p=false NAME_OF_INSTANCE mycontainerimageを代わりに入力することで、この一時停止を回避できます。しかし、絶対に必要でない限り、これを行わないでください。この場合、不整合または不完全なデータを持つイメージが作成される可能性が高くなります。
次に、新たにコミットしたDockerコンテナイメージをアーカイブファイルに保存します:
docker save -o mycontainerimage.tar mycontainerimageお気に入りのファイル転送方法を使用して、.tarファイルをDockerコンテナを移動したいホストにコピーします。例えば、以下のコマンドは私のNginx Dockerイメージをscpを使って転送します:
scp ./mycontainerimage.tar [email protected]:/home/ramces/コンテナからDockerボリュームをエクスポート
Dockerイメージを保存することの欠点の1つは、コンテナと一緒にセットアップしたDockerアクセサリーが付属しないことです。これには、永続データを保存するために作成したボリュームやネットワークバインドマウントが含まれます。
データボリュームを正しくエクスポートするために、まずローカルマシンにGitをインストールします:
sudo apt install git次のコマンドを実行して、Docker用のボリュームエクスポートスクリプトをダウンロードします:
git clone https://github.com/ricardobranco777/docker-volumes.sh.gitエクスポートスクリプトに正しいパーミッションビットが設定されていることを確認し、マシンの「/usr/local/bin」にコピーします:
sudo chmod +x ./docker-volumes.sh/docker-volumes.sh
sudo cp ./docker-volumes.sh/docker-volumes.sh /usr/local/bin/スクリプトが正しく動作するかテストし、コンテナに関連するすべてのボリュームを抽出します:
docker-volumes.sh -h
docker-volumes.sh NAME_OF_INSTANCE save mycontainerimage-volume.tar
新たにアーカイブされたDockerボリュームファイルをリモートマシンに送ります:
scp ./mycontainerimage-volume.tar [email protected]:/home/ramces/宛先ホストでコンテナイメージを読み込む
リモートホストにログインし、次のコマンドを実行してリモートマシンのDockerデーモンにロードします:
docker load -i ./mycontainerimage.tardocker createを使用して、ソースマシンからの元の実行フラグを持つDockerコンテナイメージを再初期化します。例えば、私のNginx Dockerコンテナは、元々ポート80がホストマシンのポート8080にマッピングされていました:
docker create --name my-nginx-container -p 8080:80 mycontainerimage新たにインポートしたDockerコンテナを実行します:
docker start my-nginx-containerシステムのアクティブなすべてのコンテナをリスト表示して、インポートしたイメージが正しく動作しているか確認します:
docker ps
FYI: Raspberry PiをDockerでPhotoprismをインストールすることで、優れたポータブル写真ギャラリーに変えましょう。
コンテナにDockerボリュームをインポート
.tar Dockerボリュームファイルをインポートするには、まず新しいホストにGitをダウンロードします:
sudo apt install git元のシステムと同様に、docker-volume.sh補助スクリプトをダウンロードし、そのパーミッションビットを「実行」に設定してから、新しいマシンの「/usr/local/bin」ディレクトリにコピーします。

エクスポートしたイメージファイルを使用して新しいDockerコンテナを作成します:
docker create --name my-nginx-container -v myvol:/usr/share/nginx/html -p8080:80 mycontainerimage元の.tarファイルを使用して、docker-volume.shスクリプトを実行し、新しいシステムのDockerデーモンにロードします:
docker-volumes.sh my-nginx-container load mycontainerimage-volume.tar次のコマンドを実行して新しいDockerコンテナを開始します:
docker start my-nginx-containerコンテナがボリュームを正しくロードしているか内部の設定データを見てテストします:
docker inspect -f '{{ .Mounts }}' my-nginx-container
ファイルを作成せずにイメージを転送
時には、mycontainerimage.tar.gzファイルの作成をスキップしたいこともあります。コンテナ内に大量のデータがあるため、ディスクスペースが不足しているかもしれません。イメージを保存、転送、ロードするすべてを1つのコマンドで行うことができます。上記のdocker commitコマンドを実行した後、これを使用します:
docker save mycontainerimage | ssh [email protected] docker loadWindowsでも動作するはずです。今は組み込みのSSHクライアントがあるので(もはやPuTTYは必要ありません)。
あなたの状況に合ったdocker createコマンドを続けて実行します。
注意: インポートしたイメージを開始する前に、以前にコンテナに接続されていたDockerボリュームが正しくマウントされていることを確認してください。
最後に、コンテナの名前の後にdocker startを実行して、新たにインポートされたDockerコンテナを開始します。

Docker Composeを使用して全体のDocker展開を移動
DockerのComposeプラグインを使用すると、サーバの基盤となるソフトウェアスタックを気にすることなく、複雑なプログラムを構築、構成、実行することができます。これにより、異なるLinuxシステム全体で再現可能なアプリケーション展開を構築できます。
既存のDocker設定をDocker Composeに移行を始めるには、まずそのプラグインが現在システムにインストールされていることを確認します:
sudo apt install docker-compose-plugin docker-buildx-pluginDocker Composeのインストール用に、自分のホームディレクトリに新しいフォルダを作成します:
mkdir ~/my-docker-compose && cd ~/my-docker-composeお気に入りのテキストエディタを使用してアプリケーション用の「docker-compose.yml」ファイルを作成します:
nano ./docker-compose.ymlComposeファイルの中に次のコードブロックを貼り付け、特定のニーズに応じて調整します:
version: '3'
volumes:
myvol: # インポートしたボリュームの名前で置き換えます。
services:
nginx:
image: mycontainerimage # インポートしたDockerイメージの名前で置き換えます。
ports:
- "8080:80"
volumes:
- myvol:/usr/share/nginx/html # "myvol"をマウントされたイメージの名前に置き換えます。新しいComposeファイルを保存し、次のコマンドを実行して開始します:
docker compose up -d最後に、Compose展開が正しく動作しているかテストします。私の場合、Nginx DockerコンテナをテストするためにWebブラウザを開き、「localhost:8080」にアクセスします。

Dockerコンテナを他のLinuxホストにコピーおよび移動する方法を学ぶことは、マシンでできるわずかなタスクの1つです。Dockerを使用してLinux上にMinecraftサーバーをインストールすることで、この素晴らしい自己ホスティングの世界を探求しましょう。
画像クレジット: Max Duzij via Unsplash. すべての変更とスクリーンショットをRamces Redが行いました。