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

コンピュータデスクで作業している人の写真

Dockerコンテナはソフトウェアの小さな箱なので、簡単にコンピュータからコンピュータにコピーしたり移動したりできます。ローカルコンピュータでDockerインスタンスに取り組み、その後より強力なサーバに移動することを決定したかもしれません。または、カスタムコンテナを複数のコンピュータに展開したいだけかもしれません。「コピー&ペースト」して回すだけです。他の時には、クラウドコンピューティングプロバイダに不満があり、別のプロバイダに切り替えたいと思うこともあります。ここでは、既存のDockerコンテナイメージとデータボリュームを1つのLinuxホストから別のホストに移動する方法を示します。

目次

  • ソースホストからコンテナイメージを保存
  • コンテナからDockerボリュームをエクスポート
  • 宛先ホストでコンテナイメージを読み込む
  • コンテナにDockerボリュームをインポート
  • ファイルを作成せずにイメージを転送
  • Docker Composeを使用して全体のDocker展開を移動

知っておくと良いこと: LinuxディストリビューションにDockerをインストールして、コンテナの使い始めをしましょう。

ソースホストからコンテナイメージを保存

まず、システムで実行中のDockerコンテナのリストを表示します。私の場合、Nginx Dockerコンテナを新しいマシンにエクスポートしたいです:

docker ps

システムで利用可能なDockerコンテナを強調表示するターミナル

コピーしたいコンテナを見つけたら、インスタンスを停止します:

docker stop NAME_OF_INSTANCE

docker stopコマンドの出力を示すターミナル

Dockerコンテナは、一般的な初期イメージから構築されます。時間が経つにつれて、このベースイメージに自分の変更を追加していきます。コンテナ内で実行されているプロセスも、自分のデータを保存したり、他の変更を加えたりすることがあります。これらすべてを保存するためには、コンテナの現在の状態を新しいイメージにコミットします:

docker commit NAME_OF_INSTANCE mycontainerimage

現在実行中のイメージから新しいイメージを作成するdocker commitコマンドの出力を示すターミナル

インスタンスが現在実行中の場合、このアクションはその内容が保存されている間に一時停止します。これが問題であれば、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コンテナに関連するデータボリュームをバックアップするプロセスを示すターミナル

新たにアーカイブされたDockerボリュームファイルをリモートマシンに送ります:

scp ./mycontainerimage-volume.tar [email protected]:/home/ramces/

宛先ホストでコンテナイメージを読み込む

リモートホストにログインし、次のコマンドを実行してリモートマシンのDockerデーモンにロードします:

docker load -i ./mycontainerimage.tar

docker createを使用して、ソースマシンからの元の実行フラグを持つDockerコンテナイメージを再初期化します。例えば、私のNginx Dockerコンテナは、元々ポート80がホストマシンのポート8080にマッピングされていました:

docker create --name my-nginx-container -p 8080:80 mycontainerimage

新たにインポートしたDockerコンテナを実行します:

docker start my-nginx-container

システムのアクティブなすべてのコンテナをリスト表示して、インポートしたイメージが正しく動作しているか確認します:

docker ps

別のシステムで実行中の同じDockerコンテナイメージを示すターミナル

FYI: Raspberry PiをDockerでPhotoprismをインストールすることで、優れたポータブル写真ギャラリーに変えましょう。

コンテナにDockerボリュームをインポート

.tar Dockerボリュームファイルをインポートするには、まず新しいホストにGitをダウンロードします:

sudo apt install git

元のシステムと同様に、docker-volume.sh補助スクリプトをダウンロードし、そのパーミッションビットを「実行」に設定してから、新しいマシンの「/usr/local/bin」ディレクトリにコピーします。

コンテナに関連したデータをバックアップするためのDockerボリュームスクリプトを取得しインストールするプロセスを示すターミナル

エクスポートしたイメージファイルを使用して新しい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 load

Windowsでも動作するはずです。今は組み込みの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-plugin

Docker Composeのインストール用に、自分のホームディレクトリに新しいフォルダを作成します:

mkdir ~/my-docker-compose && cd ~/my-docker-compose

お気に入りのテキストエディタを使用してアプリケーション用の「docker-compose.yml」ファイルを作成します:

nano ./docker-compose.yml

Composeファイルの中に次のコードブロックを貼り付け、特定のニーズに応じて調整します:

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」にアクセスします。

新しいマシンホストで正常に動作しているインポートされたNginx Dockerコンテナのスクリーンショット

Dockerコンテナを他のLinuxホストにコピーおよび移動する方法を学ぶことは、マシンでできるわずかなタスクの1つです。Dockerを使用してLinux上にMinecraftサーバーをインストールすることで、この素晴らしい自己ホスティングの世界を探求しましょう。

画像クレジット: Max Duzij via Unsplash. すべての変更とスクリーンショットをRamces Redが行いました。