リポジトリを使用せずに1つのホストから別のホストにDockerイメージをコピーする方法


1375

プライベートかパブリックかに関係なく、リポジトリを使用せずにDockerイメージをあるマシンから別のマシンに転送するにはどうすればよいですか?

VirtualBoxで自分のイメージを作成し、それが終了したら、他のマシンにデプロイして実際に使用しようとします。

私自身のベースのイメージ(Red Hat Linuxなど)に基づいているため、Dockerfileから再作成することはできません。私のdockerfileは簡単に移植できません。

使用できる簡単なコマンドはありますか?または別の解決策?

回答:


2310

Dockerイメージをtarファイルとして保存する必要があります。

docker save -o <path for generated tar file> <image name>

次にcpscpやなどの通常のファイル転送ツールを使用して、イメージを新しいシステムにコピーしますrsync(大きなファイルに推奨)。その後、イメージをDockerにロードする必要があります。

docker load -i <path to image tar file>

PS:sudoすべてのコマンドが必要になる場合があります。

編集:-oでファイル名(ディレクトリだけでなく)を追加する必要があります。次に例を示します。

docker save -o c:/myfile.tar centos:16

27
これは画像のより良い答えです。
アンディ

26
また、repo:tagではなく画像参照として使用することをお勧めしますimage id。を使用するimage id場合、ロードされた画像はタグを保持しません(そして、画像にタグを付けるために別の手順を実行する必要があります)。
wisbucky 2017

1
name:tagの代わりにイメージIDを使用しました。今ここに座って、イメージをロードし、REPOSITORYおよびTAGに<none>を使用しています。名前とタグを元に戻す正しい方法は何ですか?@wisbucky
Ulfhetnar

3
タグを付けるには、最初docker imagesにを使用して画像IDを識別し、次にを使用しますdocker tag DESIREDIMAGEID mycompany/myreponame。あなたの画像IDが591de551d6e4ある場合は、画像IDを省略することができますdocker tag 59 mycompany/myreponame
ジュニアMayhé


582

SSH経由でDockerイメージを転送し、その場でコンテンツをbzipします。

docker save <image> | bzip2 | \
     ssh user@host 'bunzip2 | docker load'

pvパイプの中央に置いて、転送の様子を確認することもお勧めします。

docker save <image> | bzip2 | pv | \
     ssh user@host 'bunzip2 | docker load'

(約詳細情報pvホーム・ページmanページ)。


19
docker -machineを使用するとdocker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) load、マシンmach1mach2の間でイメージをコピーできます。
matlehmann

5
@manojlds eval $(docker-machine env dev)は単一のDocker ホストとの一般的な通信に適していますが、2つの異なるDockerホスト/ Dockerマシンが関係するため、2つのマシン間でコピーすることはできません。
matlehmann 2015年

14
これを逆に行うには(ローカルにリモート):ssh target_server 'docker save image:latest | bzip2' | pv | bunzip2 | docker load
ThorSummoner

2
dockerがターゲットマシンでsudoを必要とするときにこれを行う方法はありますか?私は(圧縮なしで)試しましたdocker save my_img:v1 | ssh -t -t my_user@my_machine sudo docker load。「-t」スイッチがないと、sudoはsudoに文句を言います。申し訳ありませんが、sudoを実行するにはttyが必要です。「-t」を1つ指定すると、sdinはstdinが端末ではないため、疑似端末は割り当てられないと言うので、同じメッセージです。最後に、2つの「-t」を使用して、tarファイルのコンテンツ(つまり、イメージ)を端末に取得します。何か案は?
空腹

