Docker 재시작 정책: restart 완전 정복

Docker restart 정책 4가지(no·on-failure·always·unless-stopped) 동작 차이, exponential backoff 재시도 간격, Compose 선언법, docker update 활용을 정리합니다.

· 5 min read · PALDYN Team

지난 글에서 Compose 서비스 상태 조회 방법을 살펴봤다. 이번에는 컨테이너가 종료되거나 크래시가 났을 때 Docker가 어떻게 재시작하는지 제어하는 restart 정책을 정리한다.

restart 정책 4가지

Docker에는 4가지 재시작 정책이 있다. 기본값은 no다.

docker run -d --restart <policy> my-image

no — 컨테이너가 어떤 이유로 종료되든 재시작하지 않는다. 기본값이며 개발 환경이나 일회성 작업에 적합하다.

on-failure[:max-retries] — exit code가 0이 아닐 때만 재시작한다. 정상 종료(exit 0)는 재시작하지 않는다. :5처럼 최대 재시도 횟수를 지정할 수 있다.

always — 종료 이유에 상관없이 항상 재시작한다. docker stop으로 수동으로 멈춰도 Docker daemon이 재시작될 때 다시 시작된다.

unless-stopped — 수동으로 정지하지 않는 한 항상 재시작한다. docker stop으로 명시적으로 멈춘 컨테이너는 daemon 재시작 후에도 다시 시작되지 않는다.

restart 정책 다이어그램

always vs unless-stopped 차이

가장 혼동되는 부분이다. 차이는 수동 stop 이후 daemon이 재시작될 때 동작이다.

docker stop mycontainer
systemctl restart docker   # daemon 재시작
  • always: daemon 재시작 후 컨테이너가 다시 시작된다.
  • unless-stopped: daemon 재시작 후 컨테이너가 시작되지 않는다 (마지막 상태가 stopped였으므로).

서버 부팅 시 자동으로 서비스를 시작해야 하는 프로덕션 환경에서는 unless-stopped가 더 자연스럽다. 수동으로 멈춘 것은 의도적인 행위이므로 재시작하지 않는 것이 맞다.

on-failure — exponential backoff

on-failure로 재시작할 때 Docker는 재시도 간격을 점점 늘린다. 첫 번째는 즉시, 이후 1s, 2s, 4s, …, 최대 약 120s 간격으로 재시도한다.

docker run -d --restart on-failure:5 my-app

5회 실패 후에는 더 이상 재시작하지 않는다. 이후 docker start <container>로 수동 재시작할 수 있다.

재시도 횟수 제한 없이 계속 시도하려면 숫자를 빼면 된다.

docker run -d --restart on-failure my-app

Compose에서 선언

services:
  web:
    image: nginx
    restart: unless-stopped

  worker:
    image: my-worker
    restart: on-failure      # 무제한 재시도

  migrate:
    image: my-app
    command: python manage.py migrate
    restart: "no"            # 일회성 — 재시작 안 함

restart: "no"는 YAML에서 no가 boolean false로 해석되므로 반드시 따옴표로 감싸야 한다. Compose v2에서는 자동으로 처리하지만 명시하는 것이 안전하다.

restart 정책 코드 예시

실행 중 정책 변경

컨테이너를 재생성하지 않고도 restart 정책을 바꿀 수 있다.

docker update --restart unless-stopped mycontainer
docker update --restart no mycontainer  # 비활성화

여러 컨테이너를 한 번에 변경할 수도 있다.

docker update --restart always $(docker ps -q)

정책 선택 가이드

용도권장 정책
프로덕션 상시 서비스unless-stopped
크래시 복구 필요on-failure
부팅 시 반드시 자동 시작always
개발 환경no (기본값)
마이그레이션·일회성 작업no

재시작 횟수 확인

docker inspect --format='{{.RestartCount}}' mycontainer
docker events --filter event=restart  # 실시간 재시작 이벤트

지난 글: Docker Compose logs/ps: 서비스 상태 조회와 로그 분석

다음 글: Docker 리소스 제한: CPU·메모리 완전 정복


읽어주셔서 감사합니다. 😊