0%

dockerfile 도커 파일 작성법

도커 파일이란?

도커 파일은 도커 이미지를 만들기 위한 설정 파일입니다. 도커 파일은 Dockerfile이라는 이름으로 작성하며, 도커 이미지를 만들기 위한 명령어들을 순서대로 작성합니다.

도커 파일 작성법

FROM

도커 이미지의 베이스 이미지를 지정합니다. 도커 이미지는 여러 개의 레이어로 구성되어 있으며, 베이스 이미지는 가장 기본이 되는 이미지입니다.

1
FROM nginx-alpine:latest

nginx 도커 허브 링크에서 원하는 이미지를 찾아서 사용할 수 있습니다.

이미지를 확인해 보면 alpine이라는 태그가 있습니다. alpine은 가벼운 리눅스 배포판으로, nginx를 실행하는데 필요한 최소한의 패키지만 포함하고 있습니다.

뒤에 latest는 가장 최신 버전을 의미합니다. 이것을 변경하면 해당 버전을 사용할 수 있습니다.

RUN

컨테이너에서 실행할 명령어를 작성합니다.

1
2
3
RUN apt-get update && apt-get install -y \
curl \
vim

위와 같이 사용할 경우 bin/sh -c를 사용하여 명령어를 실행합니다.

COPY

호스트의 파일 혹은 디렉토리를 컨테이너로 복사합니다.

1
COPY ./app /app

WORKDIR

작업 디렉토리를 지정합니다. 이 명령어 이후에 실행되는 명령어는 해당 디렉토리에서 실행됩니다.

1
WORKDIR /app

EXPOSE

EXPOSE 명령어는 실제로 포트를 열지는 않습니다. 단지 컨테이너가 어떤 포트를 사용할 것인지 알려주는 역할을 합니다.

1
EXPOSE 80

CMD

CMD 명령어는 컨테이너가 시작될 때 실행할 명령어를 지정합니다. CMD는 다른 명령어가 실행될 때 무시됩니다.

컨테이너에서 실행되는 프로세세스는 한 개를 권장합니다. 도커는 메인프로세르를 추적해서 컨테이너가 실행중인지 확인합니다. 만약 메인프로세스가 종료되면 컨테이너도 종료됩니다. 이것에 유의해서 CMD 명령어를 작성해야 합니다.

1
CMD ["python", "app.py"]

ENTRYPOINT

ENTRYPOINT 명령어는 컨테이너가 시작될 때 실행할 명령어를 지정합니다. CMD와 다르게 컨테이너가 실행될 때 항상 실행됩니다. 따라서 ENTRYPOINT는 컨테이너가 실행될 때 필수적으로 실행되어야 하는 명령어를 작성합니다.

1
ENTRYPOINT ["python", "app.py"]

도커 이미지 최적화

위 명령어들을 사용하면 도커 이미지를 만들 수 있습니다. 하지만 제대로 사용하지 않으면 이미지가 커질 수 있습니다. 이미지를 최적화하는 방법을 알아보겠습니다.

이미지 레이어

Dockerfile의 명령어의 순서는 중요합니다. 각 명령어가 실행될 때마다 이미지 레이어가 생성됩니다. 아래는 도커 파일이 컨테이너 레이어로 변환되는 과정입니다.

도커 이미지 레이어

빌드를 실행하면 이전 빌드의 레이어를 다시 사용하려고 합니다. 이미지 레이어가 변경되지 않으면 캐시된 레이어를 사용합니다. 하지만 마지막 빌드 이후에 레이어가 변경되면 이후 있는 모든 레이어를 다시 빌드합니다.

아래는 COPY 명령어를 사용한 이후에 종속성(RUN go mod download)을 추가하는 경우입니다. 프로젝트 파일이 변경되면 캐시가 무효화되고 종속성을 다시 다운로드합니다.

도커 이미지

하지만 종속성을 먼저 다운로드하고 프로젝트 파일을 복사하면 프로젝트 파일이 변경되어도 종속성을 다시 다운로드하지 않습니다. 이렇게 하면 캐시를 재사용할 수 있습니다.

도커 이미지

.dockerignore

도커 이미지를 빌드할 때 불필요한 파일을 제외할 수 있습니다. .dockerignore 파일을 작성하여 불필요한 파일을 제외할 수 있습니다.

1
2
.git
node_modules

이렇게 작성하면 배포에 필요한 파일만 포함되어 이미지 크기를 줄일 수 있습니다.

Multi-stage 빌드

멀티 스테이지 빌드를 사용하면 빌드에 필요한 도구를 포함하지 않고 배포에 필요한 파일만 이미지에 포함할 수 있습니다. FROM 명령어를 여러 개 사용하여 여러 단계로 빌드할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
FROM golang:1.16 AS build
WORKDIR /app
RUN go mod init hello-go
COPY . .
RUN go build -o app

FROM alpine:latest
WORKDIR /app
COPY --from=build /app/app .
ENTRYPOINT [ "./app" ]

위 명령어를 보면 AS 명령어를 사용하여 빌드 단계를 지정합니다. 빌드를 한 이후 다음 단계에서 --from=build를 통해 필요한 파일만 복사하여 이미지를 만듭니다.

차이

이렇게 하면 빌드에 필요한 도구를 포함하지 않고 이미지를 최적화할 수 있습니다.

결론

간단하게 도커 파일 작성하는 방법과 이미지 최적화하는 방법을 알아보았습니다. 아주 어려운 내용은 아니지만 잘 사용하면 시간을 절약하고 이미지 크기를 줄일 수 있어서 잘 숙지하고 사용하면 좋을 것 같습니다.