1
@JosefStark sudoersファイルを編集してsudoからの「Sorry」メッセージを停止するときに、「Defaults:<target username>!requiretty」を追加する必要がありました。それがどの程度の違いをもたらすかはわかりませんが、user @ hostの後にすべてを引用符で囲みます(つまり、[[...] | ssh user @ host 'bunzip2 | sudo docker load' ")。
VirtualWolf 2017年

99

イメージを任意のファイルパスまたは共有NFSプレースに保存するには、次の例を参照してください。

次のようにして、イメージIDを取得します。

sudo docker images

IDが「matrix-data」の画像があるとします。

次のIDで画像を保存します。

sudo docker save -o /home/matrix/matrix-data.tar matrix-data

パスから任意のホストにイメージをコピーします。次を使用して、ローカルのDockerインストールにインポートします。

sudo docker load -i <path to copied image file>

34

まず、Dockerイメージをzipファイルに保存します。

docker save <docker image name> | gzip > <docker image name>.tar.gz

次に、以下のコマンドを使用して、エクスポートしたイメージをDockerにロードします。

zcat <docker image name>.tar.gz | docker load

11
読み込みにdocker load < my-image.tar.gzは十分です。画像は、gzip、bzip2、およびxzに対して自動的に解凍されます。
フラックス

32

走る

docker images

ホスト上のイメージのリストを表示します。awesomesauceというイメージがあるとします。端末でcd、イメージをエクスポートするディレクトリに移動します。今実行します:

docker save awesomesauce:latest > awesomesauce.tar

tarファイルをサムドライブなどにコピーしてから、新しいホストコンピュータにコピーします。

今度は新しいホストから:

docker load < awesomesauce.tar

今コーヒーを飲みに行き、ハッカーニュースを読んでください...


4
ここで注目に値するのは、保存と読み込みが同じOSで実行された場合にのみ機能することです。使用docker save [image] -o file.tardocker load -i file.tarて、これを回避してください!
AndreasForslöw19年

docker save [image] -o file.tarまた、非常に速いようです
ti7

19

コンテナのファイルシステムのフラット化されたエクスポートには、以下を使用します。

docker export CONTAINER_ID > my_container.tar

cat my_container.tar | docker import -上記の画像をインポートするために使用します。


9
cat my_container.tar | docker import - my_container:newコマンドヘルプに従ってローカルにインポートする場合
Larry Cai

7
これは、イメージをデプロイするためではなく、実行中のコンテナーをバックアップするためのものです。
Kousha 2014年

15

docker-machineを使用するmach1mach2、マシン間でイメージをコピーできます。

docker $(docker-machine config <mach1>) save <image> | docker $(docker-machine config <mach2>) load

そしてもちろんpv、途中で固執して進捗インジケーターを取得することもできます。

docker $(docker-machine config <mach1>) save <image> | pv | docker $(docker-machine config <mach2>) load

docker-machine config現在のデフォルトのdocker-hostを使用するために、サブシェルの1つを省略することもできます。

docker save <image> | docker $(docker-machine config <mach>) load

現在のdocker-hostからイメージをコピーするには mach

または

docker $(docker-machine config <mach>) save <image> | docker load

からmach現在のdocker-host にコピーします。


10

couchdb-cartridge7ebc8510bc2cのイメージIDを持つものを保存する必要があると思います。

stratos@Dev-PC:~$ docker images
REPOSITORY                             TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
couchdb-cartridge                      latest              7ebc8510bc2c        17 hours ago        1.102 GB
192.168.57.30:5042/couchdb-cartridge   latest              7ebc8510bc2c        17 hours ago        1.102 GB
ubuntu                                 14.04               53bf7a53e890        3 days ago          221.3 MB

archiveNameイメージをtarファイルに保存します。を使用し/media/sf_docker_vm/て画像を保存します。

stratos@Dev-PC:~$ docker save imageID > /media/sf_docker_vm/archiveName.tar

、などFTP、環境で機能する方法を使用して、archiveName.tarファイルを新しいDockerインスタンスにコピーしますSCP

docker load新しいDockerインスタンスでコマンドを実行し、イメージtarファイルの場所を指定します。

stratos@Dev-PC:~$ docker load < /media/sf_docker_vm/archiveName.tar

最後に、docker imagesコマンドを実行して、イメージが使用できることを確認します。

stratos@Dev-PC:~$ docker images
REPOSITORY                             TAG        IMAGE ID         CREATED             VIRTUAL SIZE
couchdb-cartridge                      latest     7ebc8510bc2c     17 hours ago        1.102 GB
192.168.57.30:5042/couchdb-cartridge   latest     bc8510bc2c       17 hours ago        1.102 GB
ubuntu                                 14.04      4d2eab1c0b9a     3 days ago          221.3 MB

この詳細な投稿を見つけてください。


10

ローカルのDockerインストールからminikube VMにイメージを転送するには:

docker save <image> | (eval $(minikube docker-env) && docker load)

10

docker-push-ssh このシナリオのために作成したコマンドラインユーティリティです。

サーバー上に一時的なプライベートDockerレジストリーをセットアップし、ローカルホストからSSHトンネルを確立し、イメージをプッシュし、それ自体をクリーンアップします。

このアプローチの利点docker save(執筆時点ではほとんどの回答はこの方法を使用しています)の利点は、新しいレイヤーのみがサーバーにプッシュされるため、はるかに高速にアップロードできることです。

多くの場合、dockerhubなどの中間レジストリを使用することは望ましくなく、面倒です。

https://github.com/brthor/docker-push-ssh

インストール:

pip install docker-push-ssh

例:

docker-push-ssh -i ~/my_ssh_key username@myserver.com my-docker-image

最大の注意点は、ローカルホストをDockerのinsecure_registries構成に手動で追加する必要があることです。ツールを1回実行すると、有益なエラーが表示されます。

Error Pushing Image: Ensure localhost:5000 is added to your insecure registries.
More Details (OS X): /programming/32808215/where-to-set-the-insecure-registry-flag-on-mac-os

Mac OSで「--insecure-registry」フラグをどこに設定すればよいですか?


1
回答を編集して、お勧めのユーティリティが自分で作成したものであることを明確にしました。特に、このページを参照してください。「適切で適切な回答を投稿してください。すべてではないにしても、製品やWebサイトに関するものである場合は問題ありません。ただし、回答への所属を開示する必要があります。」
ルイ、

8

他のすべての答えは非常に役に立ちます。私は同じ問題を経験し、で簡単な方法を見つけましたdocker machine scp

Docker Machine v0.3.0以降、1つのDockerマシンから別のマシンにファイルをコピーするためにscpが導入されました。これは、ローカルコンピューターからAWS EC2やDigital OceanなどのリモートDockerマシンにファイルをコピーする場合に非常に便利です。DockerMachineがSSH認証情報を処理するためです。

  1. docker savelike を使用して画像を保存します。

    docker save -o docker-images.tar app-web
    
  2. docker-machine scpを使用して画像をコピーする

    docker-machine scp ./docker-images.tar remote-machine:/home/ubuntu
    

リモートのDockerマシンがでremote-machineあり、tarファイルにするディレクトリがであると想定します/home/ubuntu

  1. Dockerイメージをロードする

    docker-machine ssh remote-machine sudo docker load -i docker-images.tar
    

5
なぜ 'scp <source> <remote>'だけではないのですか?
タマスカルマン2017年

3

タグ付きの画像をすべて移動したい。

```
OUT=$(docker images --format '{{.Repository}}:{{.Tag}}')
OUTPUT=($OUT)
docker save $(echo "${OUTPUT[*]}") -o /dir/images.tar
``` 

説明:

最初OUTにすべてのタグを取得しますが、改行で区切ります。2番目OUTPUTは、配列内のすべてのタグを取得します。3番目$(echo "${OUTPUT[*]}")docker save、すべての画像が1つのtarに含まれるように、1つのコマンドにすべてのタグを配置します。

さらに、これはgzipを使用して圧縮できます。ターゲットで、実行します:

tar xvf images.tar.gz -O | docker load

-Otarstdinにコンテンツを配置するオプションdocker load


2

以下を使用できますsshfs

$ sshfs user@ip:/<remote-path> <local-mount-path>
$ docker save <image-id> > <local-mount-path>/myImage.tar

1

Dockerの保存と読み込み機能を実行するスクリプト(試してテスト済み):

Docker Save:

#!/bin/bash

#files will be saved in the dir 'Docker_images'
mkdir Docker_images
cd Docker_images
directory=`pwd`
c=0
#save the image names in 'list.txt'
doc= docker images | awk '{print $1}' > list.txt
printf "START \n"
input="$directory/list.txt"
#Check and create the image tar for the docker images
while IFS= read -r line
do
     one=`echo $line | awk '{print $1}'`
     two=`echo $line | awk '{print $1}' | cut -c 1-3`
     if [ "$one" != "<none>" ]; then
             c=$((c+1))
             printf "\n $one \n $two \n"
             docker save -o $two$c'.tar' $one
             printf "Docker image number $c successfully converted:   $two$c \n \n"
     fi
done < "$input"

Dockerロード:

#!/bin/bash

cd Docker_images/
directory=`pwd`
ls | grep tar > files.txt
c=0
printf "START \n"
input="$directory/files.txt"
while IFS= read -r line
do
     c=$((c+1))
     printf "$c) $line \n"
     docker load -i $line
     printf "$c) Successfully created the Docker image $line  \n \n"
done < "$input"

0

DOCKER_HOST変数付きのワンライナーを使用できます。

docker save app:1.0 | gzip | DOCKER_HOST=ssh://user@remotehost docker load
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.