실행하려는 Docker 컨테이너가 있다고 가정하면 다음을 호출 할 수 있습니다.
$ docker run ...
그리고 모든 것이 좋습니다. 시스템이 충돌하고 재부팅되는 경우 자동으로 다시 시작되는 방식으로 컨테이너를 실행하는 기본 제공 방법이 있습니까?
그렇다면 Docker Compose에서도 사용할 수 있습니까?
답변:
예, docker에는 이를 처리하는 것과 같은 재시작 정책docker run --restart=always
이 있습니다. 이는 compose.yml 구성 파일 에서 restart: always
.
docker run --restart=always crmpicco-mysql
오류가 발생 Unable to find image 'crmpicco-mysql:latest' locally
했습니다..
docker run
명령은를 통해 나열 할 수있는 이미지의 이름을 예상합니다 docker images
.
로그인을 수행 한 사용자가없는 경우에도 컨테이너를 시작하려는 경우 (예 : 시작 만하고 매번 로그인하고 싶지 않은 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/
docker
와 명령을 위 docker-compose
사용하여 명령 -f
다음 고정 표시기-작성 파일의 위치를 지정하는 플래그를/usr/bin/docker-compose -f /path/to/docker-compose.yml up
docker-compose.yml
지정하는 경우 docker compose 파일 을 명시 적으로 지정하는 것 외에도을 .env
사용 하십시오. --project-directory /path/to
[Unit]
라는 유용한 지시문 이 있다는 것도 흥미로울 수 있습니다 Before=
. 특히 데이터베이스 관리 시스템과 같은 것을 시작할 때 특정 다른 서비스 보다 먼저 시작하는지 확인하는 것이 도움이 될 수 있습니다 .
기본 다시 시작 정책 입니다 no
.
생성 된 컨테이너의 경우 docker update
다시 시작 정책을 업데이트 하는 데 사용 합니다.
docker update --restart=always 0576df221c0b
0576df221c0b
컨테이너 ID입니다.
always
경우에도 컨테이너가 다시 시작됩니다 말은 내가 그것을 중지? 이러한 종류의 지속적인 시작없이 재부팅시 컨테이너를 다시 시작할 수있는 방법이 있습니다.
사용할 수 있습니다 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.
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
문서에서보다 "부드러운"모드 :
docker run -dit --restart unless-stopped <image_name>
restart=unless-stopped
옵션은 Docker 엔진이 다시 시작될 때 컨테이너를 시작하려고합니다. 내가 본 예외는 Docker 엔진 자체가 재부팅시 자동으로 시작되도록 구성되지 않았고 ( systemctl status docker
활성화되어 있는지 확인), 오버레이 네트워킹에서만 보았던 네트워킹이 준비되기 전에 컨테이너를 시작하는 엔진입니다. 둘 다 깨질 것 restart=always
입니다.
이것이 crontab의 용도입니다.
@reboot sleep 10 ; docker start <container name> 2>&1 | /usr/bin/logger -t 'docker start'
사용자 crontab에 액세스 하거나 다음에서 시스템 crontab을 crontab -e
표시 crontab -l
하거나 편집하십시오./etc/crontab
Windows에서 부팅시 컨테이너 시작을 달성하고 싶었습니다.
따라서 시스템 부팅시 시작되는 예약 된 작업을 방금 만들었습니다. 이 작업은 단순히 "Docker for Windows.exe"(또는 도커 실행 파일의 이름)를 시작합니다.
그런 다음 다시 시작 정책이 "항상"인 모든 컨테이너가 시작됩니다.
다음과 같이 항상 다시 시작하는 컨테이너를 실행할 수 있습니다 .
$ 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
다시 시작 정책의 전체 목록을 보려면 다음을 참조하십시오 다시 시작 정책
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
.
컨테이너를 시작하고 시스템 재부팅시 자동으로 다시 시작되도록 설정하려면
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 홈페이지에서 더보기
Systemd
하는 @kon의 대답 은 해당 목적에 가장 적합한 솔루션 중 하나이며 더 많은 찬성표가 필요합니다.