1. 개요
컨테이너화 기술은 배포 환경을 더 적은 비용으로 신속하게 구축하고 구성하는 데 도움이 됩니다. "Write Once, Deploy Anywhere"라는 모토를 바탕으로 컨테이너화를 사용하여 최신 애플리케이션의 복잡성을 해결합니다.
이 사용방법(예제)에서는 컨테이너화 기술의 기본 구성 요소인 Docker 이미지 레이어에 대해 자세히 알아봅니다.
2. 이미지 레이어
Docker 이미지는 완전한 이미지를 형성하기 위해 서로 위에 쌓인 많은 읽기 전용 레이어를 연결하여 생성됩니다. Docker 및 Podman 과 같은 플랫폼 은 레이어를 함께 가져와 단일 통합 객체로 묘사합니다.
예를 들어 레지스트리에서 MySQL 이미지를 가져와 간단히 살펴보겠습니다.
# docker pull mysql
Using default tag: latest
latest: Pulling from library/mysql
492d84e496ea: Pull complete
bbe20050901c: Pull complete
e3a5e171c2f8: Pull complete
c3aceb7e4f48: Pull complete
269002e5cf58: Pull complete
d5abeb1bd18e: Pull complete
cbd79da5fab6: Pull complete
Digest: sha256:cdf3b62d78d1bbb1d2bd6716895a84014e00716177cbb7e90f6c6a37a21dc796
Status: Downloaded newer image for mysql:latest
위 스니펫에서 "Pull complete"로 끝나는 각 줄은 이미지를 형성하기 위해 레지스트리에서 가져온 레이어를 나타냅니다. 보시다시피 MySQL 이미지에는 7개의 레이어가 있습니다.
2.1. 이미지 레이어 생성
이제 Dockerfile 일러스트레이션을 통해 레이어가 구축되는 방식을 이해하기 위해 더 깊이 들어가 보겠습니다.
Dockerfile 의 RUN , COPY 및 ADD 와 같은 명령 은 새 계층을 생성하는 반면 다른 명령은 중간 계층만 생성합니다. 전자 명령은 레이어 크기에 영향을 주지만 후자는 그렇지 않습니다.
Dockerfile 을 통해 이미지를 빌드해 봅시다 . 이 링크 에서 Dockerfile 을 참조할 수 있습니다 . docker build 명령을 사용 하여 Dockerfile 을 통해 이미지를 생성합니다 .
# docker build -t layer-demo/latest .
Sending build context to Docker daemon 3.072kB
Step 1/8 : FROM ubuntu:latest
---> df5de72bdb3b
Step 2/8 : MAINTAINER baeldung.com
---> Running in 2c90e21f29e2
Removing intermediate container 2c90e21f29e2
---> 460d0651cc3d
Step 3/8 : ADD get_date.sh /root/get_date.sh
---> 492d1b205a94
Step 4/8 : RUN chmod 0644 /root/get_date.sh
---> Running in 08d04f1db0de
Removing intermediate container 08d04f1db0de
---> 480ba7f4bc50
Step 5/8 : RUN apt-get update
...
... output truncated ...
...
---> 28182a44db71
Step 6/8 : RUN apt-get -y install cron
...
... output truncated ...
...
---> 822f3eeca346
Step 7/8 : RUN crontab -l | { cat; echo "* * * * * bash /root/get_date.sh"; } | crontab -
---> Running in 635190dfb8d7
no crontab for root
Removing intermediate container 635190dfb8d7
---> 2822aac1f51b
Step 8/8 : CMD cron
---> Running in 876f0d5aca27
Removing intermediate container 876f0d5aca27
---> 5fc87be0f286
Successfully built 5fc87be0f286
무슨 일이야? 이 이미지를 생성하려면 Dockerfile 의 각 명령에 대해 하나씩 총 8단계가 필요합니다 . 처음에 Ubuntu 이미지[Image ID: df5de72bdb3b ]를 레지스트리에서 가져옵니다.
- 이전 단계의 이미지 [Image ID: df5de72bdb3b ]로 중간 컨테이너 [Container ID: 2c90e21f29e2 ]를 회전시킵니다 .
- 그런 다음 중간 컨테이너 [컨테이너 ID: 2c90e21f29e2 ] 에서 명령이 실행됩니다 .
- 이후 중간 컨테이너는 커밋을 통해 이미지 [Image ID: 460d0651cc3d ]로 변환되어 중간 컨테이너 [Container ID: 2c90e21f29e2 ]가 제거됩니다.
- 중간 컨테이너를 제거한 후 이미지는 읽기 전용 레이어가 됩니다. 그런 다음 Dockerfile 의 다음 명령어 실행으로 이동합니다 .
그러나 새 레이어를 만드는 단계는 위와 동일합니다. 중간 레이어는 이미지 크기에 영향을 줄 수 없지만 RUN , ADD 및 COPY 를 사용하는 일반 레이어 는 크기를 늘릴 수 있습니다.
3. 레이어 크기
일반적으로 이미지의 크기는 전적으로 관련 레이어에 의해 결정됩니다 . docker history 명령 은 이미지와 연결된 각 레이어의 크기를 보여줍니다.
아래 예에서 크기 0B의 레이어는 중간 레이어를 나타내고 RUN , COPY 및 ADD 명령은 이미지 크기에 기여합니다.
# docker history layer-demo/latest
IMAGE CREATED CREATED BY SIZE COMMENT
5fc87be0f286 8 hours ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "cron… 0B
2822aac1f51b 8 hours ago /bin/sh -c crontab -l | { cat; echo "* * * *… 208B
822f3eeca346 8 hours ago /bin/sh -c apt-get -y install cron 987kB
28182a44db71 8 hours ago /bin/sh -c apt-get update 36MB
480ba7f4bc50 8 hours ago /bin/sh -c chmod 0644 /root/get_date.sh 5B
492d1b205a94 8 hours ago /bin/sh -c #(nop) ADD file:1f79f73be93042145… 5B
460d0651cc3d 8 hours ago /bin/sh -c #(nop) MAINTAINER baeldung.com 0B
df5de72bdb3b 4 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
4 weeks ago /bin/sh -c #(nop) ADD file:396eeb65c8d737180… 77.8MB
이제 기본 이미지부터 시작하여 모든 레이어의 크기를 합산해 보겠습니다.
- df5de72bdb3b – 77.800000MB ## 1단계: 기본 Ubuntu 이미지
- 492d1b205a94 – 0.000005MB ## 3단계: 지침 추가
- 480ba7f4bc50 – 0.000005MB ## 4단계: 실행 명령
- 28182a44db71 – 36.000000MB ## 5단계: 명령 실행
- 822f3eeca346 – 0.987000MB ## 6단계: 명령 실행
- 2822aac1f51b – 0.000208MB ## 7단계: 명령 실행
위의 숫자를 모두 더하면 114.787MB가 되고 115MB까지 반올림할 수 있습니다. 보시다시피 계산된 합계 는 docker image 명령 의 layer-demo:latest 이미지 크기 와 정확히 일치합니다.
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
layer-demo/latest latest 5fc87be0f286 8 hours ago 115MB
ubuntu latest df5de72bdb3b 4 weeks ago 77.8MB
4. 매달린 이미지
매달린 이미지는 이미지 형성 중에 생성되는 이미지 레이어입니다. 그러나 이미지 생성 후 이러한 레이어는 태그가 지정된 이미지와 관계가 없습니다. 따라서 불필요한 디스크 공간을 소비하므로 모든 이미지를 제거하는 것이 안전합니다.
매달려 있는 이미지를 모두 나열하려면 검색 필터에서 dangling 속성을 true로 설정 한 docker image 명령을 사용할 수 있습니다.
# docker images --filter "dangling=true"
아래 명령은 매달린 이미지를 표시한 다음 이후에 제거합니다.
# docker images --quiet --filter=dangling=true | xargs --no-run-if-empty docker rmi
5. 결론
이 기사에서는 Docker 이미지 레이어 개념과 레이어 생성에 대해 살펴보았습니다. 또한 이미지와 관련된 레이어 List과 각 레이어의 크기를 식별하는 데 사용할 수 있는 명령에 대해서도 논의했습니다.
마지막으로, 우리는 중간 레이어가 어떻게 생성되는지 보았고 매달린 이미지를 자주 지우지 않으면 시스템에 남아 있다는 것을 배웠습니다.