만쥬의 개발일기

도커파일은 도커로 이미지를 생성하기 위한 용도로 작성하는 스크립트 파일이다.
도커 이미지를 빌드할 때는 전적으로 도커 파일에 의존해 빌드를 실시한다.

도커 스크립트는 크게 어렵지 않지만 헷갈리는 것들이 있어 한 번 정리해두면 좋다.

예시로 알아보는 명령어들

도커파일 예시와 함께 각 명령어 사용법을 알아보자.

# 베이스 이미지로부터 시작
FROM python:3.9-slim

# 작업 디렉토리 설정
WORKDIR /app

# 환경 변수 설정
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0

# 라벨 설정
LABEL maintainer="example@example.com"
LABEL version="1.0"
LABEL description="This is a sample Dockerfile."

# 로컬 파일을 이미지로 복사
COPY . /app

# 필요한 의존성 설치
RUN pip install --no-cache-dir -r /app/requirements.txt

# 포트 80을 외부에 노출
EXPOSE 80

# 볼륨 마운트 지정
VOLUME /app/data

# 컨테이너가 시작될 때 실행할 명령어
ENTRYPOINT ["flask", "run"]

CMD ["test"]
  • From
    • 도커파일에서 베이스 이미지를 지정하는 지시어다.
    • 이미지와 태그를 지정하면 registry에서 해당 이미지를 자동으로 pull 한다.
  • Workdir
    • 작업 디렉토리를 설정한다.
    • 컨테이너의 해당 디렉토리에서 작업을 실시한다.
  • Env
    • 환경변수를 설정하는 지시어다.
    • key-value 형식으로 환경변수명과 값을 저장한다.
  • Label
    • 라벨은 환경변수가 아닌 메타데이터를 이미지에 추가한다.
    • 이미지 내에 있는 메타데이터를 추후 명령어를 통해 확인해 이미지에 대한 상세 정보를 얻을 수 있다.
  • COPY
    • Host 내에 있는 파일 또는 디렉토리를 컨테이너로 복사한다.
    • --chown 옵션으로 소유 권한도 지정할 수 있다.
  • Run
    • 커맨드를 실행하여 새 이미지에 포함시키는 역할을 한다.
    • 주로 컨테이너에 필요한 소프트웨어나 라이브러리를 설치할 때 사용한다.
    • 특정 위치에 파일이나 디렉토리를 생성하기 위해서도 사용한다.
  • Expose
    • 컨테이너가 실행될 때 컨테이너로 들어오는 트래픽을 특정 포트로 받아들일 수 있도록 지정해준다.
    • 그러나 expose를 명시해도 외부에 공개되는 것이 아니고, docker run -p <host port>:<ct port> 옵션으로 포트를 명시해주어야 호스트 운영체제로 오픈된다.
    • 혹은 expose로 명시 후 -P 옵션을 주면 호스트의 랜덤 포트가 컨테이너의 포트에 매핑된다.
  • Volume
    • Volume은 컨테이너 내의 특정 디렉토리를 컨테이너 외부 경로에 마운트 시켜주는 지시자이다.
    • 컨테이너 내의 디렉토리만 지정해주면, host의 어떤 폴더에 마운트되는지는 알 수 없다.
    • 마운트 지점은 docker volume inspect 명령어로 확인 가능하다.
  • Entrypoint
    • 컨테이너 실행 시 입력 될 command를 지정한다.
    • 컨테이너 실행 시 param 값을 대체할 수 없다.
  • Cmd
    • 컨테이너 실행 시 입력 될 command를 지정한다.
    • 한 도커 파일 내에 여러번 나올 경우 맨 마지막 줄의 CMD만 유효하다.
    • 컨테이너 실행 시 값을 대체할 수 있어 default 값으로 주로 사용한다.

 

자세한 예시

RUN

# shell form
RUN /bin/bash -c 'echo hello'

# exec form
RUN ["/bin/bash", "-c", "echo hello"]

Run을 사용할 때는 위와 같이 shell form, exec form 두 가지 형태로 사용 가능하다.

ENTRYPOINT vs CMD

앞서 말한 것처럼 Entrypoint는 대체 불가이고 Cmd는 대체 가능하다.

FROM ubuntu
ENTRYPOINT ["/bin/echo", "Hello"]
CMD ["world"]

위 도커파일을 그대로 실행하면, Hello world가 출력된다.

그러나 param값을 다음과 같이 지정해서 실행하면, CMD값이 대체된다.

 

 

reference

profile

만쥬의 개발일기

@KangManJoo

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!