컨테이너로 서비스를 띄워 놓고 자리를 비웠는데, 앱이 죽거나 서버가 재부팅되면 그대로 멈춰 있습니다. 도커의 **재시작 정책(restart policy)**은 이런 상황에서 컨테이너를 자동으로 다시 띄워 주는 설정입니다. --restart 옵션 하나로 "죽으면 살려라", "재부팅돼도 다시 떠라"를 도커 데몬에게 맡길 수 있습니다.
네 가지 정책
재시작 정책은 컨테이너가 종료될 때 도커 데몬이 그걸 다시 시작할지를 정합니다. 값은 네 가지입니다.
| 정책 | 비정상 종료 시 | 데몬/서버 재부팅 시 |
|---|---|---|
| no (기본값) | 재시작 안 함 | 재시작 안 함 |
| on-failure | 재시작 (exit != 0일 때만) | 직전이 실행 중이었으면 재시작 |
| always | 재시작 | 재시작 |
| unless-stopped | 재시작 | 수동 stop 상태가 아니면 재시작 |
always와 unless-stopped의 차이가 핵심입니다. 둘 다 죽으면 살리지만, 사용자가 직접 docker stop으로 멈춰 둔 컨테이너를 데몬 재시작 후 어떻게 다룰지가 다릅니다. always는 멈춰 둔 것도 다시 띄우고, unless-stopped는 멈춰 둔 상태를 존중해 그대로 둡니다.
실행과 확인
docker run에 --restart를 붙입니다. on-failure는 재시도 횟수 상한을 줄 수 있습니다.
docker run -d --restart on-failure:5 --name web nginx
docker run -d --restart unless-stopped --name db postgres
on-failure:5는 비정상 종료 시 최대 5번까지만 재시도합니다. 현재 정책은 inspect로 확인합니다.
docker inspect web --format '{{.HostConfig.RestartPolicy.Name}}'
docker inspect web --format '{{.RestartCount}}'
실행 중인 컨테이너의 정책을 바꾸려면 다시 만들 필요 없이 docker update를 씁니다.
docker update --restart=always web
Compose에서의 표기
docker-compose.yml에서는 restart 키로 같은 값을 씁니다.
services:
web:
image: nginx
restart: unless-stopped
운영 서버에서 상시 떠 있어야 하는 서비스는 보통 unless-stopped를 권장합니다 — 점검하려고 일부러 멈춰 둔 컨테이너가 서버 재부팅으로 멋대로 살아나는 일을 막아 주기 때문입니다. 단, 재시작 정책은 컨테이너 프로세스가 죽었을 때만 동작하지, 앱 내부 데드락처럼 프로세스는 살아 있는 장애는 못 잡습니다. 그건 헬스체크의 영역입니다.
요점 정리
- 재시작 정책은 컨테이너가 죽거나 서버가 재부팅될 때 자동 복구를 맡긴다.
no는 안 함,on-failure는 실패 시만,always·unless-stopped는 항상 살린다.always는 수동 stop도 다시 띄우고,unless-stopped는 stop 상태를 존중한다.- 프로세스 종료만 감지하므로 앱 멈춤은 헬스체크로 따로 잡아야 한다.
재시작 정책을 직접 걸고 컨테이너를 죽여 보며 동작을 확인하는 실습은 도커 트랙에서 할 수 있습니다 — 회원가입 없이 무료로.