계기
컨테이너를 구동하였을 때,
해당 컨테이너가 정상적으로 올라간 것으로 보였지만 로그를 확인하거나 exec 명령어로 컨테이너 내부에 접근하고자 했을 때 문제가 발생하고 있는 것을 확인한 적이 여러번 있었다.
때문에 컨테이너의 정상 여부(Health) 를 주기적으로 체크하며 모니터링 할 필요가 있다.
healthcheck 옵션
- docker compose 설정
- healthcheck 라는 설정을 함으로써 가능하다.
- test: 헬스체크 시도 시에 실행할 동작을 정의한다. 단순 curl/wget 으로 요청을 날려볼 수 있고, CLI를 넣을 수도 있으며, 함수를 실행시킬 수도 있다.
- interval: 말 그대로 체크 실행 주기를 의미한다.
- timeout: 실행된 헬스체크 동작에 대한 리턴을 기다리는 시간(timeout)을 의미한다.
- retries: 타임아웃이 걸려 체크 실패 시 재시도 횟수를 의미한다. 재시도까지 전부 실패하면 unhealthy 상태가 된다.
- start_period: 컨테이너 구동을 기준으로, 헬스체크를 시작할 때까지의 시간을 의미한다. 처음 구동 시, 초기 세팅에 시간이 많이 걸리는 경우가 있기 때문
- 상태값
- 0 : healthy. 즉 건강한 상태이다.
- 1 혹은 다른 숫자: unhealthy. 비정상적인 문제가 발생하고 있다.
- healthcheck 라는 설정을 함으로써 가능하다.
services:
app:
expose:
- ${APP_PORT}
healthcheck:
// 헬스체크를 위해 실행할 함수
test: curl --fail http://localhost:5000/ || exit 1
// REDIS 체크의 경우
test: [ "CMD", "redis-cli", "--raw", "incr", "ping" ]
// 체크 실행 주기
interval: 40s
// 타임아웃
timeout: 30s
retries: 3
// 컨테이너 구동 후 체크 시작할 시점
start_period: 60s
DockerFile 설정
- 도커 파일 설정은 Dockerfile의 이미지 빌드 과정에 입력된다.
- 이외 헬스 체크 주기 등의 옵션은 컨테이너 구동 시 입력한다.
FROM asdcasdcas # ... 빌드 내용 # 컨테이너에서 구동하는 어플리케이션의 /health 엔드포인트에 요청을 날리는 것이 헬스체크 방식이다. HEALTHCHECK CMD curl --fail http://localhost/health
docker container run -d -p 8080:80 --health-interval 5s app_image/stable/latest
결과
- 헬스체크가 완료되면 아래처럼 보이게 된다.
주기 설정에 관하여
- healthcheck 는 어찌 되었건 cpu 등 서버 리소스를 사용하기 때문에 적당한 주기(interval)로 실행시켜야 한다.
- 또한 실제로 헬스체크 동작을 실행시켰을 때 받아올 수 있는 정도의 주기로 실행해야 한다.
- 만약 헬스체크 대상 어플리케이션의 특정 함수 동작 주기가 1분인데, 10초마다 헬스체크를 한다면, 이는 자원 낭비일 것이다.
'데브옵스 devOps > Docker' 카테고리의 다른 글
[DOCKER] 도커 port / expose 에 대해 (1) | 2024.10.21 |
---|---|
[DOCKER] 도커 네트워크에 관하여 (0) | 2024.10.18 |
[Docker] 도커 및 도커 컴포즈 설치 (0) | 2024.09.25 |
[Docker] 도커란? (1) | 2024.09.25 |
[Docker] Private 도커 허브와 크레덴셜 (7) | 2024.09.24 |