Development Tip

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

yourdevel 2020. 10. 9. 12:25
반응형

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


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

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


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

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

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


또는 저장소에 푸시하지 않으려면 다음을 수행하십시오.

  1. 컨테이너를 tarball로 내보내기

    docker export <CONTAINER ID> > /home/export.tar
    
  2. tarball을 새 컴퓨터로 이동

  3. 다시 가져 오기

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

혼란스러운 매뉴얼과 혼란스러운 튜토리얼을 많이 거친 후 결국에는 Docker가 부풀려진 기대엿볼 때 분명히 글을 쓰는 시점에 있었기 때문에 결국 저에게 효과적 이었습니다 .

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

다른 답변에서 제안한대로 내보내기 및 가져 오기는 컨테이너 실행에 필요할 수있는 포트 및 변수를 내 보내지 않습니다. 그리고 "명령이 지정되지 않았습니다" 등의 문제가 발생할 수 있습니다 . 다른 컴퓨터에로드하려고 할 때.

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

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


Docker 문서에서 :

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

기타 외부 도구 : 관련 데이터 볼륨이있는 컨테이너를 이동하려면 Flocker https://clusterhq.com/flocker/introduction/을 사용할 수 있습니다.


이 스크립트 사용 : 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.commit/save container to new image :

  1. ++ commit the container:
    # docker stop
    # docker commit CONTAINER_NAME
    # docker save --output IMAGE_NAME.tar IMAGE_NAME:TAG


ps:"Our container CONTAINER_NAME has a mounted volume at '/var/home'" ( you have to inspect your container to specify its volume path : # docker inspect CONTAINER_NAME )

  1. ++ save its volume : we will use an ubuntu image to do the thing.
    # 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 .”

Now when you look at ${pwd}/backup , you will find our volume under tar format.
Until now, we have our conatainer's image 'IMAGE_NAME.tar' and its volume 'volume_backup.tar'.

Now you can , recreate the same old container on a new host.

참고URL : https://stackoverflow.com/questions/28734086/how-to-move-docker-containers-between-different-hosts

반응형