스터디

[KANS 3기] 내가 쓰는 도커 이미지는 어떻게 구성되어 있나요 ?

엔지니어-여리 2024. 8. 31. 04:02
반응형

도커 이미지는 2가지 방법으로 만들 수 있습니다.

 

1. Dockerfile로부터 docker build

 

2. 현재 실행중인 컨테이너 docker commit

 

대체로 많이 사용하고 저도 권장하는 방법은 1번 방법입니다.

 

그 이유는, 우리는 애플리케이션 프로세스를 도커 이미지라는 아주 경량화, 격리된 가상 환경에서 실행하고자 합니다. 이를 위해서는 가상환경에 포함된 프로그램이 무엇인지 아주 조심스럽게 관리해야합니다. 위와 같은 이유로 도커파일을 기반으로 도커 이미지를 구성해야 도커 이미지에 어떤 프로그램이 포함되어 있는지 관리, 변경, 추적이 용이해집니다.

 

우리가 도커파일을 구성해도 좋지만, 도커허브에서 아주 많이 사용되는 도커파일을 가지고 실습을 해봅시다.

 

한가지 도커파일을 한 번 살펴봅시다. 

apache tomcat dockerfile 중 발췌

FROM eclipse-temurin:21-jdk-noble

ENV CATALINA_HOME /usr/local/tomcat
ENV PATH $CATALINA_HOME/bin:$PATH
RUN mkdir -p "$CATALINA_HOME"
WORKDIR $CATALINA_HOME

# let "Tomcat Native" live somewhere isolated
ENV TOMCAT_NATIVE_LIBDIR $CATALINA_HOME/native-jni-lib
ENV LD_LIBRARY_PATH ${LD_LIBRARY_PATH:+$LD_LIBRARY_PATH:}$TOMCAT_NATIVE_LIBDIR

# see https://www.apache.org/dist/tomcat/tomcat-11/KEYS
# see also "versions.sh" (https://github.com/docker-library/tomcat/blob/master/versions.sh)
ENV GPG_KEYS 48F8E69F6390C9F25CFEDCD268248959359E722B A9C5DF4D22E99998D9875A5110C01C5A2F6059E7

맨 위에 FROM Instruction에는 어떤 이미지를 가져온다. 그 아래 있는 instruction을 통해 내가 구성하고자 하는 이미지를 정의할 수 있다. 

 

FROM instruction에 있는 이미지를 타고타고 올라가면 어디에 도달하는가 ?

 

두 번째로 이 도커파일을 살펴봅시다.

ubuntu:20.04 

FROM scratch
ARG RELEASE
ARG LAUNCHPAD_BUILD_ARCH
LABEL org.opencontainers.image.ref.name="ubuntu"
LABEL org.opencontainers.image.version=$RELEASE
ADD ubuntu-*-oci-$LAUNCHPAD_BUILD_ARCH-root.tar.gz /
CMD ["/bin/bash"]

 

가장많이 쓰이는 이미지중 하나인 ubuntu 이미지를 가져왔습니다. 앞에 도커파일에서는 어떠한 이미지를 가져왔는데 ubuntu 이미지에서는 scratch 라는 이미지를 가져옵니다. 사실 from scratch는 도커 이미지중 최상단에 존재하는 이미지 입니다. 도커허브에 있는 스크래치 이미지에 관한 설명은 다음과 같습니다.

 

You can use Docker’s reserved, minimal image, scratch , as a starting point for building containers. Using the 
scratch “image” signals to the build process that you want the next command in the Dockerfile to be the first filesystem layer in your image.

 

간단히 보면, 기본 이미지라고 볼 수 있습니다. 이를 통해 우리는 기본 이미지 scratch 이미지로부터 어떤 이미지들이 구성되고, 또 그 이미지로부터 새로운 이미지와 같이 수형도 형태로 이미지들이 구성되어 있는 걸 알 수 있습니다.

 

또 이와 같은 방법 외에 내가 사용하는 이미지를 확인할 수  있습니다.

dive라는 도구입니다.

https://github.com/wagoodman/dive 에서 제공하는 dive라는 도구를 사용하면 도커 이미지를 분석해볼 수 있습니다.

 

 

좌측 상단: layer

좌측 중단: layer detail

좌측 하단: image detail

우측: 좌측 선택된 layer 까지의 파일 구조

 

위 이미지는 ubuntu:20.04 이미지를 dive 도구로 분석해보았을 때 나오는 화면입니다. 하나의 layer로 구성된 이미지라 이미지 내에서  layer별 영향도를 확인하기가 쉽지 않습니다. 다만 각 화면이 무엇을 나타내는지 확인해볼 수 있습니다.

간단한 이미지를 확인해봤으니 이제 좀 더 복잡한 이미지를 통해 분석해보겠습니다.

 

 

 

이미지 내에서 각 layer (이미지는 여러 layer로 구성되어 있다.) 의 합으로 구성되는데, 각 layer에 의해 변경되는 파일 구조 (우측)도 관찰할 수 있습니다.

layer를 탐색할 때는 좌측 상단에서 보라색 현재 선택된 레이어, 초록색 누적된 레이어를 확인할 수 있습니다. 

좌측 중단에서는 현재 레이어가 어떤 명령어를 포함하는지 확인할 수 있습니다. Layer를 구성하는 instruction은 다음과 같습니다. 

RUN, COPY, ADD 

 

하나의 레이어에서 생성되는 파일이 많은 경우, filter 기능(ctrl + F) 을 통해 파일 구조에서 필터링을 할 수 있습니다. 

 

감사합니다.

 

반응형