시스템 부팅시 Docker 컨테이너를 자동으로 시작하려면 어떻게해야합니까?


111

실행하려는 Docker 컨테이너가 있다고 가정하면 다음을 호출 할 수 있습니다.

$ docker run ...

그리고 모든 것이 좋습니다. 시스템이 충돌하고 재부팅되는 경우 자동으로 다시 시작되는 방식으로 컨테이너를 실행하는 기본 제공 방법이 있습니까?

그렇다면 Docker Compose에서도 사용할 수 있습니까?

답변:


134

예, docker에는 이를 처리하는 것과 같은 재시작 정책docker run --restart=always 이 있습니다. 이는 compose.yml 구성 파일 에서 restart: always.


25
이것이 첫 번째이며 받아 들여지는 대답이지만 해당 기능을 검색하는 대부분의 사람들은 실제로 컨테이너를 서비스로 실행하기를 원할 것입니다. 서비스 관리자로 사용Systemd 하는 @kon의 대답 은 해당 목적에 가장 적합한 솔루션 중 하나이며 더 많은 찬성표가 필요합니다.
Rémi Becheras

1
이것은 나에게 작동하지 않았습니다. "crmpicco-mysql"이라는 컨테이너가 있는데 실행했는데 docker run --restart=always crmpicco-mysql오류가 발생 Unable to find image 'crmpicco-mysql:latest' locally했습니다..
crmpicco

2
귀하의 오류는 관련이 없습니다. 별도의 질문을 게시하고 싶을 수 있지만 도커 이미지 이름과 도커 컨테이너 이름을 혼동하는 것 같습니다. 이 docker run명령은를 통해 나열 할 수있는 이미지의 이름을 예상합니다 docker images.
Peter Lyons

12
유일한 문제는 "항상"이 오류로 인해 중지되었을 때 컨테이너를 무한히 다시 시작한다는 것입니다 (문서 참조). 만 데몬 시작에서 시작 정책이 있어야한다
lostiniceland

4
컨테이너 / 도커의 주요 판매 포인트 중 하나는 systemd에서 각 서비스를 설치하고 관리 할 필요가 없다는 것입니다 (고통 스러울 수 있음).
Marc

141

로그인을 수행 한 사용자가없는 경우에도 컨테이너를 시작하려는 경우 (예 : 시작 만하고 매번 로그인하고 싶지 않은 VirtualBox VM). Ubuntu 16.04 LTS에 대해 수행 한 단계는 다음과 같습니다. 예를 들어 Oracle db 컨테이너를 설치했습니다.

$ docker pull alexeiled/docker-oracle-xe-11g
$ docker run -d --name=MYPROJECT_oracle_db --shm-size=2g -p 1521:1521 -p 8080:8080 alexeiled/docker-oracle-xe-11g
$ vim /etc/systemd/system/docker-MYPROJECT-oracle_db.service

다음 내용을 추가하십시오.

[Unit]
Description=Redis container
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a MYPROJECT_oracle_db
ExecStop=/usr/bin/docker stop -t 2 MYPROJECT_oracle_db

[Install]
WantedBy=default.target

시작시 서비스 활성화

sudo systemctl enable docker-MYPROJECT-oracle_db.service

자세한 내용은 https://docs.docker.com/engine/admin/host_integration/


9
고정 표시기-작성이 작업을 수행하고자하는 사람들을 위해, 당신은 대체 할 수 docker와 명령을 위 docker-compose사용하여 명령 -f다음 고정 표시기-작성 파일의 위치를 지정하는 플래그를/usr/bin/docker-compose -f /path/to/docker-compose.yml up
charlesreid1

1
@ charlesreid1이 말한 내용에 추가하려면 파일을 docker-compose.yml지정하는 경우 docker compose 파일 명시 적으로 지정하는 것 외에도을 .env사용 하십시오. --project-directory /path/to
whlteXbread

1
Docker에는 로그 시스템과 프로세스 관리자가 있습니다. 올바른 재시작 정책이 없다는 것은 유감입니다.
Franklin Yu

Windows Server 2012에서이 작업을 수행하는 방법을 아십니까? 내가 로그인하지 않는 한 나는 ... 고정 표시기를 실행할 수 없습니다
알렉스 주님 모르도르에게

[Unit]라는 유용한 지시문 이 있다는 것도 흥미로울 수 있습니다 Before=. 특히 데이터베이스 관리 시스템과 같은 것을 시작할 때 특정 다른 서비스 보다 먼저 시작하는지 확인하는 것이 도움이 될 수 있습니다 .
Micha

92

기본 다시 시작 정책 입니다 no.

생성 된 컨테이너의 경우 docker update다시 시작 정책을 업데이트 하는 데 사용 합니다.

