본문 바로가기

About/Docker

[Docker] Dockerfile의 HEALTHCHECK를 이용한 컨테이너 정상 동작 점검(nginx)

다음 도서를 참고하여 작성하였습니다.

www.aladin.co.kr/shop/wproduct.aspx?ItemId=166082298

 

완벽한 IT 인프라 구축을 위한 Docker

컨테이너 기술을 사용한 애플리케이션 실행 환경 플랫폼인 ‘Docker’를 사용하여 인프라를 구축하기 위한 입문서. 제2판에서는 Docker의 새로운 기능 및 명령과 더불어, 멀티호스트 환경에서 실행

www.aladin.co.kr


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를 이용하여 컨테이너의 상태를 점검하는 방법을 다뤄보았습니다.