[명령어] Dockerfile 작성
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 지정 여부 이다.
- 컨테이너가 수행될 때 변경되지 않을 실행 명령은 CMD 보다는 ENTRYPOINT 로 정의하는게 좋다.
- 메인 명령어가 실행시 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