다른 호스트로 Docker 컨테이너 복사/이동하는 방법

컴퓨터 책상에서 작업 중인 사람의 사진.

Docker 컨테이너는 소프트웨어의 작은 박스이기 때문에 컴퓨터에서 컴퓨터로 쉽게 복사하고 이동할 수 있습니다. 로컬 컴퓨터에서 Docker 인스턴스 작업을 하고 더 강력한 서버로 이동하기로 결정했을 수도 있습니다. 또는 여러 컴퓨터에 사용자 정의 컨테이너를 배포하고 “복사 및 붙여넣기”하고 싶을 수도 있습니다. 또 어떤 경우에는 클라우드 컴퓨팅 제공업체에 불만이 생겨 다른 업체로 전환하고 싶을 수도 있습니다. 이 글에서는 기존 Docker 컨테이너 이미지 및 데이터 볼륨을 한 Linux 호스트에서 다른 호스트로 이동하는 방법을 보여줍니다.

목차

  • 소스 호스트에서 컨테이너 이미지 저장
  • 컨테이너에서 Docker 볼륨 내보내기
  • 대상 호스트에서 컨테이너 이미지 로드
  • 컨테이너로 Docker 볼륨 가져오기
  • 파일 생성 없이 이미지 전송하기
  • 전체 Docker 배포 이동을 위한 Docker Compose 사용하기

알아두면 좋은 정보: Linux 배포판에 Docker를 설치하여 컨테이너를 시작해 보세요.

소스 호스트에서 컨테이너 이미지 저장

먼저 시스템에서 실행 중인 Docker 컨테이너를 나열합니다. 제 경우에는 Nginx Docker 컨테이너를 새 머신으로 내보내고 싶습니다:

docker ps

복사하려는 컨테이너를 찾은 다음 인스턴스를 중지합니다:

docker stop NAME_OF_INSTANCE

시스템에서 사용 가능한 Docker 컨테이너를 강조 표시하는 터미널.

Docker 컨테이너는 일반적인 초기 이미지로 구축됩니다. 시간이 지남에 따라 이 기본 이미지에 대한 변경 사항을 추가하게 됩니다. 컨테이너 내에서 실행되는 프로세스는 자신의 데이터를 저장하거나 다른 변경을 할 수 있습니다. 이 모든 것을 보존하기 위해 컨테이너의 현재 상태를 새로운 이미지로 커밋합니다:

docker commit NAME_OF_INSTANCE mycontainerimage

현재 실행 중인 컨테이너에서 새로운 이미지를 생성하는 docker commit 명령의 출력을 보여주는 터미널.

인스턴스가 현재 실행 중인 경우 이 작업은 내용을 저장하는 동안 일시 중지됩니다. 이 문제를 피하려면 대신 docker commit -p=false NAME_OF_INSTANCE mycontainerimage를 입력하여 이 일시 정지를 피할 수 있습니다. 그러나 절대적으로 필요하지 않은 경우에는 이렇게 하지 마세요. 이 경우 일관성/불완전한 데이터로 이미지를 생성할 가능성이 높아집니다.

이제 새로 커밋한 Docker 컨테이너 이미지를 아카이브 파일로 저장합니다:

docker save -o mycontainerimage.tar mycontainerimage

선호하는 파일 전송 방법을 사용하여 .tar 파일을 Docker 컨테이너를 이동하려는 호스트로 복사합니다. 예를 들어, 다음 명령은 scp를 사용하여 제 Nginx Docker 이미지를 전송합니다:

scp ./mycontainerimage.tar [email protected]:/home/ramces/

컨테이너에서 Docker 볼륨 내보내기

Docker 이미지를 저장하는 단점 중 하나는 컨테이너와 함께 설정한 Docker 액세서리와 함께 제공되지 않는다는 것입니다. 여기에는 모든 네트워크 바인드 마운트와 지속적인 데이터를 저장하기 위해 만든 볼륨이 포함됩니다.

데이터 볼륨을 제대로 내보내려면 먼저 로컬 머신에 Git를 설치합니다:

sudo apt install git

다음 명령을 실행하여 Docker용 볼륨 내보내기 스크립트를 다운로드합니다:

git clone https://github.com/ricardobranco777/docker-volumes.sh.git

내보내기 스크립트에 올바른 권한 비트가 있는지 확인한 다음, 머신의 “/usr/local/bin” 디렉토리로 복사합니다:

sudo chmod +x ./docker-volumes.sh/docker-volumes.sh  
sudo cp ./docker-volumes.sh/docker-volumes.sh /usr/local/bin/

스크립트가 제대로 작동하는지 테스트한 다음, 컨테이너와 관련된 모든 볼륨을 추출합니다:

docker-volumes.sh -h  
docker-volumes.sh NAME_OF_INSTANCE save mycontainerimage-volume.tar

Docker 컨테이너와 관련된 모든 데이터 볼륨 백업 프로세스를 보여주는 터미널.

새로 아카이브된 Docker 볼륨 파일을 원격 머신으로 전송합니다:

scp ./mycontainerimage-volume.tar [email protected]:/home/ramces/

대상 호스트에서 컨테이너 이미지 로드

원격 호스트에 로그인한 다음, 다음 명령을 실행하여 원격 머신의 Docker 데몬에 로드합니다:

docker load -i ./mycontainerimage.tar

docker create를 사용하여 소스 머신의 원래 실행 플래그로 Docker 컨테이너 이미지를 재초기화합니다. 예를 들어, 제 Nginx Docker 컨테이너는 원래 포트 80이 호스트 머신의 포트 8080에 매핑되어 있었습니다:

