Profile picture

[Dockerfile] Dockerfile 알아보기

JaehyoJJAng2023년 04월 07일

▶︎ Build Context

Dockerfile

FROM nginx:1.23
LABEL description="01. 이미지 빌드 실습"
COPY ./index.html /usr/share/nginx/html/index.html
CMD [ "nginx", "-g", "daemon off;" ]

빌드 컨텍스트는 빌드에 필요한 모든 파일들을 모아놓은 디렉토리 라고 간단하게 요약할 수 있겠다.
image

빌드 컨텍스트에 모든 필수 요소들을 넣어놓고

빌드를 실행하면 도커 엔진은 빌드 컨텍스트로 지정된 디렉토리를 전달받게 되고,

거기서 필요한 파일들을 참조하면서 빌드를 수행하게 됨.

만약 하나라도 빠져있다면 빌드 중 에러를 만나게 될 것.


💥 빌드 컨텍스트의 경로 설정은 매우 중요하다!

도커 파일을 별도의 폴더에서 관리하는 것은 매우 중요하다.

예를 들어, Dockerfile이 C 드라이브 최상단에 위치한다면 이 도커 파일이 포함된 C 드라이브 전체가 Build Context가 되어버린다.

이는 빌드 컨텍스트가 도커 데몬에게 전달돼야 하기 때문에

빌드 컨텍스트의 크기가 커지면 커질수록 전송 시간이 길어지고,

이 폴더의 크기가 비정상적으로 커지면 빌드에 문제가 발생할 가능성이 높아진다.

그래서 도커파일과 빌드에 사용되는 파일만 별도의 폴더로 관리해야 한다!


▶︎ Dockerfile

  • docker 이미지를 작성할 수 있음
  • Dockerfile 문법으로 이미지 생성을 위한 스크립트 작성 , 이를 기반으로 이미지 생성
  • 나만의 이미지 커스터마이징 , 배포 위하여 많이 사용됨

‣ 기본 문법

  • Dockerfile은 텍스트 파일 형식, 어떤 에디터로든 작성가능
  • 기본적으로 간단히 명령인자로 이루어짐
  • 명령은 통상적으로 대문자로 작성 (소문자로 작성해도 되지만 , 구분을 위하여 대문자로 통일)

‣ 지시어 #1

지시어 설명
FROM 베이스 이미지 지정명령
EX. FROM httpd:alpine
LABEL 버전 정보 , 작성자와 같은 이미지 설명을 작성하기 위한 명령
EX. LABEL version="1.0.0"
CMD docker 컨테이너가 시작할 때 , 실행하는 쉘 명령 지정하는 명령 , RUN과 비슷하지만 RUN은 이미지 작성 시 실행하는 명령어 , CMS는 컨테이너 시작할 때 실행하는 명령
EX. CMD ['python','app.py']
RUN 쉘 명령을 실행하는 명령
EX. RUN ["apt-get","install","nginx"]
ENTRYPOINT docker 컨테이너가 시작할 때 , 실행하는 쉘 명령 지정하는 명령 , docker run 실행시 별도 명령어 삽입 가능한데 , 이 때 CMD 명령은 해당 명령으로 덮어씌워짐
EXPOSE docker 컨테이너 외부에 오픈할 포트 설정
EX. EXPORT 8080
ENV docker 컨테이너 내부에서 사용할 환경 변수 지정
EX. ENV PATH /usr/bin:${bash}
WORKDIR docker 컨테이너에서의 작업 디렉토리 설정
COPY 파일 또는 디렉토리를 docker 컨테이너에 복사.ADD와 달리 URL 지정 불가 , 압축 파일 자동으로 풀어주지 않음
Ex. COPY test.sh /root/test.sh
ARG dockerfile 내에서 필요한 변수 설정. docker 이미지/컨테이너에서 사용하는 환경 변수를 설정하는 ENV와 달리 , dockerfile 스크립트 작성을 위해 필요한 변수 설정
EX. ARG env=dev
USER docker 이미지 및 컨테이너에서 작업을 하는 사용자 ID를 지정
EX: USER jaehyo
ONBUILD 생성한 이미지를 기반으로 , 새로운 이미지를 생성시 실행하는 명령을 지정
EX. ONBUILD ADD myweb.tar /var/wwwh/html
VOLUME 이미지를 위한 볼륨생성
❗️호스트PC의 특정 볼륨과 연결시키는 것이 아님

‣ 명령어 치환

자주 사용할 일은 없지만 도커파일에서는 명령어 치환(Command Subtitution)도 사용 가능하다

일반적으로 RUN 지시어 내에서 셸 명령을 실행할 때 사용된다.

# 빌드 이미지로 OpenJDK 11 & Gradle을 지정
FROM gradle:7.6.1-jdk11 AS build

.. 명령들

# Gradle 빌드를 실행하여 JAR 파일 생성
RUN gradle clean build --no-daemon
RUN cp "build/libs/$(ls -lh build/libs/ | grep "SNAPSHOT.jar$" | awk '{print $9}')" leafy.jar

.. 명령들

‣ 이미지 빌드

docker build -t <Dockerfile 경로>
docker build --tag yshrim12/nginx .

‣ 주요 옵션

  • -t 또는 --tag
    • 이미지 이름 설정 , 이미지 이름은 저장소(DockerHub ID)/이미지이름:태그 와 같이 작성
    • (저장소 이름 및 태그 이름은 작성 안해도 됨 , 태그 이름이 없는 경우 , 디폴트로 latest가 태그로 붙여짐)
  • -f : 이미지 빌드시 디폴트로 Dockerfile 파일명으로 된 파일을 찾아서 , 이미지를 빌드함. 그 외의 파일명으로 이미지를 빌드할 경우 해당 옵션 사용해서 파일명 지정
  • --pull : FROM 으로 지정된 이미지는 한번 다운로드 받으면 , 이미지 생성 시 마다 새로 다운로드 받지 않고 다운로드 받은 이미지를 사용
    • 해당 옵션은 이미지 생성시마다 새로 다운로드 받으라는 명령. --pull=true 와 같이 작성

▶︎ 이미지 빌드 실습

‣ 예제 (1)

  • 위에서 작성한 Dockerfile 이 있는 동일 경로에서 다음과 같이 명령
  • --tag myimage는 이미지 이름을 myimage로 설정한 것이므로 , 디폴트 태그가 붙어 myimage:latest로 작성되었음
  • 마지막의 '.'은 현재 폴더를 나타낸 것 , 현재 폴더의 Dockerfile 실행
docker build --tag yshrim12/myimage:1.0 .

‣ 예제 (2)

# 예제2 (-f) : 다른 파일명의 Dockerfile 빌드하기
$ cp ./Dockerfile ./Dockerfile2
$ docker build --tag myimage2 -f Dockerfile2 ./
$ docker images

‣ 예제 (3)

# 예제3 (--pull)
$ docker build --tag myimage3 -f Dockerfile2 ./ --pull=true

Loading script...