docker update --restart=always 0576df221c0b

0576df221c0b 컨테이너 ID입니다.


하지 않는 always경우에도 컨테이너가 다시 시작됩니다 말은 내가 그것을 중지? 이러한 종류의 지속적인 시작없이 재부팅시 컨테이너를 다시 시작할 수있는 방법이 있습니다.
Marc

4
@Marc : 아니요. 문서 참조 :If you manually stop a container, its restart policy is ignored until the Docker daemon restarts or the container is manually restarted. This is another attempt to prevent a restart loop.
SaeX

15

사용할 수 있습니다 docker update --restart=on-failure <container ID or name>.

이름에서 알 수 있듯이 on-failure실패시뿐만 아니라 시스템 부팅시에도 컨테이너를 다시 시작합니다.

문서 , 여러 다시 시작 옵션이 있습니다 :

Flag            Description
no              Do not automatically restart the container. (the default)
on-failure      Restart the container if it exits due to an error, which manifests as a non-zero exit code.
always          Always restart the container if it stops. If it is manually stopped, it is restarted only when Docker daemon restarts or the container itself is manually restarted. (See the second bullet listed in restart policy details)
unless-stopped  Similar to always, except that when the container is stopped (manually or otherwise), it is not restarted even after Docker daemon restarts.

3
문서에 언급되어 있지 않다는 점을 감안할 때 이것을 발견하는 것이 좋습니다. 저에게 완벽한 솔루션입니다.
Cameron Hudson

다른 이미 실행에 의존하는 용기가 있다면 하나는 시작 즉시 실패하고 OS 부팅에서 시작되지 않을 수 있도록하는 "순서를 시작합니다"를 할 수없는 것,에 실패 사용에 대한주의 사항 한 가지
ferr

12

1) 먼저 부팅시 도커 서비스를 활성화해야합니다.

$ sudo systemctl enable docker

2) 그런 다음 docker-compose .yml 파일 추가가 restart: always있거나 docker 컨테이너가 있으면 다음 과 같이 restart = always를 추가 하십시오.

docker run --restart=always 도커 컨테이너 실행

확인하십시오

컨테이너를 수동으로 중지하는 경우 Docker 데몬이 다시 시작되거나 컨테이너가 수동으로 다시 시작될 때까지 해당 다시 시작 정책이 무시됩니다.

Docker 공식 페이지 에서이 재시작 정책 을 참조하십시오.

3) docker-compose를 시작하려면 시스템을 재부팅하면 모든 서비스가 실행되므로 아래 명령을 한 번만 실행하십시오.

$ docker-compose up -d

9

문서에서보다 "부드러운"모드 :

docker run -dit --restart unless-stopped <image_name>

2
불행히도 docker 데몬이 재부팅으로 중지되면 데몬은 컨테이너를 "중지"하여 컨테이너를 중지 된 것으로 표시합니다. 그러면 시스템이 부팅 될 때 실제로 시작되지 않습니다. 멍청하다. 여기에 버그가 있습니다 : github.com/docker/for-linux/issues/652
mlissner dec

restart=unless-stopped옵션은 Docker 엔진이 다시 시작될 때 컨테이너를 시작하려고합니다. 내가 본 예외는 Docker 엔진 자체가 재부팅시 자동으로 시작되도록 구성되지 않았고 ( systemctl status docker활성화되어 있는지 확인), 오버레이 네트워킹에서만 보았던 네트워킹이 준비되기 전에 컨테이너를 시작하는 엔진입니다. 둘 다 깨질 것 restart=always입니다.
BMitch

3

이것이 crontab의 용도입니다.

@reboot sleep 10 ; docker start <container name> 2>&1 | /usr/bin/logger -t 'docker start'

사용자 crontab에 액세스 하거나 다음에서 시스템 crontab을 crontab -e표시 crontab -l하거나 편집하십시오./etc/crontab


고정 표시기 서비스 전에 크론 서비스 시작은 무엇입니까 ...이이 경우에 실패 ...
아킬 Jalagam

1
@AkhilJalagam 귀하의 문제를 이해하고 있는지 잘 모르겠습니다. "sleep 10"은 crond를 시작하는 데 충분한 시간을 제공 한 다음 시스템 부팅 / 재부팅 후 컨테이너를 시작합니다. 이 방법은 시작하기 전에 로그인 할 사람이 필요하지 않으며 복잡하고 복잡한 시스템 서비스 유닛을 피합니다. systemd 서비스 단위 방법은 내 예보다 훨씬 더 괴롭다.
Travis Runyard

2

Windows에서 부팅시 컨테이너 시작을 달성하고 싶었습니다.

