본문 바로가기

Docker

Dockerfile에 대해서 알아보자

Dockerfile 이란

  • Docker Image를 만드는 스크립트이다.
  • Docker Hub에서 미리 만들어져있는 Image를 사용하는 것이 아니라 사용자가 직접 Custom 하여 Image를 만들 수 있는 파일

 

Dockerfile 명령어

FROM

  • 생성할 이미지의 베이스가 되는 이미지
  • ex) Ubuntu, CentOS, JDK, Node.js

WORKDIR

  • 컨테이너 내에서 작업할 디렉토리 설정

COPY

  • host에서 이미지에 파일 복사하여 추가

ADD

  • host안에 있는 파일/디렉토리 추가
  • copy와 다른 점은 압축파일은 해제하여 추가해준다

EXPOSE

  • host와 연결할 포트 번호를 설정
  • 컨테이너 실행 시 -p 로 대체 가능

ENV

  • 환경변수 설정

RUN

  • 컨테이너 내부에서 돌아갈 명령어 이미지가 생성 되기 전에 실행 되는 명령어

CMD & ENTRYPOINT

  • 컨테이너가 실행되었을 때 바로 실행되는 명령어 설정
  • 차이점 : CMD는 추가 인자로 명령어를 덮어쓸 수 있지만, ENTRYPOINT는 추가 인자로 덮어쓸 수 없다.
// CMD
FROM ubuntu
CMD ["echo", "Hello, World!"]

docker run my-image echo "Goodbye, World!"

결과 : 'Goodbye, World!'

// ENTRYPOINT
FROM ubuntu
ENTRYPOINT ["echo", "Hello,"]
CMD ["World!"]

docker run my-image "Extra, arguments"

결과 : 'echo Hello, Extra, arguments, World!'
  • ENTRYPOINT : 항상 실행해야 하는 명령을 해야할 경우
  • CMD : 도커 컨테이너가 실행될 때 인자값을 지정하거나 기본 명령어 인자를 설정할 경우

 

VOLUME

  • host 주소와 mount
  • 도커 컨테이너에서 만든 데이터 저장소 영역, 설정 파일 및 폴더 등을 host로 노출해야할 경우 사용

 

Dockerfile 작성 예시

  • 해당 예시는 Ubuntu 베이스 이미지에 JDK를 설치하는 예시
# 베이스 이미지 명시
# FROM {baseImage}:{version}
From ubuntu:20.04

# JDK 설치
RUN apt-get update && \\
    apt-get install -y openjdk-11-jdk && \\
    apt-get clean && \\
    rm -rf /var/lib/apt/lists/*

# 환경 변수 설정 (선택 사항)
# ENV {환경 변수명}={변수}
ENV URL = 192.168.10.111

# 기본 작업 디렉토리 설정 (선택 사항)
WORKDIR /app

# 컨테이너가 시작될 때 실행할 명령을 지정 (선택 사항)
CMD ["bash"]

 

Dockerfile 빌드

# Dockerfile 빌드하기
$ docker build -t {이미지명} {작성한 경로}

# 해당 디렉토리에서 실행하고 이름이 dockerfile 인 경우
$ docker build -t {이미지명} .

# dockerfile로 빌드 후 실행
docker run --name {컨테이너명} 이미지명 [ARG..]