Bir Docker konteynerinin sistem önyüklemesinde otomatik olarak başlamasını nasıl sağlayabilirim?


103

Çalıştırmak istediğim bir Docker konteynerim olduğunu varsayarak arayabilirim

$ docker run ...

ve herşey yolunda. Bir kapsayıcıyı, sistem çökerse ve yeniden başlatılırsa otomatik olarak yeniden başlatılacak şekilde çalıştırmanın yerleşik bir yolu var mı?

Varsa, bu Docker Compose'da da mevcut mu?

Yanıtlar:


126

Evet, docker bununla başa çıkacak gibi yeniden başlatma politikalarına sahiptir docker run --restart=always. Bu aynı zamanda mevcuttur compose.yml yapılandırma dosyası olarak restart: always.


24
Bu ilk ve kabul edilen cevaptır, ancak muhtemelen bu özelliği arayan çoğu kişi, kapsayıcılarını bir hizmet olarak çalıştırmak ister. Kullanarak @kon 'ın cevabı Systemdservis müdürü olarak bu amaç için en iyi çözümlerden biridir ve daha upvotes gerekir.
Rémi Becheras

1
Bu benden işe yaramadı. Ben "crmpicco-mysql" denilen bir kap var ve kaçtım docker run --restart=always crmpicco-mysqlve ben hata var: Unable to find image 'crmpicco-mysql:latest' locally.
crmpicco

2
Senin hatan alakasız. Ayrı bir soru göndermek isteyebilirsiniz, ancak docker imaj adlarını ve docker konteyner adlarını karıştırıyorsunuz gibi görünüyor. docker runKomutu aracılığıyla listeleyebilirsiniz bir resmin adını bekler docker images.
Peter Lyons

11
Bununla ilgili tek sorun, "her zaman" seçeneğinin bir hata nedeniyle durdurulduğunda kapsayıcıyı sonsuz bir şekilde yeniden başlatmasıdır (bkz. Belgeler). Yalnızca artalan
süreci

4
Container'ların / docker'ların en önemli satış noktalarından birinin, her bir hizmetimi systemd'de kurmam ve yönetmem gerekmemesi olduğunu düşündüm (bu bir acı olabilir).
Marc

134

Herhangi bir kullanıcı oturum açmamış olsa bile konteynerin başlatılmasını istiyorsanız (yalnızca başlattığım ve her seferinde oturum açmak istemediğim VirtualBox VM gibi). İşte Ubuntu 16.04 LTS için gerçekleştirdiğim adımlar. Örnek olarak, bir oracle db konteyneri kurdum:

$ 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

ve aşağıdaki içeriği ekleyin:

[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

ve hizmeti başlangıçta etkinleştirin

sudo systemctl enable docker-MYPROJECT-oracle_db.service

Daha fazla bilgi için https://docs.docker.com/engine/admin/host_integration/


8
Docker-compose ile bunu yapmak isteyenler , docker-compose dosyasının konumunu belirtmek için bayrağı kullanarak dockeryukarıdaki komutu komutla değiştirebilirsiniz :docker-compose-f/usr/bin/docker-compose -f /path/to/docker-compose.yml up
charlesreid1

1
@ Charlesreid1'in söylediği şeyi eklemek için, eğer docker-compose.ymlbir .envdosya belirtirseniz , docker oluşturma dosyanızı açıkça belirtmeye --project-directory /path/to ek olarak kullanın .
whlteXbread

1
Docker, günlük sistemine ve işlem yöneticisine sahiptir. Doğru yeniden başlatma politikasına sahip olmaması talihsiz bir durum.
Franklin Yu

Bunu Windows Server 2012'de nasıl yapacağınıza dair bir fikriniz var mı? Giriş yapmadan docker çalıştıramıyorum ...
Alex Lord Mordor

Bazıları için yararlı bir [Unit]direktifin olması da ilginç olabilir Before=. Özellikle veritabanı yönetim sistemleri gibi şeyleri başlatırken, belirli diğer hizmetlerden önce başlatıldığından emin olmak faydalı olabilir .
Micha

89

Varsayılan yeniden başlatma politikası olduğunu no.

Oluşturulan kapsayıcılar için docker updateyeniden başlatma politikasını güncellemek için kullanın .

docker update --restart=always 0576df221c0b

0576df221c0b kapsayıcı kimliğidir.


Does not alwaysbile konteyner yeniden başlayacaktır anlamına ben bunu durdurmak? Şüphesiz kalıcı başlangıç bu tür olmadan yeniden başlatma bir konteyneri yeniden bir yolu var ...
Marc

4
@Marc: hayır. Belgelere bakın :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

12

Kullanabilirsiniz docker update --restart=on-failure <container ID or name>.

Adından da anlaşılacağı gibi, on-failurekonteyneri yalnızca arıza durumunda değil, aynı zamanda sistem önyüklemesinde de yeniden başlatacaktır.

Başına belgeler , çoklu yeniden başlatma seçeneği vardır:

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.

2
Belgelerde bahsedilmediğini düşünürsek, bunu keşfetmekle vay iyi iş çıkardın. Benim için mükemmel çözüm.
Cameron Hudson

Arıza halinde kullanımla ilgili dikkat edilmesi gereken bir nokta, halihazırda çalışan başka bir konteynere bağlı olan bir konteynırınız varsa, bir "başlangıç ​​sırası" görünmüyor, bu nedenle biri başlayıp hemen başarısız olabilir ve işletim sistemi önyüklemesinde asla başlamayabilir
ferr

8

Belgelerden daha "nazik" mod:

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

2
Ne yazık ki, docker daemon bir yeniden başlatma ile durdurulduğunda, arka plan programı konteynerleri "durdurarak" durdurulmuş olarak işaretler. Sonra sistem önyüklendiğinde, aslında bunları başlatmaz. Aptalca. İşte hata: github.com/docker/for-linux/issues/652
mlissner

7

1) Öncelikle, önyükleme sırasında docker hizmetini etkinleştirmelisiniz

