다른 호스트간에 Docker 컨테이너를 이동하는 방법은 무엇입니까?


98

컨테이너를 실행하는 도커를 한 호스트에서 다른 호스트로 이동하는 방법을 찾을 수 없습니다.

이미지처럼 컨테이너를 저장소로 푸시 할 수있는 방법이 있습니까? 현재 저는 컨테이너 내부에서 실행되는 애플리케이션과 관련된 데이터를 저장하기 위해 데이터 볼륨을 사용하지 않습니다. 따라서 일부 데이터는 컨테이너 내부에 있으며 설정을 다시 설계하기 전에 유지하고 싶습니다.


flocker에서 찾아 보게 github.com/ClusterHQ/flocker
아드리안 Mouat

저장은 메타 데이터와 기록을 보존하므로 내보내기 / 가져 오기 대신 저장 /로드를 사용할 수 있습니다.
Burstaholic 2015-06-24

@aholt의 답변에 대한 의견이어야합니까?
Martin Thompson

docker save컨테이너가 아닌 이미지를 저장하기위한 것입니다. docs.docker.com/engine/reference/commandline/save
stmllr '162016-06-09

답변:


57

실행중인 Docker 컨테이너를 한 호스트에서 다른 호스트로 이동할 수 없습니다.

를 사용하여 컨테이너의 변경 사항을 이미지에 커밋하고 docker commit이미지를 새 호스트로 이동 한 다음 docker run. 이렇게하면 애플리케이션이 컨테이너 내부에 생성 한 모든 데이터가 보존됩니다.

Nb : 볼륨 내부에 저장된 데이터를 보존하지 않습니다. 데이터 볼륨을 새 호스트로 수동으로 이동해야합니다.


@larsks 첫 번째 단계는 컨테이너를 중지 한 다음 커밋을 수행하는 것이 아닙니까?
valentt

@valentt 모두 가능하며, 실행 커밋 및 용기 중단합니다
crollywood

1
나 같은 놈을 위해 열심히하게 정말 당신이 사용에 필요한 정확한 명령을 설명하지 않습니다이 대답,
폴 크루거

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

1
어떻게 작동해야하나요? 가져 오기 후 새 이미지를 얻습니다. 새로운 실행 명령을 실행 하시겠습니까?
valentt

2
이것은 특히 데이터베이스를 실행하는 컨테이너의 경우 실제로 정말 나쁜 제안입니다. 이 제안을 시도했지만 작동하지 않았습니다. 컨테이너를 먼저 멈출 수 있습니까?
valentt

2
이 제안은 실제로 대안을위한 것입니다. 귀하의 상황에 적합 할 수도 있고 그렇지 않을 수도 있습니다. 저에게는 당시 데이터베이스 복제 도커 컨테이너를 설정하고 있었으며 내보내기 / 가져 오기의 경우 데이터베이스 데이터를 정기적으로 다른 tarball로 백업하기 때문에 데이터 보존에 신경 쓰지 않았습니다. 이를 위해 이것은 완벽하게 작동했습니다.
aholt

32

혼란스러운 매뉴얼과 헷갈리는 튜토리얼이 많아서 결국 저에게 효과가 있었던 것은 Docker가 내 글을 쓰는 시점에서 분명히 부풀려진 기대엿볼 때였 기 때문에 다음과 같습니다.

  1. Docker 이미지를 아카이브에 저장하십시오.
    docker save image_name > image_name.tar
  2. 다른 컴퓨터에 복사
  3. 다른 docker 시스템에서 다음과 같은 방법으로 docker load를 실행하십시오.
    cat image_name.tar | docker load

다른 답변에서 제안한대로 내보내기 및 가져 오기는 컨테이너 실행에 필요할 수있는 포트 및 변수를 내 보내지 않습니다. 그리고 "No command specified" 등과 같은 결과가 나올 수 있습니다. 다른 컴퓨터에로드하려고 할 때.

따라서 저장과 내보내기의 차이점은 저장 명령은 히스토리 및 메타 데이터와 함께 전체 이미지를 저장하는 반면 내보내기 명령은 히스토리 또는 메타 데이터없이 파일 구조 만 내 보낸다는 것입니다.

말할 필요도없이, 가져 오기를 수행하는 도커 하이퍼 바이저에 이미 해당 포트가있는 경우 다른 도커 컨테이너에 의해 충돌이 발생하고 노출 된 포트를 다시 구성해야합니다.


1
매우 도움이됩니다. "명령이 지정되지 않았습니다"라는 메시지가 나를 미치게 만들었습니다.
Rintoul

"명령이 지정되지 않았습니다"라는 메시지도 저를 미치게 만들었습니다. 나는 docker commit <container-id> stackstorm-local : 2.9를 사용하고 docker pull stackstorm-local : 2.9를 다른 호스트에서 사용합니다.
Hua Zhang

18

Docker 문서에서 :

docker export컨테이너와 관련된 볼륨의 내용을 내 보내지 않습니다. 볼륨이 컨테이너의 기존 디렉토리 위에 마운트 된 경우은 볼륨 docker export의 내용이 아닌 기본 디렉토리 의 내용을 내 보냅니다 . 볼륨의 데이터 내보내기에 대한 예제는 사용 설명서의 데이터 볼륨 백업, 복원 또는 마이그레이션을 참조하십시오 .


클러스터 hq 종료 ... 및 BTW로 컨테이너를 마이그레이션하려면 컨테이너가 ZFS / 지원되는 모든 스토리지 LUN에서 실행되어야합니다
asvignesh

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)에서 저에게 적합하지 않았습니다. endi에서는 docker inspect를 사용하여 볼륨 디렉토리를 찾은 다음 수동으로 복사하는 저 기술 접근 ​​방식을 취했습니다.
JasonPlutext 2019

@JasonPlutext 아마도 SELinux와 관련된 것일까 요? SELinux가 활성화되어 있습니까?
Ricardo Branco


@hjahan 전형적인 tar 메시지입니다. 오류도 아니고 경고도 아닙니다.
Ricardo Branco

1

나는 이것에 대해 많은 해결책을 시도했고 이것이 나를 위해 일한 것입니다.

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. ++ 볼륨 저장 : 우분투 이미지를 사용하여 작업합니다.
    # 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.