2022이전/Docker&Kubernetes

[명령어] Dockerfile 작성

바로퇴장 2020. 6. 12. 11:46

Dockerfile을 이용하여 베이스 이미지를 지정한 뒤 , 필요한 미들웨어 설치 및 명령어 추가 등을 통해 원하는 형태의 이미지를 작성하는 방법

 

  • Dockerfile 내에서 사용하는 주석은 "#"을 사용한다.

Dockerfile의 예시

FROM ubuntu:14.04
MAINTAINER Foo Bar <foo@bar.com>

RUN apt-get update
RUN apt-get install -y nginx
RUN echo "\ndaemon off;" >> /etc/nginx/nginx.conf

VOLUME ["/data", "/etc/nginx/site-enabled", "/var/log/nginx"]

WORKDIR /etc/nginx

CMD ["nginx"]

EXPOSE 80
EXPOSE 443

Dockerfile 파일 이용하여 이미지 만들기

$ docker build -t [생성할 이미지명]:[태그명] [도커파일의 위치]

  • -f : 옵션을 사용하여 파일명을 직접 지정해 줄수 있다.

예시 > docker build -t rapa/newnginx:1.0 .

Dockerfile 명령어와 데몬

명령실행(RUN)

컨테이너에는 FROM 명령에서 지정한 베이스 이미지에 대해 애플리케이션/미들웨어 등을 설치하거나 환경 구축으 위한 명령을 실행하기 위하여 RUN을 사용한다.

Dockerfile에서 RUN 은 Shell 형식과 Exec 형식으로 명령을 작성할 수 있다.

  • Shell 형식으로 작성

    #Installing Nginx
    RUN apt-get -y install nginx
  • Exec 형식으로 작성

    #Installing Nginx
    RUN ["bin/bash", "-c", "apt-get -y install nginx"]

Shell 형식으로 명령을 기술하면 /bin/sh에서 실행되지만 Exec 형식으로 기술하면 쉘을 경유하지 않고 직접 실행한다. 따라서 $HOME 과 같은 환경 변수를 지정할 수 없게 된다.

데몬실행(CMD)

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

Dockerfile 내에서 CMD는 한번만 기술할 수 있으며 만약 여러번 기술 되었다면 마지막 CMD 만 유요하기 된다.

  • Shell 형식으로 기술

    CMD nginx -g 'daemon off;'
  • Exec 형식으로 기술

    CMD ["nginx", "-g", "daemon off;"]

데몬실행(ENTRYPOINT)

docker run으로 생성하거나, docker start로 중지된 container를 시작할 때 실행되는 명령어 Dockerfile 내에서 1번만 정의 가능하다. CMD와 다르게 docker run으로 실행시 command를 입력하면, ENTRYPOINT의 파라미터로 인식한다.

  • Shell 형식으로 기술

    ENTRYPOINT nginx -g 'daemon off;'
  • Exec 형식으로 기술

    ENTRYPOINT ["nginx", "-g", "daemon off;"]
  • 파라미터로 입력

    docker run <image_name> echo world
      "echo world"를 파라미터로 인식함

CMD vs ENTRYPOINT

두 명령어의 제일 큰 차이점은 바로 컨테이너 시작시 실행 명령에 대한 Default 지정 여부 이다.

  1. 컨테이너가 수행될 때 변경되지 않을 실행 명령은 CMD 보다는 ENTRYPOINT 로 정의하는게 좋다.
  2. 메인 명령어가 실행시 default option 인자 값은 CMD로 정의해 주는게 좋다

빌드 완료 후에 실행되는 (ONBUILD)

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

ONBUILD ADD website.tar /var/www/html

컨테이너의 헬스 체크(HEALTHCHECK)

컨테이너 안의 프로세스가 정상적으로 작동하고 있는지를 체크하고 싶을 때에 사용한돠.

 

환경변수 설정(ENV)

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

  • ENV [key] [value] 형식(각 줄에 기술)

    ENV MYNAME "HEEYUNG"
  • ENV [key]=[value] 형식(한 줄로 기술)

    ENV MYNAME="heeyung" \ MYADD="SONG-PA"
    

작업디렉토리 지정(WORKDIR)

WORKDIR /first
WORKDIR second
RUN ["pwd"]        ==>        /first/secnod

사용자 지정(USER)

RUN ["adduser", "test"]        ==> root 계정 실행
USER test                    
RUN ["whoami"]                ==> test 계정

포트설정(EXPOSE)

EXPOSE 8080  ==> 8080포트 허용

파일 및 디렉토리 추가(ADD)

ADD [파일경로] [도커파일경로]

볼륨 마운트(VOLUME)

VOLUME /var/log /var/db