본문 바로가기
Docker

Dockerfile로 인프라 구성 관리

by worldcenter 2025. 3. 6.

 

Dockerfile 이란?

Docker Image를 생성하기 위한 설정 파일로 다음의 내용을 기입합니다.

  • 베이스가 될 Docker 이미지
  • Docker 컨테이너 안에서 수행한 조작(명령)
  • 환경변수 등의 설정
  • Docker 컨테이너 안에서 작동시켜둘 데몬 실행

 

 

Dockerfile의 명령어

명령 설명
FROM 베이스 이미지 지정
RUN 명령 실행
CMD 컨테이너 실행 명령
LABEL 라벨 설정
EXPOSE 노출할 포트 지정
ENV 환경 변수
ADD 파일/디렉토리 추가
COPY 파일 복사
ENTRYPOINT 컨테이너 실행 명령
VOLUME 볼륨 마운트
USER 사용자 지정
WORKDIR 작업 디렉토리
ARG Dockerfile 안의 변수
ONBUILD 빌드 완료 후 실행되는 명령
STOPSIGNAL 시스템 콜 시그널 설정
HEALTHCHECK 컨테이너의 헬스 체크
SHELL 기본 쉘 설정

 

RUN 명령어

RUN 명령으로 지정한 명령은 Docker 이미지를 생성할 때 실행됩니다. 예를 들어, '애플리케이션/미들웨어를 설치 및 설정하는 경우', '환경 구축을 위한 명령을 실행하는 경우' 사용합니다.

# Shell 형식으로 기술하는 경우
RUN apt-get install -y nginx
# Exec 형식으로 기술하는 경우
RUN ["/bin/bash", "-c", "apt-get install -y nginx"]

 

1. Shell 형식

명령의 지정을 쉘에서 실행하는 형식으로 기술하는 방법으로 Docker 컨테이너 안에서 /bin/sh -c를 사용하여 명령을 실행했을 때와 똑같이 작동합니다. Docker 컨테이너 안에서 실행할 기본 쉘을 변경하고 싶을 때는 SHELL 명령을 사용합니다.

 

2. Exec 형식

Shell 형식으로 명령을 기술하면 /bin/sh에서 실행되지만, Exec 형식으로 기술하면 쉘을 경유하지 않고 직접 실행합니다.

따라서, 명령 인수에 $HOME과 같은 환경변수를 지정할 수 없습니다. Exec 형식에서는 실행하고 싶은 명령을 JSON 배열로 지정합니다.

또한, 다른 쉘을 이용하고 싶을 때는 RUN 명령에 쉘의 경로를 지정한 후 실행하고 싶은 명령을 지정합니다.

 

/bin/sh를 경유하여 명령을 실행하고 싶을 때는 Shell 형식으로 기술하고, 그 외의 경우는 Exec 형식으로 기술하는 것이 좋습니다.

 

 

CMD 명령어

RUN 명령은 이미지를 작성하기 위해 실행하는 명령을 기술하지만, 이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행하려면 CMD 명령을 사용합니다.

Dockerfile에는 하나의 CMD 명령을 기술할 수 있습니다. 만일 여러 개를 지정하면 마지막 명령만 유효합니다.

예를 들어, 웹 서버를 가동시키기 위해 Nginx를 설치하는 명령은 RUN 명령을, 설치한 Nginx를 데몬으로서 컨테이너 안에서 상시 작동시키기 위해서는 CMD 명령을 사용합니다.

# Shell 형식으로 기술하는 경우
CMD nginx -g 'daemon off;'
# Exec 형식으로 기술하는 경우
CMD ["nginx", "-g", "daemon off;"]

 

 

ENTRYPOINT 명령어

이미지를 바탕으로 생성된 컨테이너 안에서 명령을 실행하려면 ENTRYPOINT 명령을 사용합니다.

ENTRYPOINT 명령과 CMD 명령의 차이는 CMD 명령의 경우 컨테이너 시작 시에 실행하고 싶은 명령을 정의해도 'docker container run' 명령 실행 시에 인수로 새로운 명령을 지정한 경우 이것을 우선 실행합니다.

ENTRYPOINT 명령에서 지정한 명령은 반드시 컨테이너에서 실행되는데, 실행 시에 명령 인수를 지정하고 싶을 때는 CMD 명령과 조합하여 사용합니다.

ENTRYPOINT 명령으로는 실행하고 싶은 명령 자체를 지정하고 CMD 명령으로는 그 명령의 인수를 지정하면, 컨테이너를 실행했을 때의 기본 작동을 결정할 수 있습니다.

# Dockerfile
FROM ubuntu:16.04
ENTRYPOINT ["top"]
CMD ["-d", "10"]
# CMD 명령에서 지정한 10초 간격으로 갱신하는 경우
docker run -it ubuntu
# 2초 간격으로 갱신하는 경우
docker run -it ubuntu -d 2

 

 

ONBUILD 명령어

ONBUILD 명령은 그 다음 빌드에서 실행할 명령을 이미지 안에 설정하기 위한 명령입니다.

예를 들어, Dockerfile에 ONBUILD 명령을 사용하여 어떤 명령을 실행하도록 설정하여 빌드하고 이미지를 작성합니다. 그리고 그 이미지를 다른 Dockerfile에서 베이스 이미지로 설정하여 빌드했을 때 ONBUILD 명령에서 지정한 명령을 실행시킬 수 있습니다.

# Dockerfile
FROM ubuntu:17.10
ONBUILD ADD site.tar /var/www/html/

 

해당 Dockerfile로 base 이미지를 만들고 다른 Dockerfile을 빌드하면 자동적으로 ADD 명령어가 빌드하는 과정에서 실행됩니다.

