컨테이너 자동 시작하기

컨테이너 자동 시작하기 (Start containers automatically)

Docker는 컨테이너가 종료될 때나 Docker가 다시 시작될 때 자동으로 시작할지 제어하는 restart policies를 제공해요. Docker는 restart policy를 사용하고, 프로세스 매니저로 컨테이너를 시작하는 것은 피할 것을 권장해요.

재시작 정책은 dockerd 명령의 --live-restore 플래그와는 달라요. --live-restore를 사용하면 Docker 업그레이드 중에도 컨테이너를 계속 실행하게 할 수 있지만, 네트워킹과 사용자 입력은 중단돼요.

출처: 문서

본문

재시작 정책 사용 (Use a restart policy)

컨테이너의 재시작 정책을 구성하려면 docker run 명령을 사용할 때 --restart 플래그를 사용해요. --restart 플래그의 값은 다음 중 하나가 될 수 있어요:

Flag Description
no 컨테이너를 자동으로 재시작하지 않음. (기본값)
on-failure[:max-retries] 컨테이너가 오류로 인해 종료되면(0이 아닌 종료 코드로 나타남) 재시작. 선택적으로 :max-retries 옵션으로 Docker 데몬이 컨테이너를 재시작하려 시도하는 횟수를 제한. on-failure 정책은 컨테이너가 실패로 종료된 경우에만 재시작을 유도해요. 데몬이 재시작돼도 컨테이너를 재시작하지 않아요.
always 컨테이너가 중지되면 항상 재시작. 수동으로 중지되면 Docker 데몬이 재시작될 때나 컨테이너 자체가 수동으로 재시작될 때만 재시작됨. (restart policy 세부 사항의 두 번째 글머리 참고)
unless-stopped always와 유사하지만, 컨테이너가(수동으로든 다른 방식으로든) 중지되면 Docker 데몬이 재시작된 후에도 재시작되지 않음.

다음 명령은 unless-stopped 재시작 정책으로 Redis 컨테이너를 시작해요. Docker는 컨테이너가 종료되거나 데몬이 재시작되면 재시작하지만, 사용자가 직접 중지한 경우에는 재시작하지 않아요.

$ docker run -d --name redis --restart unless-stopped redis

다음 명령은 redis라는 이미 실행 중인 컨테이너의 재시작 정책을 변경해요.

$ docker update --restart unless-stopped redis

다음 명령은 모든 실행 중인 컨테이너가 재시작되도록 보장해요.

$ docker update --restart unless-stopped $(docker ps -q)

재시작 정책 세부 사항 (Restart policy details)

재시작 정책을 사용할 때 다음을 명심하세요:

  • 재시작 정책은 컨테이너가 성공적으로 시작된 후에만 효력을 발휘해요. 이 경우 성공적으로 시작된다는 것은 컨테이너가 최소 10초 동안 가동되고 Docker가 이를 모니터링하기 시작했음을 의미해요. 이는 전혀 시작하지 않는 컨테이너가 재시작 루프에 빠지는 것을 방지해요.
  • 수동으로 컨테이너를 중지하면 Docker 데몬이 재시작되거나 컨테이너가 수동으로 재시작될 때까지 재시작 정책은 무시돼요. 이는 재시작 루프를 방지해요.
  • 재시작 정책은 컨테이너에만 적용돼요. Swarm 서비스의 재시작 정책을 구성하려면 service restart 관련 플래그를 참고하세요.

포그라운드 컨테이너 재시작 (Restarting foreground containers)

컨테이너를 포그라운드에서 실행할 때, 컨테이너를 중지하면 컨테이너의 재시작 정책과 무관하게 연결된 CLI도 함께 종료돼요. 이 동작은 다음 예시에서 설명돼요.

  1. 숫자 1부터 5까지 출력한 다음 종료하는 Dockerfile을 만들어요.
FROM busybox:latest
COPY --chmod=755 <<"EOF" /start.sh
echo "Starting..."
for i in $(seq 1 5); do
  echo "$i"
  sleep 1
done
echo "Exiting..."
exit 1
EOF
ENTRYPOINT /start.sh
  1. Dockerfile에서 이미지를 빌드해요.
$ docker build -t startstop .
  1. 이미지에서 컨테이너를 실행하고 재시작 정책으로 always를 지정해요. 컨테이너는 stdout에 숫자 1..5를 출력한 다음 종료해요. 이로 인해 연결된 CLI도 종료돼요.
$ docker run --restart always startstop
Starting...
1
2
3
4
5
Exiting...
$
  1. docker ps를 실행하면 재시작 정책 덕분에 컨테이너가 여전히 실행 중이거나 재시작 중임을 보여줘요. 하지만 CLI 세션은 이미 종료됐어요. 초기 컨테이너 종료를 넘어서지 않아요.
$ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS     NAMES
081991b35afe   startstop   "/bin/sh -c /start.sh"   9 seconds ago   Up 4 seconds             gallant_easley
  1. docker container attach 명령으로 재시작 사이에 터미널을 컨테이너에 다시 연결할 수 있어요. 다음에 컨테이너가 종료되면 다시 분리돼요.
$ docker container attach 081991b35afe
4
5
Exiting...
$

프로세스 매니저 사용 (Use a process manager)

Docker 밖의 프로세스가 Docker 컨테이너에 의존하는 경우처럼 재시작 정책이 필요에 맞지 않으면, systemd 또는 supervisor 같은 프로세스 매니저를 대신 사용할 수 있어요.

Warning Docker 재시작 정책과 호스트 수준 프로세스 매니저를 결합하지 마세요. 충돌을 만들기 때문이에요.

프로세스 매니저를 사용하려면, 수동으로 컨테이너를 시작할 때 일반적으로 사용하는 것과 같은 docker start 또는 docker service 명령으로 컨테이너나 서비스를 시작하도록 구성해요. 자세한 내용은 특정 프로세스 매니저의 문서를 참고하세요.

컨테이너 안에서 프로세스 매니저 사용 (Using a process manager inside containers)

프로세스 매니저는 컨테이너 안에서 실행되어 프로세스가 실행 중인지 확인하고 아니면 시작/재시작할 수도 있어요.

Warning 이것들은 Docker를 인식하지 못하고 컨테이너 안의 운영 체제 프로세스만 모니터링해요. Docker는 이 접근 방식을 권장하지 않아요. 플랫폼 의존적이고 주어진 Linux 배포판의 버전에 따라 다를 수 있기 때문이에요.

더 알아보기 (Learn more)