본문 바로가기
Linux

Docker Compose - 오류시 자동 재시작

by 올엠 2024. 2. 29.
반응형

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

 

반응형