web-dev-qa-db-ja.com

異なるホスト間でDockerコンテナーを移動する方法は?

あるホストから別のホストにコンテナーを実行しているドッカーを移動する方法が見つかりません。

画像の場合のようにコンテナをリポジトリにプッシュする方法はありますか?現在、コンテナ内で実行されているアプリケーションに関連するデータを保存するためにデータボリュームを使用していません。そのため、一部のデータはコンテナ内に存在しますが、セットアップを再設計する前に保持したいものです。

74
Dinesh Reddy

実行中のdockerコンテナをあるホストから別のホストに移動することはできません。

docker commitを使用してコンテナーの変更をイメージにコミットし、イメージを新しいホストに移動してから、docker runを使用して新しいコンテナーを開始できます。これにより、アプリケーションがコンテナ内に作成したデータが保持されます。

Nb:ボリューム内に保存されているデータは保存されません。データボリュームを新しいホストに手動で移動する必要があります。

42
larsks

または、リポジトリにプッシュしたくない場合:

  1. コンテナーをtarballにエクスポートします

    docker export <CONTAINER ID> > /home/export.tar
    
  2. Tarballを新しいマシンに移動します

  3. インポートして戻す

    cat /home/export.tar | docker import - some-name:latest
    
79
aholt

紛らわしいマニュアルとわかりにくいチュートリアルの後、Dockerは明らかに 膨らんだ期待のピーク で書いているので、最終的には私にとってはうまくいきました:

  1. Dockerイメージをアーカイブに保存します。
    docker save image_name > image_name.tar
  2. 別のマシンにコピーする
  3. 他のdockerマシンで、次の方法でdocker loadを実行します。
    cat image_name.tar | docker load

別の回答で提案されているように、エクスポートとインポートでは、ポートと変数はエクスポートされません。これらは、コンテナの実行に必要な場合があります。そして、 "No command specified"などのようなものになるかもしれません...別のマシンにロードしようとすると。

したがって、保存とエクスポートの違いは、保存コマンドは画像全体を履歴とメタデータとともに保存するのに対して、エクスポートコマンドはファイル構造のみを(履歴またはメタデータなしで)エクスポートすることです。

18

Dockerドキュメントから:

docker exportは、コンテナに関連付けられたボリュームのコンテンツをエクスポートしません。ボリュームがコンテナ内の既存のディレクトリの上にマウントされている場合、docker exportは、ボリュームのコンテンツではなく、underlyingディレクトリのコンテンツをエクスポートします。ボリューム内のデータのエクスポートの例については、ユーザーガイドの データボリュームのバックアップ、復元、または移行 を参照してください。

その他の外部ツール:関連するデータボリュームを持つコンテナーを移動するには、Flocker https://clusterhq.com/flocker/introduction/ を使用できます。

16

このスクリプトを使用します: https://github.com/ricardobranco777/docker-volumes.sh

これはdoesデータをボリュームに保存します。

使用例:

# Stop the container   
docker stop $CONTAINER

# Create a new image   
docker commit $CONTAINER $CONTAINER

# Save image
docker save -o $CONTAINER.tar $CONTAINER

# Save the volumes (use ".tar.gz" if you want compression)
docker-volumes.sh $CONTAINER save $CONTAINER-volumes.tar

# Copy image and volumes to another Host
scp $CONTAINER.tar $CONTAINER-volumes.tar [email protected]$Host:

# On the other Host:
docker load -i $CONTAINER.tar
docker create --name $CONTAINER [<PREVIOUS CONTAINER OPTIONS>] $CONTAINER

# Load the volumes
docker-volumes.sh $CONTAINER load $CONTAINER-volumes.tar

# Start container
docker start $CONTAINER
3
Ricardo Branco

私はこれのために多くの解決策を試しましたが、これは私のために働いたものです:

1.コンテナを新しいイメージにコミット/保存します:

  1. ++コンテナをコミットします:
    #docker stop
    #docker commit CONTAINER_NAME
    #docker save --output IMAGE_NAME.tar IMAGE_NAME:TAG


ps: "コンテナCONTAINER_NAMEには '/ var/home'にマウントされたボリュームがあります"(コンテナを調べて、ボリュームパスを指定する必要があります。#docker inspect CONTAINER_NAME)

  1. ++そのボリュームを保存します。処理を行うためにUbuntuイメージを使用します。
    #mkdir backup
    #docker run --rm --volumes-from CONTAINER_NAME -v $ {pwd}/backup:/ backup ubuntu bash -c“ cd/var/home && tar cvf /backup/volume_backup.tar。”

$ {pwd}/backupを見ると、tar形式のボリュームが見つかります。
これまでは、コンテナのイメージ「IMAGE_NAME.tar」とそのボリューム「volume_backup.tar」があります。

これで、新しいホストで同じ古いコンテナを再作成できます。

0
Houssam Ezzoukh