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

4-1. 빌드과정

Dockerfile에 적은 명령어는 docker 컨테이너로 실행한다.

실행이 끝나면 docker commit으로 docker 이미지를 생성한다.

  1. Dockerfile 문법을 검사한다.
  2. 현재 명령어가 마지막 명령어인지 확인한다.
  3. 마지막이 아니라면, 기존 이미지(또는 이전 단계 결과)를 기반으로 컨테이너를 생성한다.
  4. 컨테이너에서 해당 명령어를 실행한다.
  5. 명령이 성공적으로 수행되면, docker commit을 통해 새로운 이미지 레이어를 생성하고 컨테이너를 종료한다.
  6. Dockerfile의 끝에 도달할 때까지, 2번~5번 과정을 반복한다.

4-2. Intermediate 컨테이너

  • RUN echo "first"와 같은 명령을 실행하면, Docker는 새로운 컨테이너를 하나 생성하고 해당 명령어를 실행한다.
  • 이 컨테이너는 명령어 실행을 위한 임시 컨테이너, 즉 Intermediate 컨테이너라고 부른다.
  • 명령어가 성공적으로 실행되면, 이 컨테이너의 상태를 이미지로 저장(docker commit) 하고 컨테이너는 종료된다.

흐름

  1. 첫 번째 명령어 RUN echo "first":
    • 베이스 이미지(alpine 등)를 기반으로 컨테이너 실행
    • 명령어 실행 후, docker commit → 첫 번째 이미지 레이어 생성
  2. 두 번째 명령어 RUN echo "second":
    • 이전 단계에서 생성된 이미지를 기반으로 새로운 Intermediate 컨테이너 생성
    • 명령어 실행 후, docker commit → 두 번째 이미지 레이어 생성
  3. 마지막 명령어까지 동일하게 반복되고,
    • 최종적으로 생성된 이미지가 docker images 명령어에 표시되는 최종 도커 이미지 가 된다.

4-3. dangling 이미지(untagged)

이름과 태그가 없는 도커 이미지

  • none이라는 이름과 태그를 가진 이미지로 표시된다.

Dangling 이미지가 생성되는 경우

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

  • docker build 중간에 생성된 이미지 레이어가 아직 태그되지 않았거나, 최종 이미지로 쓰이지 않은 경우

2. 동일한 이름:태그로 새로 build하거나 pull할 때

  • 중복된 이름과 태그로 docker build를 성공하면 이전 이미지를 참조하지 않게 되고 dangling 처리가 된다. 더 이상 어떤 이미지나 컨테이너에서도 참조하지 않으면 완전한 고아 이미지가 됨 디스크 용량을 차지하지만, 쓰이지 않으므로 docker image rm $(docker images -f "dangling=true" -q)로 삭제해야 한다.

출처