저장소를 사용하지 않고 한 호스트에서 다른 호스트로 Docker 이미지를 복사하는 방법


1373

개인 또는 공개 저장소에 관계없이 저장소를 사용하지 않고 한 시스템에서 다른 시스템으로 Docker 이미지를 전송하는 방법은 무엇입니까?

VirtualBox에서 자체 이미지를 만들고 완료되면 다른 컴퓨터에 배포하여 실제 사용을 시도합니다.

Red Hat Linux와 같은 자체 이미지를 기반으로하기 때문에 Dockerfile에서 다시 만들 수 없습니다. 내 dockerfile은 쉽게 휴대 할 수 없습니다.

사용할 수있는 간단한 명령이 있습니까? 아니면 다른 해결책?

답변:


2304

Docker 이미지를 tar 파일로 저장해야합니다.

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

다음과 같은 일반 파일 전송 도구를 사용하여 새로운 시스템에 이미지를 복사 cp, scp또는 rsync(큰 파일 선호). 그런 다음 이미지를 Docker에로드해야합니다.

docker load -i <path to image tar file>

추신 : sudo모든 명령 이 필요할 수 있습니다 .

편집 : -o를 사용하여 파일 이름 (디렉토리뿐만 아니라)을 추가해야합니다 (예 :

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

27
이것은 이미지에 대한 더 나은 대답입니다 .
Andy

26
또한 repo:tag이미지 참조 로 사용 하는 것이 좋습니다 image id. 을 사용 image id하면로드 된 이미지에 태그가 유지되지 않으며 이미지에 태그를 지정하려면 다른 단계를 수행해야합니다.
wisbucky

1
name : tag 대신 이미지 ID를 사용했습니다. 이제 여기에 앉아 이미지를로드했으며 REPOSITORY 및 TAG에 대해 <none>이 있습니다. 이름과 태그를 다시 가져 오는 올바른 방법은 무엇입니까? @wisbucky
Ulfhetnar

3
태그를 지정하려면 먼저을 사용하여 이미지 ID를 식별 docker images한 다음을 사용하십시오 docker tag DESIREDIMAGEID mycompany/myreponame. 이미지 ID가 591de551d6e4 인 경우 이미지 ID를 축약 할 수 있습니다.docker tag 59 mycompany/myreponame
Junior Mayhé


582

SSH를 통해 Docker 이미지 전송, 즉석에서 컨텐츠를 압축 :

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

pv파이프 중간에 배치 하여 전송이 어떻게 진행되는지 확인하는 것도 좋습니다.

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

(자세한 정보 pv: 홈페이지 , 맨 페이지 ).


19
docker-machine을 사용할 때 mach1mach2docker $(docker-machine config mach1) save <image> | docker $(docker-machine config mach2) load 시스템간에 이미지를 복사 할 수 있습니다 .
matlehmann

5
@manojlds eval $(docker-machine env dev)는 단일 도커 호스트와의 일반적인 통신에는 적합하지만 두 개의 도커 호스트 / 도커 시스템이 포함되므로 두 시스템간에 복사하지 않습니다.
matlehmann

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가 있어야합니다 . ssh가 stdin이 터미널이 아니기 때문에 Pseudo-terminal이 할당되지 않는다고 말했기 때문에 하나의 "-t"로 동일한 메시지 입니다. 마지막으로 두 개의 "-t"를 사용하여 터미널에서 tar 파일의 내용 (예 : 이미지)을 얻습니다. 어떤 아이디어?
굶주림

1
@JosefStark sudoers 파일을 편집 할 때 sudo에서 "죄송합니다"메시지를 중지 할 때 "Defaults : <target username>! requiretty"를 추가해야했습니다. 나는 그것이 얼마나 큰 차이가 있는지는 모르지만 user @ host 다음에 모든 것을 따옴표로 묶습니다 (따라서 "[...] | ssh user @ host 'bunzip2 | sudo docker load'").
VirtualWolf

99

파일 경로 또는 공유 NFS 위치에 이미지를 저장하려면 다음 예를 참조하십시오.

다음을 수행하여 이미지 ID를 얻으십시오.

sudo docker images

ID가 "매트릭스-데이터"인 이미지가 있다고 가정 해보십시오.

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.tar하고 docker load -i file.tar이것을 피하십시오!
Andreas Forslöw

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가져 오기가 로컬에 도움 cmd를에 따른 경우
래리 카이

7
이는 이미지 배포보다 실행중인 컨테이너를 백업하는 데 더 좋습니다.
Kousha

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를 사용하기 위해 서브 쉘 중 하나를 생략 할 수도 있습니다 .

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-cartridge이미지 ID가 7ebc8510bc2c 인 저장해야한다고 가정합니다 .

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

예를 들어, 사용자 환경에서 어떤 방법 작품을 사용하여 새 부두 노동자 인스턴스에 archiveName.tar 파일을 복사 FTP, 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구성 에 수동으로 추가해야한다는 것입니다 . 도구를 한 번 실행하면 유익한 오류가 발생합니다.

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에서 '-안전하지 않은 레지스트리'플래그를 어디에 설정해야합니까?


1
귀하가 추천하는 유틸리티가 귀하에 의해 생성되었음을 분명히하기 위해 귀하의 답변을 편집했습니다. 이 페이지를 참조 하십시오 . 특히 "좋은 답변, 관련 답변 게시 및 일부 (모두는 아님)가 제품이나 웹 사이트에 관한 것이라면 괜찮습니다. 그러나 귀하의 답변에 귀하의 소속을 공개해야합니다."
Louis

8

다른 모든 답변은 매우 유용합니다. 방금 같은 문제를 겪고와 함께 쉬운 방법을 알아 냈습니다 docker machine scp.

Docker Machine v0.3.0 이후, 한 Docker 시스템에서 다른 시스템으로 파일을 복사하기 위해 scp가 도입되었습니다. Docker Machine은 SSH 자격 증명을 관리하기 때문에 로컬 컴퓨터에서 AWS EC2 또는 Digital Ocean과 같은 원격 Docker 시스템으로 파일을 복사하려는 경우 매우 편리합니다.

  1. 다음을 사용하여 이미지를 저장하십시오 docker save.

    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-machine ssh remote-machine sudo docker load -i docker-images.tar
    

5
왜 'scp <source> <remote>'가 아닌가?
Tamas Kalman 1

3

태그가있는 모든 이미지를 이동하고 싶습니다.

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

설명:

먼저 OUT모든 태그를 가져 오지만 새 줄로 분리합니다. 두 번째 OUTPUT는 배열의 모든 태그를 가져옵니다. 세 번째 는 모든 이미지가 단일 tar에 있도록 $(echo "${OUTPUT[*]}")단일 docker save명령 에 모든 태그를 넣습니다 .

또한 gzip을 사용하여 압축 할 수 있습니다. 대상에서 다음을 실행하십시오.

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

-O옵션을 사용 tar하여 stdin에 내용 을 넣을 수 있습니다 docker load.


2

당신은 사용할 수 있습니다 sshfs:

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

1

Docker 저장 및로드 기능을 수행하는 스크립트 (시도 및 테스트) :

도커 저장 :

#!/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"

도커로드 :

#!/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.