Docker

다른 container로 image 옮기기 (export, import, 환경변수)

Nirah 2022. 12. 8. 18:10

컨테이너끼리 데이터 복사는 불가하다.

실제 PC를 거쳐서 복사해야 한다. 이게 싫으면 볼륨을 공유해야 한다.

 

컨테이너끼리 이미지를 이동하려면

Save -> Load 방법이 있고

export -> import 방법이 있다. 

 

image 파일을 container에서 export

그리고 해당 파일은 import해서 image로 전환해서 옮기면 된다.

하지만 해당 image를 실행하면 설정 및 환경변수등이 초기화 되기 때문에 실행이 되지 않는 문제가 있다.

이 문제를 해결하려면 import시 CMD 작업, 그리고 실행 시 환경변수를 추가해 주면 해결이 가능하다.

 

 

   대상   output  
save  image tar  
load     tar      image  
       
export container   tar   설정값 및 환경변수 초기화.
데이터엔 영향 없음
import  tar   image  설정 및 환경변수 등 필요

 

                        

 

 

 

방법1 : Docker Hub

제일 최고의 방법은 도커 허브를 이용해 개인 리포지토리에 업로드 하고 다운로드 하는 것이다.

https://raid-1.tistory.com/83

 

 

 

 

 

방법2 : Save -> Load

 

이미지로 내보내고 이미지로 가져오는 건 실행에 아무 문제가 없다

먼저 centos:7과 alpine:latest 두 개의 이미지를 옮겨볼 것이다.

Docker Image를 tar 파일로 저장한다. 여러개 이미지를 한꺼번에 묶어서 옮길 수도 있다.

 

 

SAVE

# docker save -o image.tar nginx:latest alpine:latest

 

두 이미지 원본 삭제

# docker rmi alpine

# docker rmi nginx

 

 

LOAD

tar로 저장한 이미지 다시 불러오기 ( -i : image )

# docker load -i image.tar

 tar로 저장해서 다시 불러온 이미지들은 run 했을 때 실행이 잘 된다!

 

 

 

 

 

 

방법3 : export -> import

컨테이너 자체를 내보내는 방법

 

 

~~~~~~~~~~~~~~문제발생편~~~~~~~~~~~~~~~~

 

docker run -itd --name a1 alpine

docker attach a1

확인용 import.txt 파일 만들기

ctrl +p +q

 

 

docker export -o import.tar a1

 

다른 컨테이너에 넣기

docker import import.tar alpine:1

 

이렇게 export - import로 가져온 image는 실행하면 컨테이너가 실행이 안 된다!

환경변수가 모두 초기화되기 때문에 실행에 관련된 설정도 다 없는 상태가 돼버렸다..

 

뭔가 텅 비어 있는설정을 보고싶으면 다음과 같다.

docker inspect alpine:1

 

 

 

~~~~~~~~~~~~~~해결편~~~~~~~~~~~~~~~~

 

해당 문제를 해결하려면 애초에 아래와 같이 import 할 때에 환경 변수를 지정해줘야 한다. 

alpine의 경우는 bin/sh에 관련된 설정이 빠져있기 때문에 일어나는 문제므로.

(다른 image들은 각기 다 다르다)

 

docker import --change 'CMD ["bin/sh"]' import.tar alpine:3

 

환경 변수를 저장하여 import 한 이미지를 run → 잘 실행 됨

docker run -itd --name a5 alpine:3

docker attach a5

 

아까 저장한 확인용 import.txt 파일이 잘 보이는 것을 확인할 수 있다.

 

 

 

 

 

환경 변수

 

아래의 경우들은 예시이고, 여기 없는 image들은 직접 환경 변수 (Env, CMD)를 찾아서 입력해줘야 한다.

 

 

alpine의 경우

docker import --change 'CMD ["bin/sh"]' import.tar alpine:1

 

httpd의 경우

docker import --change 'env "PATH" "/usr/local/apache2/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"'--change 'cmd ["httpd-foreground"]' httpd.tar httpd:1

 

 CentOS:7의 경우

docker import --change 'CMD ["/bin/bash"]' cent.tar centos:1

 

 

환경 변수 (Env) 직접 찾는 법

 

docker inspect h1

여기서 Env 부분과 Cmd 부분을 확인하면 된다.

 

 

환경 변수 지정 연습

 

환경 변수 지정하여 컨테이너 실행

docker run -itd -e a=100 --name a1 alpine

 

echo $a

100이 출력 된다

env

환경변수 리스트가 출력 된다.

 

 

도커 허브에서 필요한 환경 변수 찾기

 

클릭해서 쭉 내려보면 각 상황마다 필요한 환경 변수들에 대해 설명이 돼있다.