[Docker] Dockerfile의 HEALTHCHECK를 이용한 컨테이너 정상 동작 점검(nginx)
다음 도서를 참고하여 작성하였습니다.
www.aladin.co.kr/shop/wproduct.aspx?ItemId=166082298
HEALTHCHECK
Docker에서 컨테이너 안의 프로세스가 정상적으로 작동하고 있는지를 체크하고 싶을 때는 HEALTHCHECK 명령어를 사용합니다.
구문은 다음과 같습니다.
HEALTHCHECK [옵션] CMD 실행할 명령
지정할 수 있는 옵션
옵션 | 설명 | Default |
--interval=n | 헬스 체크 간격 | 30s |
--timeout=n | 헬스 체크 타임아웃 | 30s |
--retries=n | 타임 아웃 횟수 | 3 |
HEALTHCHECK 명령은 Docker에 대해 컨테이너 상태를 어떻게 확인(테스트)할지를 설정합니다.
예를 들어 5분마다 가동 중인 웹 서버의 메인 페이지(http://localhost/)를 3초 안에 표시할 수 있는지를 확인하려면 Dockerfile에 다음과 같이 지정합니다.
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1
HEALTHCHECK의 결과는 docker container inspect 명령으로 확인할 수 있습니다.
NGINX 예시
index.html 파일을 자유롭게 구성한 후 Dockerfile을 다음과 같이 구성합니다.
# Step 1 : Ubuntu (베이스 이미지)
FROM ubuntu:latest
# Step 2 : Nginx 설치
RUN apt-get update && apt-get install -y -q nginx && apt-get install -y curl
# STEP 3 : 파일 복사
COPY index.html /usr/share/nginx/html
# STEP 4 : Health Check (여기서는 10s로 설정)
HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://localhost/ || exit 1
# STEP 5: Nginx 시작
CMD ["nginx", "-g", "daemon off;"]
10초마다 3초만에 웹페이지를 받아올 수 있는지 확인하는 예제 입니다.
위의 Dockerfile을 빌드해줍니다. 이름은 health_test로 하겠습니다.
docker build -t health_test .
바로 Container를 하나 실행합니다. Container 이름 또한 health_test로 하겠습니다.
docker run -it --name health_test health_test
새 터미널에서 docker inspect 명령어를 통해 정상적으로 HEALTHCHECK가 동작하고 있는지 확인해 보겠습니다.
docker inspect health_check
결과
...중략...
"Health": {
"Status": "healthy",
"FailingStreak": 0,
"Log": [
{
"Start": "2021-05-16T16:26:40.311517624+09:00",
"End": "2021-05-16T16:26:40.574055073+09:00",
"ExitCode": 0,
"Output": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 612 100 612 0 0 597k 0 --:--:-- --:--:-- --:--:-- 597k\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n body {\n width: 35em;\n margin: 0 auto;\n font-family: Tahoma, Verdana, Arial, sans-serif;\n }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"
},
{
"Start": "2021-05-16T16:26:50.577665395+09:00",
"End": "2021-05-16T16:26:50.849306719+09:00",
"ExitCode": 0,
"Output": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 612 100 612 0 0 597k 0 --:--:-- --:--:-- --:--:-- 597k\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n body {\n width: 35em;\n margin: 0 auto;\n font-family: Tahoma, Verdana, Arial, sans-serif;\n }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"
},
{
"Start": "2021-05-16T16:27:00.853321455+09:00",
"End": "2021-05-16T16:27:01.117970309+09:00",
"ExitCode": 0,
"Output": " % Total % Received % Xferd Average Speed Time Time Time Current\n Dload Upload Total Spent Left Speed\n\r 0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0\r100 612 100 612 0 0 597k 0 --:--:-- --:--:-- --:--:-- 597k\n<!DOCTYPE html>\n<html>\n<head>\n<title>Welcome to nginx!</title>\n<style>\n body {\n width: 35em;\n margin: 0 auto;\n font-family: Tahoma, Verdana, Arial, sans-serif;\n }\n</style>\n</head>\n<body>\n<h1>Welcome to nginx!</h1>\n<p>If you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.</p>\n\n<p>For online documentation and support please refer to\n<a href=\"http://nginx.org/\">nginx.org</a>.<br/>\nCommercial support is available at\n<a href=\"http://nginx.com/\">nginx.com</a>.</p>\n\n<p><em>Thank you for using nginx.</em></p>\n</body>\n</html>\n"
}
]
}
},
...중략...
"Healthcheck": {
"Test": [
"CMD-SHELL",
"curl -f http://localhost/ || exit 1"
],
"Interval": 10000000000,
"Timeout": 3000000000
},
Health에서는 State가 Healthy이며 FailingStreak가 0(실패 횟수 0)인 것을 볼 수 있네요. 또한 Log에서는 Healthcheck의 로그를 볼 수 있습니다.
Healthcheck 부분에서 Dockerfile에서 등록한 Healthcheck의 구성을 확인할 수 있습니다.
Dockerfile에서 HEALTHCHECK를 이용하여 컨테이너의 상태를 점검하는 방법을 다뤄보았습니다.