docker create --name my-nginx-container -p8080:80 mycontainerimage

새롭게 가져온 Docker 컨테이너를 실행합니다:

docker start my-nginx-container

시스템에서 모든 활성 컨테이너를 나열하여 가져온 이미지가 제대로 작동하는지 확인합니다:

docker ps

다른 시스템에서 실행 중인 동일한 Docker 컨테이너 이미지를 보여주는 터미널.

참고: Raspberry Pi를 Docker를 사용하여 Photoprism을 설치하여 유능한 포터블 사진 갤러리로 변신시켜 보세요.

컨테이너로 Docker 볼륨 가져오기

.tar Docker 볼륨 파일을 가져오려면, 먼저 새 호스트에 Git를 다운로드합니다:

sudo apt install git

원래 시스템과 마찬가지로 docker-volume.sh 보조 스크립트를 다운로드하고, 실행 권한 비트를 “실행 가능”으로 설정한 후, 새 머신의 “/usr/local/bin” 디렉토리에 복사합니다.

컨테이너와 관련된 데이터를 백업하기 위해 Docker Volume 스크립트를 얻고 설치하는 과정을 보여주는 터미널.

수출된 이미지 파일을 사용하여 새 Docker 컨테이너를 생성합니다:

docker create --name my-nginx-container -v myvol:/usr/share/nginx/html -p8080:80 mycontainerimage

원래의 .tar 파일을 사용하여 docker-volume.sh 스크립트를 실행하여 새 시스템의 Docker 데몬에 로드합니다:

docker-volumes.sh my-nginx-container load mycontainerimage-volume.tar

다음 명령을 실행하여 새 Docker 컨테이너를 시작합니다:

docker start my-nginx-container

컨테이너가 볼륨을 제대로 로드하는지 확인하려면 내부 구성 데이터를 확인합니다:

docker inspect -f'{{ .Mounts }}' my-nginx-container

새 머신에 가져온 볼륨 데이터를 강조하는 터미널.

파일 생성 없이 이미지 전송하기

때때로 mycontainerimage.tar.gz 파일 생성 과정을 건너뛰고 싶을 수 있습니다. 컨테이너에 데이터가 너무 많아서 디스크 공간이 충분하지 않을 수도 있습니다. 이미지를 저장하고 전송한 후 목적지 호스트에서 한 명령으로 로드할 수 있습니다. 이전에 언급한 docker commit 명령을 실행한 후, 다음과 같이 사용할 수 있습니다:

docker save mycontainerimage | ssh [email protected] docker load

Windows에서도 잘 작동할 것이며, 이제 내장 SSH 클라이언트가 있어 PuTTY가 필요하지 않습니다.

상황에 맞는 docker create 명령을 계속 진행합니다.

참고: 가져온 이미지를 시작하기 전에 이전에 컨테이너에 연결된 Docker 볼륨을 제대로 마운트했는지 확인하세요.

마지막으로 docker start 명령으로 새로 가져온 Docker 컨테이너를 시작합니다.

새 컨테이너를 시작하고 제대로 작동하는지 확인하는 과정 보여주는 터미널.

전체 Docker 배포 이동을 위한 Docker Compose 사용하기

Docker의 Compose 플러그인을 사용하면 서버의 기본 소프트웨어 스택에 대해 걱정하지 않고 복잡한 프로그램을 구축, 구성 및 실행할 수 있습니다. 이를 통해 서로 다른 Linux 시스템 간에 재현 가능한 애플리케이션 배포를 구축할 수 있습니다.

기존 Docker 설정을 Docker Compose로 마이그레이션하려면, 첫째, 시스템에 해당 플러그인이 설치되어 있는지 확인합니다:

sudo apt install docker-compose-plugin docker-buildx-plugin

홈 디렉토리에 Docker Compose 설치를 위한 새 폴더를 생성합니다:

mkdir ~/my-docker-compose && cd ~/my-docker-compose

즐겨 사용하는 텍스트 편집기를 사용하여 애플리케이션을 위한 “docker-compose.yml” 파일을 생성합니다:

nano ./docker-compose.yml

Compose 파일 내부에 다음 코드 블록을 붙여넣고, 귀하의 필요에 맞게 조정합니다:

version: '3'  

volumes:  
  myvol: # 가져온 볼륨 이름으로 교체해 주세요.  

services:  
  nginx:  
    image: mycontainerimage # 가져온 Docker 이미지의 이름으로 교체해 주세요.  
    ports:  
      - "8080:80"  
    volumes:  
      - myvol:/usr/share/nginx/html # "myvol"을 마운트한 이미지의 이름으로 교체해 주세요.

새 Compose 파일을 저장한 다음, 다음 명령으로 시작합니다:

docker compose up -d

마지막으로 Compose 배포가 제대로 작동하는지 확인합니다. 이 경우, 웹 브라우저를 열어 “localhost:8080”으로 이동하여 제 Nginx Docker 컨테이너를 테스트할 것입니다.

새 머신 호스트에서 제대로 작동하는 가져온 Nginx Docker 컨테이너를 보여주는 스크린샷.

Docker 컨테이너를 다른 Linux 호스트로 복사하고 이동하는 방법을 배우는 것은 머신에서 수행할 수 있는 몇 가지 작업 중 하나에 불과합니다. Docker를 사용하여 Linux에서 Minecraft 서버를 설치하여 자가 호스팅의 이 멋진 세계를 탐험해 보세요.

이미지 제공: Max Duzij via Unsplash. 모든 변경 및 스크린샷은 Ramces Red에 의해 작성되었습니다.