따라서 시스템 부팅시 시작되는 예약 된 작업을 방금 만들었습니다. 이 작업은 단순히 "Docker for Windows.exe"(또는 도커 실행 파일의 이름)를 시작합니다.

그런 다음 다시 시작 정책이 "항상"인 모든 컨테이너가 시작됩니다.


2

다음과 같이 항상 다시 시작하는 컨테이너를 실행할 수 있습니다 .

$ docker run -dit --restart unless-stopped <image name OR image hash>

실행중인 컨테이너의 구성을 변경하려면 다음과 같이 업데이트 해야합니다.

$ docker update --restart=<options> <container ID OR name>

컨테이너의 현재 정책을 보려면 먼저 위에서 다음 명령을 실행하십시오.

docker inspect gateway | grep RestartPolicy -A 3

결국, 설치된 도커 데몬 을 다음과 같이 시스템 부팅시 활성화 하는 것을 잊지 마십시오 .

$ systemctl enable docker

다시 시작 정책의 전체 목록을 보려면 다음을 참조하십시오 다시 시작 정책


0

Linux 시스템을 실행하는 비슷한 문제가 있습니다. 시스템이 부팅 된 후 다시 시작 정책이 "unless-stopped"인 컨테이너는 "docker ps"와 같은 방식으로 docker를 사용하는 명령을 입력하지 않으면 자동으로 다시 시작되지 않습니다. 나는 그 명령이 단지 상태 정보를보고 할 것이라고 예상했기 때문에 놀랐다. 다음으로 "systemctl status docker"명령을 시도했습니다. docker 명령이 실행되지 않은 시스템에서이 명령은 다음을보고했습니다.

● docker.service - Docker Application Container Engine

   Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)

     Active: inactive (dead)    TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com

다른 Docker 명령없이 "docker ps"가 실행 된 시스템에서 다음을 얻었습니다.

● docker.service - Docker Application Container Engine
    Loaded: loaded (/lib/systemd/system/docker.service; disabled; vendor preset: enabled)

    Active: active (running) since Sun 2020-11-22 08:33:23 PST; 1h 25min ago

TriggeredBy: ● docker.socket
       Docs: https://docs.docker.com

   Main PID: 3135 (dockerd)
      Tasks: 13

    Memory: 116.9M
     CGroup: /system.slice/docker.service
             └─3135 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock
 ... [various messages not shown ]

가장 가능성이 높은 설명은 Docker가 컨테이너를 완전히 초기화하고 시작하기 전에 일부 docker 명령을 기다린다는 것입니다. 컨테이너에 필요한 모든 서비스가 초기화 된 후 systemd 단위 파일에서 "docker ps"를 실행할 수 있습니다. 다음 내용이 포함 된 / lib / systemd / system 디렉토리에 docker-onboot.service라는 파일을 넣어이를 테스트했습니다.

[Unit]
# This service is provided to force Docker containers
# that should automatically restart to restart when the system
# is booted. While the Docker daemon will start automatically,
# it will not be fully initialized until some Docker command
# is actually run.  This unit merely runs "docker ps": any
# Docker command will result in the Docker daemon completing
# its initialization, at which point all containers that can be
# automatically restarted after booting will be restarted.
#
Description=Docker-Container Startup on Boot
Requires=docker.socket
After=docker.socket network-online.target containerd.service

[Service]
Type=oneshot
ExecStart=/usr/bin/docker ps

[Install]

WantedBy = multi-user.target

지금까지 (이 서비스가 활성화 된 한 테스트) 컴퓨터가 부팅 될 때 컨테이너가 시작되었습니다. docker.service는 docker 명령이 실행될 때까지 시작되지 않기 때문에 docker.service에 대한 종속성을 시도하지 않았습니다. 다음 테스트는 docker-onboot가 비활성화 된 상태로 진행됩니다 (WantedBy 종속성이 자동으로 시작하는지 확인).


소켓을 통해 해당 서비스를 간접적으로 트리거하기 위해 전체 다른 서비스를 만드는 것보다 docker.service부팅 시 자체적으로 시작하는 것이 훨씬 쉽습니다 systemctl enable docker.service.
Lucas S.

0

컨테이너를 시작하고 시스템 재부팅시 자동으로 다시 시작되도록 설정하려면

docker run -d --restart unless-stopped ecstatic_ritchie

ecstatic_ritchie관심있는 컨테이너를 지정하는 예제 이름은 어디에 있습니까 ? docker ps -a모든 컨테이너 이름을 나열하는 데 사용 합니다.

시스템 재부팅시 특정 실행 컨테이너가 자동으로 시작되도록하려면

docker update --restart unless-stopped ecstatic_ritchie

실행중인 모든 컨테이너가 시스템 재부팅시 자동으로 시작되도록하려면

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

Docker 홈페이지에서 더보기

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.