$ sudo systemctl enable docker

2) Daha sonra docker-compose .yml dosyanız restart: alwaysvarsa veya docker konteyneriniz varsa restart = her zaman şu şekilde ekleyin :

docker run --restart=always ve docker container'ı çalıştırın

Emin olmak

Bir kapsayıcıyı manuel olarak durdurursanız, yeniden başlatma ilkesi Docker arka plan programı yeniden başlatılıncaya veya kapsayıcı manuel olarak yeniden başlatılıncaya kadar yok sayılır.

Docker resmi sayfasında bu yeniden başlatma politikasına bakın

3) docker-compose'u başlatmak istiyorsanız, sisteminizi yeniden başlattığınızda tüm hizmetler çalışır.Bu nedenle aşağıdaki komutu yalnızca bir kez çalıştırırsınız

$ docker-compose up -d

2

Crontab bunun için:

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

Kullanıcı crontabinize şu adresten erişin veya sistem crontab'inizi crontab -egösterin crontab -lveya düzenleyin/etc/crontab



1
@AkhilJalagam Sorununuzu anladığımdan emin değilim. "Uyku 10" crond'a başlaması için bolca zaman verir, ardından sistem önyüklemesi / yeniden başlatıldıktan sonra kapsayıcıyı başlatır. Bu yönteme başlamadan önce kimsenin oturum açmasına gerek yoktur ve dağınık, karmaşık sistem servis birimlerini önler. Systemd hizmet birimi yöntemi, benim örneğimden daha fazla hilekar.
Travis Runyard

2

Her zaman şu şekilde yeniden başlatılan bir kapsayıcı çalıştırabilirsiniz :

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

Çalışan bir kapsayıcının yapılandırmasını değiştirmek istiyorsanız, bunu şu şekilde güncellemelisiniz :

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

Ve eğer konteynerin mevcut politikasını görmek istiyorsanız, yukarıdaki ilk önce aşağıdaki komutu çalıştırın:

docker inspect gateway | grep RestartPolicy -A 3

Sonuçta, kurulu docker daemon'u sistem önyüklemesinde etkinleştirmeyi unutmayın :

$ systemctl enable docker

Yeniden başlatma politikalarının tam listesini görmek için bkz: Yeniden Başlatma Politikaları


1

Windows'ta önyükleme konteyneri başlangıcını gerçekleştirmek istedim.

Bu nedenle, sistem önyüklemesinde başlayan planlanmış bir Görev oluşturdum. Bu görev basitçe "Windows.exe için Docker" (veya yürütülebilir docker'ınızın adı ne olursa olsun) başlatır.

Ardından, yeniden başlatma ilkesi "her zaman" olan tüm kapsayıcılar başlayacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.