Docker는 시스템 재시작 혹은 오류로인해 실행중인 컨테이너가 멈출경우 이를 어떻게 처리할 지 --restart라는 옵션을 이용해서 정의할 수 있다.
--restart를 이용하여 사용할 수 있는 옵션은 다음과 같다.
no: 컨테이너가 자동으로 다시 시작되지 않음
on-failure[:max-retries]: 0이 아닌 종료 코드로 종료되는 경우 컨테이너를 다시 시작하고 Docker 데몬이 컨테이너를 다시 시작할 수 있는 최대 시도 횟수를 진행함
always: 컨테이너가 중지되면 항상 다시 시작
unless-stopped: 컨테이너가 임의로 또는 Docker 데몬에 의해 중지되지 않는 한 항상 컨테이너를 다시 시작
시스템에서 사용하기 적절한 옵션은, on-failure이 유용하다.
on-failure와 unless-stopped 는 비슷하지만, 최대 시도 횟수를 통해 재시도를 시도하도록 하는 on-failure가 보다 안전하게 시스템을 운영하는데 도움을 준다.
사용 방법은 다음과 같다.
docker run --restart on-failure:5 my-service
위와 같이 사용하면, 정상적인 종료가 아닌 경우 5번 컨테이너 재시작을 시도하고 종료하게 된다.
그렇다면 Docker-compose에서는 어떻게 사용할 수 있을까?
Docker-Compose 에서 재시작
Docker-Compose는 docker-compose.yml 구성 파일을 변경해서 진행할 수 있다.
크게 2가지 방식으로 지원하는데, 하나는 restart를 사용하는 방법과 restart-policy를 사용하는 방법이다.
restart
restart는 간편하게 docker-compose.yml에 restart 옵션을 지정하면 된다.
옵션 내용은 앞서 Docker CLI와 동일하게 사용이 가능하므로 쉽게 구성이 가능하다.
아래는 docker-compose.yml 작성 예로, on-failure와 no 옵션을 통해 restart 방식을 지정하였다.
api-server:
container_name: api-server
build:
context: api-server
dockerfile: Dockerfile
image: product-server:latest
networks:
- web-network
restart: on-failure:5
web-server:
container_name: web-server
build:
context: web-server
dockerfile: Dockerfile
image: message-server:latest
ports:
- 80:80
networks:
- web-network
restart: no
restart-policy
restart-policy 옵션에는 다음과 같은 추가적인 세부조정이 가능하다.
다만 이를 사용하기 위해서는 version 속성을 변경하여 Docker Compose v3으로 지정해야 한다.
version: '3'
이후 아래와 같은 옵션을 사용할 수 있수 있으며, deploy 하위에 작성하면 된다.
delay: 재시작 시도 사이의 지속 시간
max_attempts: 다시 시작 기간 이외의 최대 시도 횟수
window: 재시작이 성공했는지 확인하는 기간
docker-compose.yml 작성로 작성한다면, 다음과 같이 api-server를 보다 세부적으로 재시작을 지정할 수 있다.
api-server:
container_name: api-server
build:
context: api-server
dockerfile: Dockerfile
image: product-server:latest
networks:
- web-network
deploy:
restart_policy:
condition: on-failure
delay: 3s
max_attempts: 5
window: 60s
web-server:
container_name: web-server
build:
context: web-server
dockerfile: Dockerfile
image: message-server:latest
ports:
- 80:80
networks:
- web-network
restart: no
'Linux' 카테고리의 다른 글
Docker - 이미지, 컨테이너, 레이어, 가상화 이해 (0) | 2024.03.03 |
---|---|
Syslog - Priority와 Facility 이해 (0) | 2024.03.01 |
Github - 파일 히스토리까지 완전 삭제 하기(reset, revert) (0) | 2024.02.29 |
Docker - M1 no matching manifest for linux/arm64/v8 in the manifest list entries 에러 (0) | 2024.02.29 |
Logrotate 한시간 단위로 로그 생성하는 방법 (0) | 2024.02.29 |