異なるホスト間でDockerコンテナーを移動するにはどうすればよいですか?


98

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

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



保存ではメタデータと履歴が保持されるため、エクスポート/インポートではなく保存/ロードを使用することもできます。
Burstaholic 2015年

これは@aholtの回答へのコメントですか?
Martin Thompson

docker saveコンテナではなく、画像を保存するためのものです。docs.docker.com/engine/reference/commandline/save
stmllr

回答:


56

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

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

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


@larsks最初のステップはコンテナーを停止してからコミットすることではないでしょうか?
ヴァレント2016

@valentt実行中と停止中のコンテナをコミットすることは可能です
crollywood

1
この回答は、実際に使用する必要があるコマンドを正確に説明しているわけではないため、私のような初心者にとっては困難です
Paul Kruger

docker-checkpointは、両方がCRIUをサポートしている場合、「実行中」のコンテナーをホスト間で移動させることができます。
dGRAMOP

2
1.コンテナを停止しdocker stop xます。2.変更をコミットしますdocker commit -p x x。3.コンテナーをイメージに保存しますdocker save -o x x。4. xファイルを新しいホストに移動し、新しいホストで新しいイメージをロードしますdokcer load -i x-vオプションでコンテナーを開始した場合、これらのファイルも新しいホストに移動する必要があります)。5.この画像を実行docker run (-v is required to mount these files if needed)
Lau Real

95

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

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

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

  3. インポートして戻す

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

8
また、ボリューム内に格納されているデータは保持されません。
stmllr 2016年

1
これはどのように機能するはずですか?インポート後、新しい画像を取得しましたが、その後はどうなりますか?新しい実行コマンドを実行するだけですか?
ヴァレント2016

2
これは実際には、特にデータベースを実行しているコンテナーにとっては、非常に悪い提案です。私はこの提案を試しましたが、うまくいきませんでした。最初にコンテナを停止しても機能するでしょうか?
ヴァレント2016

2
この提案は、本当に代替案を意図したものでした。それはあなたの状況でうまくいくかもしれませんし、そうでないかもしれません。私にとっては、当時データベースレプリケーションDockerコンテナーをセットアップしており、エクスポート/インポートについては、データベースデータのバックアップを定期的に別のtarballに実行していたため、データの保持については気にしていませんでした。そのため、これは完全に機能しました。
aholt 2016

32

Dockerは明らかに執筆時点で、期待が膨らんでいるので、混乱を招くマニュアルやチュートリアルがたくさんあるので、結局はうまくいきました。

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

エクスポートとインポートは、別の回答で提案されているように、コンテナーの実行に必要となる可能性があるポートと変数をエクスポートしません。そして、「コマンドが指定されていません」などの結果になる可能性があります ...別のマシンにロードしようとすると、

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

言うまでもなく、他の一部のDockerコンテナーによってインポートを行っているDockerハイパーバイザーでこれらのポートが既に取得されている場合、競合が発生し、公開されたポートを再構成する必要があります。


1
とても役に立ちました。「コマンドが指定されていません」というメッセージが私を狂わせていました。
Rintoul

「コマンドが指定されていません」というメッセージも私を狂わせていました。私は別のホストからdocker commit <container-id> stackstorm-local:2.9とdocker pull stackstorm-local:2.9を使用しています。
Hua Zhang

18

Dockerドキュメントから:

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


cluster hq shutdown ...およびBTWコンテナーを移行するにはコンテナーはZFS /サポートされているストレージ
LUNで

6

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

これにより、ボリューム内のデータ保持されます。

使用例:

# 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 $USER@$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

1
AWS Linux(Centos)では動作しませんでした。終わりに、私はdocker inspectを使用してボリュームdirを見つけ、それを手動でコピーするというローテクなアプローチを採用しました。
JasonPlutext

@JasonPlutextおそらくSELinuxに関連したものでしょうか?SELinuxを有効にしていますか?
Ricardo Branco

1

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

1.commit / saveコンテナーを新しいイメージに保存:

  1. :コンテナコミット++
    #ドッカ停止
    CONTAINER_NAMEのコミットドッキングウィンドウ#
    IMAGE_NAME.tar IMAGE_NAME --output保存#]ドッキングウィンドウを:タグを


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」があります。

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.