1편 (RUN, CMD, ENTRYPOINT) : https://nirsa.tistory.com/66?category=868315
3편 (COPY, ADD, ENV, ARG, WORKDIR) : https://nirsa.tistory.com/69?category=868315
4편 (USER, LABEL, EXPOSE, VOLUME) : https://nirsa.tistory.com/70?category=868315
-
4. ONBUILD
ONBULD는 조금 특이하게 처음 사용한 Dockerfeil 에서 빌드할 때(이미지 생성) 실행되는 명령이 아닙니다.
ONBUILD 명령을 사용했던 이미지를, 다른 Dockerfile에서 FROM image를 사용하여 빌드 했을 때 동작 합니다.
일반적으로 사용하는 명령은 아니지만 웹서버를 구동시키기 위한 이미지를 만들어두고 ONBUILD ADD web.tar /var/www/html 과 같이 미리 정의 해둔 뒤, 개발자들이 해당 경로에 웹서버에 필요한 코드들을 해당 경로에 web.tar을 만들어서 빌드 후 실행시키는 등에 사용한다고 합니다.
-
5. STOPSIGNAL
docker container stop 명령을 입력하면 Docker 데몬이 컨테이너에게 signal을 보내 중지 하는데, 기본적으로 STOPSIGNAL을 명시하지 않을 경우 SIGTERM을 사용 하게 됩니다.
즉 container stop 할 때에 보낼 시그널을 지정할 수 있습니다.
STOPSIGNAL [시그널] ## 시그널 번호 또는 이름
docker container stop 실행 시 SIGTERM signal을 받은 컨테이너가 프로세스를 정상적으로 종료할 수 있을때 까지 기다리게 되는데, 지정된 시간 (deafult 10sec, 사용자 지정 가능)동안 종료가 되지 않으면 SIGKILL을 전송합니다.
참고 사이트 : https://stackoverflow.com/questions/50898134/what-does-docker-stopsignal-do
일반적으로 많이 사용하지는 않지만, 현재 github 에서는 nginx를 사용해 유닉스 소켓을 사용하면 container stop 시 Docker 데몬이 컨테이너에게 SIGTERM signal을 보내 nginx가 중단되고 모든 연결이 한번에 끊어지는 현상이 발생하여 비정상적인 종료가 된다고 합니다.
때문에 STOPSIGNAL SIGQUIT 을 사용하는게 옳다고 하기도 하며, gibhub에서 꾸준히 사람들이 토론중인걸로 보입니다.
참고 사이트 : https://github.com/Kong/docker-kong/pull/259 , https://github.com/nginxinc/docker-nginx/issues/377 , https://github.com/nginxinc/docker-nginx/issues/167
-
6. HEALTHCHECK
컨테이너의 HEALTHCHECK를 사용하여 컨테이너의 프로세스 상태를 체크할 수 있고, 두가지 사용 방법이 있습니다.
- HEALTHCHECK [OPTIONS] CMD command (컨테이너 내부에서 명령 실행하여 컨테이너 상태 확인, 이 방법을 통해 웹페이지 등을 확인할 수 있습니다)
- HEALTHCHECK NONE (베이스 이미지에서 상속된 상태 확인을 비활성화)
또한 Dockerfile에서 HEALTHCHECK는 하나의 명령만이 유효하고, 만약 여러개가 있다면 가장 마지막에 선언된 HEALTHCHECK가 적용 됩니다.
옵션 | 설명 | 기본값 |
--interval=DURATION | 헬스 체크 간격 | 30s |
--timeout=DURATION | 타임 아웃 | 30s |
--retries=N | 타임 아웃 횟수 | 3 |
HEALTHCHECK의 처음 상태는 starting 이고, HEALTHCHECK가 통과될 때 마다 healthy (이전 상태와 상관없이) 됩니다. 그리고 옵션에 정한 일정 횟수가 실패된다면 unhealthy 상태로 됩니다.
EXIT CODE | 설명 |
0: success | 컨테이너가 정상적이고 사용 가능한 상태 |
1: unhealthy | 컨테이너가 올바르게 작동하지 않는 상태 |
2: starting | 예약된 코드 |
이 상태는 docker container inspect [컨테이너명] 또는 docker container ls 에서 확인할 수 있습니다.
HEALTHCHECK를 확인해보기 위해 아래 코드를 Dockerfile에 넣은 후 centos7 버전에 nginx를 설치하고 컨테이너를 실행 해주세요.
FROM centos:7
RUN touch /etc/yum.repos.d/nginx.repo && echo -e '[nginx]\nname=nage repo\nbaseurl=http://nginx.org/packages/centos/7/$basearch/\ngpgcheck=0\nenabled=1' > /etc/yum.repos.d/nginx.repo
RUN yum -y install nginx curl
HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://127.0.0.1/ || exit 1
CMD ["nginx", "-g", "daemon off;"]
- 옵션 설명 : 10초마다(interval) HEALTHCHECK를 하고, 3초 이상이 소요(timout)되면서 3번의 재시도(retries, 초기값3)가 실패하면 unhealthy 상태로 변경됨
HEALTHCHECK는 컨테이너까지 실행 후 docker container inspect [컨테이너명] 으로 아래와 같이 확인이 가능하지만, 이러한 데이터들은 영구적으로 남는게 아니라 4096byte만 현재 상태에 저장된다고 합니다.