연재 시리즈

도커이미지레이어 4편 - 빌드과정에서 일어나는 일

악분 2021. 12. 8. 20:00
반응형

 

안녕하세요. 4편에서는 docker build명령어를 실행하면 어떤 과정으로 도커 이미지가 생성되는지 설명합니다.

이 글은 영상으로도 만나볼 수 있습니다.

https://youtu.be/KpMoOkxxzGw

 

1. 빌드과정

docker build과정은 공식문서[1]에 간단히 설명합니다. 요약하면 dockerfile에 적은 명령어는 docker 컨테이너로 실행됩니다. 그리고 실행이 끝나면 docker commit으로 docker 이미지를 생성합니다.

  1. dockerfile 문법(syntax)를 검사합니다.
  2. 마지막 명령어인지 검사합니다. 
  3. 마지막 명령어가 아니라면 docker 컨테이너를 실행합니다.
  4. 컨테이너가 실행되면 명령어를 수행합니다.
  5. 명령어 수행이 끝나면 docker commit으로 이미지를 생성합니다. 그리고 컨테이너를 종료합니다.
  6. 마지막 명령어를 수행할 때까지 2번~5번 과정을 반복합니다.

그림1 docker build과정

 

예를 들어 base 이미지를 제외하고 2개의 명령어를 실행하는 Dockerfile이 있다고 가정해봅시다.

① RUN echo "first"를 실행하기 위해 컨테이너가 실행되고 명령어를 실행합니다. 이렇게 Dockerfile명령어를 실행하기 위해 생성된 컨테이너를 Intermediate(중간) 컨테이너라고 합니다. 명령어가 정상적으로 끝나면 docker commit으로 도커 이미지를 만듭니다. 그리고 Intermediate 컨테이너는 종료됩니다.

② 두번째 명령어인 RUN echo "second"를 실행하기 위해 Intermediate 컨테이너가 생성됩니다. base 이미지는 이전 docker commit된 도커 이미지를 사용합니다. 명령어 실행이 성공적으로 끝나면 docker commit으로 도커 이미지를 생성합니다. 

③ 마지막으로 doker commit한 도커 이미지가 docker images명령어 실행 결과에 도커 이미지입니다.

그림2 docker build상세과정

 

2. 예제 - 빌드로그 분석

docker build를 실행하면 저희가 컨테이너를 실행하지 않아도 도커 컨테이너가 실행됩니다. 한번 직접 살펴볼까요? dockerfile을 먼저 생성하겠습니다.

FROM busybox:1.34.1
RUN echo "first"
RUN echo "second"


docker build명령어를 입력하면 빌드로그가 보입니다.

그림3 docker build 로그 분석

 

docker images를 검색하면 commit한 도커 이미지 ID가 있는 것을 확인할 수 있습니다.

그림4 docker build와 docker images 명령어 비교 분석

 

3. dangling 이미지(untagged)

dangling 이미지는 이름과 태그가 없는 도커 이미지를 말합니다. dangling 이미지는 2가지 유형이 있습니다.

① docker build에서 생성된 도커 이미지 레이어

② 중복된 이름과 태그으로 docker build를 성공할 때, 이전 도커이미지

 

②과정은 그림으로 표현하면 [그림 5]와 같습니다.

그림5 새로 생성된 도커이미지로 만들어진 dangling이미지 유형

 

①과정에서 생성된 dangling는 [그림4]에서 보시는 것처럼 docker images -a명령어로 확인할 수 있습니다. 현재 사용중인 숨겨진 이미지로 취급되서 docker images로 보이지 않습니다.

②과정에서 생성된 dangling이미지는 docker images로도 보입니다. 

 

4. dangling 이미지 관리

docker images명령어로 보이는 dangling이미지는 관리자가 수동으로 삭제해야합니다. 전혀 사용하지 않음에도 불구하고 디스크 공간을 차지하고 있기 때문입니다. 만약, dangling이미지가 10GB가이고 10개있다면 100GB의 도커 이미지가 디스크 공간을 차지합니다.

 

공식문서[8]에서도 dangling이미지 삭제방법을 설명하고 있습니다. 삭제 방법은 dangling=true필터로 검색된 도커 이미지를 docker rmi명령어로 삭제하면 됩니다.

docker rmi $(docker images -f "dangling=true" -q)

그림6 dangling 이미지 삭제

 

참고자료

[1] docker 공식문서: https://docs.docker.com/engine/reference/builder/#dockerfile-examples
[2] docker 디버깅 명령어: https://www.freecodecamp.org/news/cleaning-up-docker/
[3] docker 관리 명령어: https://www.lainyzine.com/ko/article/docker-prune-usage-remove-unused-docker-objects/
[4] docker 이미지 생성과정: https://darkrasid.github.io/docker/container/image/create/2017/04/19/docker-image-create.html
[5] https://hoyoung1.github.io/posts/docker/2020-08-21-dockerfile-layer-order

[6] https://dzone.com/articles/docker-layers-explained
[7] https://blogs.cisco.com/developer/container-image-layers-1
[8] docker 공식문서-dangling 이미지 삭제: : https://docs.docker.com/engine/reference/commandline/images/#filtering

반응형