Container 상태는 Run 상태인데 실제 내부적인 문제로 인해 Container가 정상적으로 동작하지 않는 경우가 있다. 이런 경우 Dockerfile을 이용하여 컨테이너 이미지를 빌드할 때 HEALTHCHECK 인스트럭션을 사용하여 컨테이너의 상태를 확인할 수 있습니다. 

 

HEALTHCHECK 작성 형식

HEALTHCHECK [option] CMD 명령어
  • --interval : 헬스 체크 간격을 지정합니다. default 30s
  • --timeout : 명령어의 타임아웃을 설정합니다. default 30s
  • --start-period : 컨테이너가 실행되고 헬스 체크를 시작하기까지 대기하는 시간을 지정합니다. default 0s
  • --retries : 헬스 체크 명령어 실행 실패 시 재시도 횟수를 지정합니다. default 3

 

HEALTHCHECK 예시

FROM nginx:latest
HEALTHCHECK --interval=10s --timeout=3s CMD curl -f http://localhost/ || exit 1

curl -f http://localhost/ 명령어를 통하여 10초 간격으로 3초 이내의 결과가 나타나지 않고 3번 이상 실패 시 unhealthy 하다고 판단합니다. 상태를 확인하는 방법은 "docker ps -a"를 통해 해당 컨테이너의 상태를 확인할 수 있지만 "docker inspect 컨테이너아이디"를 통하여 보다 자세한 상태를 확인할 수 있습니다. 아래는 docker inspect 명령어를 통해 확인한 결과입니다.

(생략...)
	"State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 32813,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2023-07-06T12:18:15.929466969Z",
            "FinishedAt": "0001-01-01T00:00:00Z",
            "Health": {
                "Status": "healthy",
                "FailingStreak": 0,
                "Log": [
                    {
                        "Start": "2023-07-06T12:18:45.930156552Z",
                        "End": "2023-07-06T12:18:46.006446885Z",
                        "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   615  100   615    0     0   637k      0 --:--:-- --:--:-- --:--:--  600k\n\u003c!DOCTYPE html\u003e\n\u003chtml\u003e\n\u003chead\u003e\n\u003ctitle\u003eWelcome to nginx!\u003c/title\u003e\n\u003cstyle\u003e\nhtml { color-scheme: light dark; }\nbody { width: 35em; margin: 0 auto;\nfont-family: Tahoma, Verdana, Arial, sans-serif; }\n\u003c/style\u003e\n\u003c/head\u003e\n\u003cbody\u003e\n\u003ch1\u003eWelcome to nginx!\u003c/h1\u003e\n\u003cp\u003eIf you see this page, the nginx web server is successfully installed and\nworking. Further configuration is required.\u003c/p\u003e\n\n\u003cp\u003eFor online documentation and support please refer to\n\u003ca href=\"http://nginx.org/\"\u003enginx.org\u003c/a\u003e.\u003cbr/\u003e\nCommercial support is available at\n\u003ca href=\"http://nginx.com/\"\u003enginx.com\u003c/a\u003e.\u003c/p\u003e\n\n\u003cp\u003e\u003cem\u003eThank you for using nginx.\u003c/em\u003e\u003c/p\u003e\n\u003c/body\u003e\n\u003c/html\u003e\n"
                    }
                ]
            }
        },
(생략...)
	"Healthcheck": {
                "Test": [
                    "CMD-SHELL",
                    "curl -f http://localhost/ || exit 1"
                ],
                "Interval": 30000000000,
                "Timeout": 3000000000
            },
(생략...)

 

HEALTHCHECK의 상태 값

healthcheck의 상태 값은 3가지 종류로 나뉩니다.

  • starting : 컨테이너가 시작되고 --start-period로 정의된 대기 시간이 경과하기 전의 초기 상태입니다. 이 시간 동안 HEALTHCHECK가 수행되지 않으며, 컨테이너는 자동으로 healthy 상태로 표시됩니다.
  • healthy : HEALTHCHECK 명령이 성공적으로 실행되고 정상적인 상태를 반환한 경우입니다. 컨테이너가 정상적으로 작동하고 있다는 의미입니다.
  • unhealthy : HEALTHCHECK 명령이 실패하거나 비정상적인 상태를 반환한 경우입니다. 이는 컨테이너가 문제가 있거나 제대로 작동하지 않고 있다는 의미입니다.

healthcheck를 통하여 컨테이너의 상태를 표시할 뿐 도커는 컨테이너가 unhealthy 상태여도 컨테이너를 자동으로 재시작하는 기능을 수행하지 않습니다. 그 이유는 컨테이너를 재시작할 경우 애플레케이션이 일시적으로 드랍되면서 서비스에 문제가 발생할 수 있기 때문입니다. 도커의 입장에서 애플리케이션의 드랍으로 더 큰 문제가 발생될 수 있기 때문에 사용자에게 상태만 보고할 뿐 재시작을 수행하지 않습니다.

'Docker' 카테고리의 다른 글

Docker resource 설정  (0) 2023.07.27
Docker Volume & BindMount  (0) 2023.07.25

+ Recent posts