티스토리 뷰

Infra/도커

Dockerfile 알아보기

kkoon9 2023. 1. 15. 23:44

도커 스터디때 다룬 Dockerfile을 좀 더 공부한 내용입니다.

 

도커 스터디 [2]- Dockerfile을 직접 작성해보기

🧸 사내에서 진행했던 도커 스터디를 실습 및 정리했던 내용을 정리한 포스팅입니다. Dockerfile 문법 FROM ENV ADD COPY WORKDIR EXPOSE ENTRYPOINT RUN CMD USER ARG LABEL VOLUME ONBUILD STOPSIGNAL HEALTHCHECK 보통 FROM 에서

kkoon9.tistory.com

사내에서 진행하는 사이드 프로젝트를 배포하기 위해 Docker를 공부했습니다.

Dockerfile

Dockerfile은 원하는 개발환경을 코드로 구성하는 방법을 제공합니다.

코드로서 인프라 환경을 프로비저닝할 수 있습니다.

도커 이미지를 생성하기 위해서 Dockerfile을 사용하는데, 특정 컨테이너를 위한 이미지에 필요한 모든 설정 내용을 담을 수 있습니다.

효율적인 Dockerfile 작성

효율적인 Dockerfile 작성을 위해 기본적으로 빌드 시간, 이미지 크기, 재사용성, 보안 유지보수성 등을 고려해야 합니다.

[1]. 경량의 컨테이너 서비스

컨테이너 서비스의 장점 중 하나는 가볍다는 점입니다.

언제든 빠른 컨테이너 배포를 위해 최소한의 설정과 구성을 권장합니다.

[2]. 레이어 최소화

Dockerfile 명령어의 수와 도커 이미지 레이어 수는 동일하게 합니다.

레이어 수가 많아지면 이미지를 생성하는 빌드 시간이 길어지기 때문입니다.

[3]. 하나의 애플리케이션은 하나의 컨테이너에

하나의 컨테이너에 두 개 이상의 애플리케이션을 설정하게 되면 결합성이 높아지고 확장성을 저해시킵니다.

그렇기 때문에 하나의 컨테이너에는 하나의 애플리케이션을 설정하는 게 좋습니다.

[4]. IaC 환경 개발은 디렉터리 단위로

Dockerfile로 이미지를 빌드하면 현재 위치로부터 하위 경로의 모든 디렉터리와 파일을 도커 컨텍스트에 저장한 뒤 작업이 진행됩니다.

이를 빌드 컨텍스트라 하는데, 이미지 빌드와 상관없는 파일이 포함되지 않도록 별도의 디렉터리에서 빌드가 이루어져야 합니다.

Dockerfile 빌드 과정

Docker의 빌드과정을 기가 막히게 설명한 이미지가 있습니다.

docker build를 실행하는 현재 작업 중인 디렉터리를 빌드 컨텍스트라고 합니다.

이미지 빌드가 시작되면 Dockerfile 위치와 상관없이 현재 디렉터리에 있는 모든 파일과 디렉터리의 콘텐츠는 도커 데몬에 빌드 컨텍스트로 전달됩니다.

Dockerfile 명령어

Dockerfile은 개발환경을 제공하기 위한 여러 명령어들로 이루어져 있습니다.

명령어는 대소문자를 구분하지는 않지만 가독성을 위해 대문자로 작성됩니다.

프로젝트에 사용된 명령어만 알아보겠습니다.

Dockerfile 명령어 [1]. FROM

생성하려는 이미지의 베이스 이미지를 지정하는 명령어입니다.

도커 허브에서 제공하는 공식 이미지를 권장합니다.

 

Docker Hub Container Image Library | App Containerization

Deliver your business through Docker Hub Package and publish apps and plugins as containers in Docker Hub for easy download and deployment by millions of Docker users worldwide.

hub.docker.com

추가로 slim이 붙어있는 이미지를 찾아볼 수 있는데, 이는 기본 이미지보다 작은 크기를 가지는 이미지입니다.

FROM openjdk:11-jre-slim

Dockerfile 명령어 [2]. ARG

빌드 시점에서 변숫값을 전달해주는 명령어입니다.

민감한 정보 사용 시 이미지에 그대로 존재하기 때문에 노출될 위험이 있습니다.

ARG ENVIRONMENT

Dockerfile 명령어 [3]. ENV

이미지 안에 환경 변수를 지정해주는 명령어입니다.

예를 들어, 스프링에서는 환경변수를 지정해주는 SPRING_CONFIG_ACTIVATE_ON-PROFILE이 있습니다.

ENV를 설정하면 RUN이나 WORKDIR 등에서 환경 변수를 사용해 반복을 피할 수 있습니다.

ENV SPRING_CONFIG_ACTIVATE_ON-PROFILE=${ENVIRONMENT}

빌드시 환경 변수를 지정해주려면 다음과 같이 사용합니다.

docker build --build-arg ENVIRONMENT=local .

Dockerfile 명령어 [4]. COPY

호스트 환경의 파일, 디렉터리를 이미지 안에 복사해주는 명령어입니다.

디렉터리 외부의 파일은 복사할 수 없습니다.

gradle에서는 build를 하면 jar 파일이 build/libs 경로 밑에 생성되기 때문에 아래와 같은 명령어를 사용했습니다.

COPY build/libs/*.jar kkoon9.jar

Dockerfile 명령어 [5]. ENTRYPOINT

생성된 이미지가 컨테이너로 실행될 때 사용하는 명령어입니다.

예시로, COPY 명령어에서 만든 jar 파일을 실행할 때 사용됩니다.

ENTRYPOINT ["java","-jar","/kkoon9.jar"]

Dockerfile 명령어 마무리

가볍게 제가 사용할 명령어만 알아봤습니다.

보통 FROM 명령부터 작성되고 그다음 명령부터는 순서가 없습니다.

하지만, 명령 순서는 빌드 캐시의 무효화와 연관되므로 변경 빈도수가 적은 명령을 먼저 배치하는 것을 권장합니다.

Dockerfile 빌드

docker build 명령을 통해서 Dockerfile로부터 이미지를 생성합니다.

docker build [옵션] 이미지명:[태그] 경로 | URL | 압축 파일

도커 문서에 보시면 많은 옵션이 있지만, 제가 사용한 옵션은 이미지명:태그를 지정할 때 사용하는 옵션 t입니다.

docker build --build-arg ENVIRONMENT=local -t kkoon9-application .

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함