# Dockerfile
FROM baseimage

 

이미지에 ONBUILD 명령이 설정되어 있는지 아닌지는 docker image inspect 명령으로 확인할 수 있습니다.

 

 

HEALTHCHECK 명령어

컨테이너 안의 프로세스가 정상적으로 작동하고 있는지를 체크하고 싶을 때는 HEALTHCHECK 명령을 사용합니다.

HEALTHCHECK [옵션] CMD 실행할 명령
옵션 설명 기본값
--interval=n 헬스 체크 간격 30s
--timeout=n 헬스 체크 타임아웃 30s
--retries=n 타임아웃 횟수 3
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1

 

 

ENV 명령어

Dockerfile 안에서 환경변수를 설정하고 싶을 때는 ENV 명령을 사용합니다.

ENV [key] [value]
ENV [key]=[value]

 

1. key value 형으로 지정하는 경우

단일 환경변수에 하나의 값을 설정합니다. 첫 번째 공백 앞을 key로 설정하면 그 이후는 모두 문자열로서 취급합니다.

공백이나 따옴표와 같은 문자를 포함한 것도 문자로 취급합니다.

ENV myName "Shiho ASA"
ENV myOrder Gin Whisky Calvados
ENV myNickName miya

 

2. key=value로 지정하는 경우

ENV myName="Shiho ASA" \
    myOrder=Gin\ Whisky\ Calvados \
    myNickName=miya

 

ENV 명령으로 지정한 환경변수는 컨테이너 실행 시의 docker container run 명령의 --env 옵션을 사용하면 변경할 수 있습니다.

 

 

ARG 명령어

Dockerfile 안에서 사용할 변수를 정의할 때는 ARG 명령을 사용합니다. 환경변수인 ENV와는 달리 이 변수는 Dockerfile 안에서만 사용할 수 있습니다.

ARG YOURNAME="nuri"
RUN echo $YOURNAME

 

이 Dockerfile을 빌드할 때 --build-arg 옵션을 붙여 ARG 명령에서 지정한 'YOURNAME'에 'honggildong' 라는 값을 설정하고 명령을 실행하면 ARG 명령을 overwrite 하게 됩니다.

 

 

WORKDIR 명령어

WORKDIR 명령은 Dockerfile에 쓰여있는 다음과 같은 명령을 실행하기 위한 작업용 디렉토리를 지정합니다.

  • RUN
  • CMD
  • ENTRYPOINT
  • COPY
  • ADD

만일 지정한 디렉토리가 존재하지 않으면 새로 작성합니다. 또한 WORKDIR 명령은 Dockerfile 안에서 여러 번 사용할 수 있습니다.

 

 

USER 명령어

이미지 실행이나 Dockerfile의 다음과 같은 명령을 실행하기 위한 사용자를 지정할 때는 USER 명령을 사용합니다.

  • RUN
  • CMD
  • ENTRYPOINT

USER 명령에서 지정하는 사용자는 RUN 명령으로 미리 작성해 놓을 필요가 있습니다.

RUN ["adduser", "nuri"]
USER nuri

 

 

LABEL 명령어

이미지에 버전 정보나 작성자 정보, 코멘트 등과 같은 정보를 제공할 때는 LABEL 명령어를 사용합니다.

LABEL maintainer="nuri" \
      title="WebAP" \
      version="1.0" \
      description="This image is WebApplicationServer"

 

 

EXPOSE 명령어

컨테이너 공개 포트 번호를 지정할 때는 EXPOSE 명령어를 사용합니다.

 

 

SHELL 명령어

쉘 형식으로 명령을 실행할 때 기본 쉘을 설정하려면 SHELL 명령을 사용합니다.

SHELL ["/bin/bash", "-c"]
RUN echo hello

 

SHELL 명령을 지정하면 그 쉘은 그 이후에 Dockerfile 안에서 Shell 형식으로 지정한 RUN 명령이나 CMD 명령, ENTRYPOINT 명령에서 유효해 집니다.

 

 

ADD 명령어

ADD 명령은 호스트상의 파일이나 디렉토리, 원격 파일을 Docker 이미지 안으로 복사합니다.

# hos 로 시작하는 모든 파일을 추가
ADD hos* /docker_dir/

# hos+임의의 한 문자 룰에 해당하는 파일을 추가
ADD hos?.txt /dockeer_dir/

 

이미지에 추가하고 싶은 파일이 원격 파일 URL인 경우, 추가한 파일은 퍼미션이 600이 됩니다. 

또한, ADD 명령은 인증을 지원하지 않기 때문에 원격 파일의 다운로드에 인증이 필요한 경우는 RUN 명령에서 wget 명령이나 curl 명령을 사용합니다.

호스트의 파일이 tar 아카이브거나 압축 포맷(gzip, bzip2 등) 일 때는 디렉토리로 압축을 풉니다. 단, 원격 URL로부터 다운로드한 리소스는 압축이 풀리지 않으므로 주의해야 합니다.

 

 

COPY 명령어

ADD 명령은 원격 파일의 다운로드나 아카이브의 압축 해제 등과 같은 기능을 갖고 있지만, COPY 명령은 호스트 상의 파일을 이미지 안으로 '복사하는' 처리만 합니다.

 

 

VOLUME 명령어

이미지에 볼륨을 할당하는 명령어 입니다.

VOLUME ["/var/log"]

 

'Docker' 카테고리의 다른 글

Docker Compose 로 여러 컨테이너 운용 관리  (0) 2025.03.06
Docker 명령어 정리  (0) 2025.03.03