#docker #kubernetes #container #orchestrator #microservice #infrastructure-as-code #devops #ci #cd

제목Docker commit한 image의 이해2019-09-26 17:56
작성자 Level 10

Docker에서 commit은 immutable image를 실행하여 container가 동작중일때, container의 “현재” 상태를 담아 저장함으로, 디버그나 분석 등에 도움을 줍니다.

Docker에서 base image를 가지고 commit하면 새로운 image를 만들수 있는데, 이에 대해서 정확하게 이해할 필요가 있네요.


1) Base image에서 container를 생성하고, 해당 container에서 새로운 software를 설치하는 등 작업을 수행하면,

새롭게 설치된 내용은 Base image에 추가적인 프로그램과 데이타를 생성하는 셈입니다.

하지만~! Base image와 별도로 추가된 부분만 관리됩니다.

무슨 소리냐면, 이렇게 새롭게 정보가 추가된 container로 commit한 image는,

기존의 base image를 share하면서, 추가된 내용을 별도로 관리 한다는 의미입니다.

참조: https://stackoverflow.com/questions/52547749/how-to-delete-parent-image-after-committing-to-a-child-image-in-docker


2) 실제로 아래와 같이 학생이 진행한 것과 동일하게 base에서 child의 image를 commit 하여 만들었습니다.


DrSungwon-MacBookPro:~ drsungwon$ docker image ls 

REPOSITORY              TAG                  IMAGE ID            CREATED             SIZE

tensorflow/tensorflow   latest               d47de6f6203c        11 minutes ago      1.35GB

tensorflow/tensorflow   latest-py3-jupyter   fe3f97fcb6ce        3 months ago        1.34GB


여기서, 좀 더 detail하게 각각의 이미지가 점유하는 공간을 확인하면, 다음과 같습니다.


DrSungwon-MacBookPro:~ drsungwon$ docker system df -v

Images space usage:


REPOSITORY              TAG                  IMAGE ID            CREATED             SIZE                SHARED SIZE         UNIQUE SIZE         CONTAINERS

tensorflow/tensorflow   latest               d47de6f6203c        12 minutes ago      1.354GB             1.345GB             9.08MB              0

tensorflow/tensorflow   latest-py3-jupyter   fe3f97fcb6ce        3 months ago        1.345GB             1.345GB             0B                  0


위에서 관심있게 봐야 하는 부분은 SHARED SIZE와 UNIQUE SIZE인데, 

SHARED SIZE는 tensorflow/tensorflow:latest-py3-jupyter을 child image인 tensorflow/tensorflow:latest도 공유한다는 의미이며,

commit하여 생성한 child image인 tensorflow/tensorflow:latest가 추가로 가진 공간은 UNIQUE SIZE인 9.08MB라는 점 입니다.


결론적으로 child image안에 base image가 실제 물리적으로 삽입되는 것은 아닌 것으로 보이며, 공간 낭비는 없으니 걱정하지는 않아도 되어 보이네요.

그리고 이런 경우 child image가 있는한 base image를 지우는 방법을 찾지 못했는데, 위의 이야기를 근거로 한다면, 당연히 base image가 지워지지 않으리라 봅니다.

child image 생성시 base image를 복사하는 방식이 아니니, child image가 있는한 base를 지울수 없겠지요.

참고로 이렇게 만들어진 image를 외부로 보낼때는 docker save, 외부에서 읽을때는 docker load로 읽어야 하는 군요 (^^ 처음 해봐서 ㅎㅎ)


3) 결국, 이렇게 OS+Python을 base로 삼아, 추가 tools를 설치하는 형태는 새로운 Dockerfile로 새로운 이미지를 만드는게 맞아 보입니다.

즉, FROM {base}로 한후, RUN {추가 도구 설치} 형태로 Dockerfile을 만들면, 원하는 개발환경의 image를 확보할 수 있으리라 봅니다.

실제 Docker의 commit 명령 설명에서도, 아래와 같이 새로운 image를 위한 Dockerfile을 만들라고 권장하네요.

Generally, it is better to use Dockerfiles to manage your images in a documented and maintainable way.

출처: https://docs.docker.com/engine/reference/commandline/commit/


4) 찾다보니 한글로 정리가 잘된 자료도 아래와 같이 있어서 첨부해 봅니다.

단, docker도 계속 바뀌는 부분이 있기에, 명령어나 명령실행 결과가 지금 버전과 차이를 보이는 부분이 있네요.

Commit에 대한 이해 정도로 읽어 보세요.

https://doitnow-man.tistory.com/184

http://blog.naver.com/PostView.nhn?blogId=alice_k106&logNo=220403041813

 
댓글