[Dockerfile] Dockerfile 알아보기

▶︎ 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 example/nginx .

‣ 주요 옵션

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

▶︎ 이미지 빌드 실습

‣ 예제 (1)

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

관련 글

지식 공유2분 읽기

[Docker] 컨테이너(Container)에 할당되는 CPU 제한하기

개요 이번 게시글에서는 도커 컨테이너에서 CPU를 최적으로 활용하는 방법에 대해서 기록해보려고 한다. 호스트 CPU Core 정보 확인 먼저 컨테이너에 CPU를 최적으로 할당하기 위해서는, 현재 호스트 시스템의 CPU 정보에 대해서...

도커
지식 공유1분 읽기

[Docker] 배그 최고급 꾸러기 시뮬레이터 배포

개요 최고급 꾸러미에 대한 확률 체감을 위한 시뮬레이터 프로그램을 구현하고 도커로 배포하였음. 배포 로직은 AWS EC2 인스턴스에 도커를 사용하여 nginx proxy manager를 배포하고 리버스 프록시로 홈 서버에 있는 시뮬레...

도커