Jisoo.

기술블로그

4. Dockerfile과 Image *미완성*


썸네일

Dockerfile과 Image

이미지에 대해 알아보고 Dockerfile을 통해 이미지를 생성해보겠습니다.


💡 Dockerfile

Dockerfile은 애플리케이션 패키징을 위한 스크립트입니다.

이 스크립트를 작성하여 이미지를 생성할 수 있습니다.

- Dockerfile 작성 방법

1FROM diamol/node 2 3ENV TARGET="blog.sixeyed.com" 4ENV METHOD="HEAD" 5ENV INTERVAL="3000" 6 7WORKDIR /web-ping 8COPY app.js . 9 10CMD ["node", "/web-ping/app.js"]

각 줄은 Instruction에 해당하며 하나 하나가 실행 관련 명령어에 해당합니다.

FROM, ENV, WORKDIR, CMD 등 다양한 인스트럭션을 제공합니다.

자주 사용되는 인스트럭션은 다음과 같습니다.

인스트럭션설명
FROM이미지의 기준을 정의합니다. 다른 이미지가 기준이 될 수 있습니다.
COPY로컬 파일 시스템의 파일, 디렉토리를 이미지 내부로 복사합니다.
CMD컨테이너가 실행될 때 실행 할 명령을 지정합니다.
ENV이미지 환경 변수 값을 설정합니다.
EXPOSE컨테이너가 외부에 노출할 포트를 명시적으로 지정합니다. 실제로 노출되지 않습니다.
RUN빌드 과정에서 명령을 실행하고 결과를 이미지에 저장합니다. 주로 의존성 설치에 사용됩니다.
WORKDIR이미지 내부에 디렉토리를 생성하고 해당 디렉토리를 작업 디렉토리로 사용합니다.

- 이미지 생성하기

Dockerfile을 이용하여 이미지를 생성(빌드)할 수 있습니다.

1docker image build --tag my-image .

이미지를 생성할 경우 다음과 같이 일련의 메시지가 출력됩니다.

글 이미지
1=> CACHED [builder 1/3] FROM docker.io/diamol/golang:latest@sha256:ffc0... 2=> CACHED [stage-1 1/5] FROM docker.io/diamol/base:latest 3=> [internal] load build context = 4=> transferring context: 569B 5=> [builder 2/3] COPY main.go . 6=> [builder 3/3] RUN go build -o /gols 7=> [stage-1 2/5] COPY --from=builder /gols / 8=> [stage-1 3/5] RUN chmod +x /gols 9=> [stage-1 4/5] WORKDIR /init 10=> [stage-1 5/5] COPY ./existing/ . 11=> exporting to image = => exporting layers 12=> writing image sha256:50c78... 13=> naming to docker.io/library/my-image

자세히 읽어보면 Dockerfile의 내용과 일치하는 것을 확인할 수 있습니다.

순차대로 Dockerfile의 인스트럭션을 실행하며 이미지를 빌드할 수 있습니다.


💡Image

글 이미지

이미지는 소스 코드, 라이브러리 등 애플리케이션 실행에 필요한 파일을 가지고 있는 파일입니다.

이러한 이미지를 토대로 독립적인 환경을 가진 컨테이너를 만들 수 있게 됩니다.

예를 들면 하나의 CD로 여러 대의 컴퓨터에서 똑같은 프로그램을 설치할 수 있는 것과 비슷합니다.

프로그램은 어디서나 동일하게 설치되고 설치된 프로그램 간에 서로 영향을 주지 않습니다.

- 이미지의 구조

이미지는 여러 개의 작은 파일로 이루어져있습니다.

글 이미지

이미지를 다운로드 받을 경우 다음처럼 여러 줄에 걸쳐서 이루어지는 것을 확인할 수 있습니다.

각 줄은 이미지를 구성하는 작은 파일로써 이 또한 이미지에 해당합니다.

history 명령어를 통해 이미지가 어떤 명령으로 빌드됐는지 알 수 있습니다.

글 이미지

각 줄마다 이미지 레이어에 대한 정보가 출력되며 Dockerfile에 작성된 하나의 인스트럭션이 하나의 이미지를 의미하는 것을 알 수 있습니다.

즉, 하나의 이미지는 다른 이미지가 겹겹이 쌓인 파일을 의미합니다.

이를 이미지 레이어라고합니다.

- 이미지 레이어

글 이미지

Docker를 사용하면 이미지 배포 및 공유가 가능합니다.

내부적으로 소프트웨어 배포 기능이 포함되어 있기 때문에 push, pull 명령어를 통해 도커 허브에 이미지를 공유할 수 있습니다.

공유된 이미지 레이어는 DockerfileFROM 명령어를 통해 해당 이미지를 기반으로 새로운 이미지를 생성할 수 있습니다.

이미지 레이어는 다른 이미지에서도 공유가 가능하기 때문에 수정될 경우 관련된 모든 이미지에서 문제를 초래할 수 있습니다.

따라서 생성된 이미지는 수정이나 실행이 불가능한 읽기전용 파일입니다.

- 이미지의 공유

//


💡 Dockerfile 최적화

- 캐시를 이용한 빌드 최적화

하나의 인스트럭션은 하나의 이미지 레이어와 연결됩니다.

이미지 빌드시, Hash를 이용해서 캐시에 일치하는 레이어가 있는지 확인합니다.

인스트럭션 결과가 기존과 같다면 캐시된 해당 이미지 레이어를 재사용합니다.

인스트럭션은 위에서 아래로 순서대로 실행되며 캐시되지 않은 인스트럭션을 만날 경우 해당 인스트럭션 이후의 모든 과정은 캐시 데이터를 사용하지 않습니다.

따라서 이미지 빌드 시 자주 변경되는 파일 관련 인스트럭션을 마지막에 배치하면 인스트럭션의 낭비를 줄일 수 있습니다.

또한 이미지 빌드 시간이 감소하는 효과를 가져올 수 있습니다.

- 멀티 스테이지 빌드를 통한 최적화

//


💡 마무리

나중에 다시 쓰기 ㅎ

3. Docker Container

1


Docker 시리즈의 다른 포스트

썸네일-0

3. Docker Container

Docker Container에 대해서 간단히 알아봅시다.


2024년 10월 10일

썸네일-1

2. Docker 설치 및 실행하기

Docker를 설치하고 어떻게 사용하는지 알아봅시다.


2024년 10월 04일

썸네일-2

1. Docker란 무엇일까

Docker에 대해서 간단하게 알아봅시다.


2024년 10월 04일