Jak automatycznie uruchomić kontenery dokerów podczas uruchamiania systemu?

113

Jaki jest dobry sposób na automatyczne uruchamianie kontenerów dokerów po uruchomieniu systemu?

Czy istnieje preferowany sposób, aby to zrobić w systemie Ubuntu 14.04?

W supervisordprzeszłości korzystałem z aplikacji do automatycznego uruchamiania aplikacji internetowych. Ale to nie wydaje się właściwe dla Dockera.

Stefan Arentz
źródło

Odpowiedzi:

136

Najwyraźniej obecna metoda automatycznego uruchamiania kontenerów Docker ( z Docker 1.2 ) polega na użyciu zasad restartu . Kontroluje to, w jaki sposób Docker powinien obsługiwać uruchamianie kontenera podczas uruchamiania i ponowne uruchamianie kontenera po jego wyjściu. Do tej pory korzystałem z opcji „zawsze” i mogę potwierdzić, że Docker automatycznie uruchamia kontener przy starcie systemu:

sudo docker run --restart=always -d myimage

Fragment dokumentacji

Zrestartuj zasady Korzystając z flagi --restart podczas uruchamiania Dockera, możesz określić zasady restartowania określające, w jaki sposób kontener powinien lub nie powinien być restartowany przy wyjściu.

nie - nie uruchamiaj ponownie kontenera, gdy wychodzi.

w przypadku awarii - zrestartuj kontener tylko wtedy, gdy wyjdzie z niezerowym statusem wyjścia.

always - Zawsze uruchamiaj ponownie kontener niezależnie od statusu wyjścia.

Możesz także określić maksymalną liczbę prób, przez które Docker będzie próbował zrestartować kontener podczas korzystania z zasad dotyczących awarii. Domyślnie Docker na zawsze będzie próbował zrestartować kontener.

$ sudo docker run --restart=always redis

Spowoduje to uruchomienie kontenera redis z zasadą restartu zawsze, więc jeśli kontener zostanie zamknięty, doker zrestartuje go.

$ sudo docker run --restart=on-failure:10 redis

Spowoduje to uruchomienie kontenera redis z zasadą restartu w przypadku awarii i maksymalną liczbą restartów wynoszącą 10. Jeśli kontener redis wyjdzie z niezerowym statusem wyjścia więcej niż 10 razy z rzędu Docker przerwie próbę ponownego uruchomienia kontenera. Podanie maksymalnego limitu ponownego uruchomienia obowiązuje tylko w przypadku zasady dotyczącej awarii.

aknuds1
źródło
12
„zawsze - zawsze uruchamiaj ponownie kontener niezależnie od statusu wyjścia” jest nieco mylące. Nie zrestartuje kontenera, jeśli ręcznie opuścisz / zatrzymasz kontener, a tego właśnie szukałem.
w00t
12
Uwaga: unless-stoppeddodano kolejną zwaną zasadę. Działa tak, alwaysale jeśli kontener zostanie zatrzymany, a system zostanie ponownie uruchomiony lub demon dokera zostanie zrestartowany, kontener się nie uruchomi ponownie. Zobacz tutaj, aby napisać o wszystkich 4 opcjach blog.codeship.com/…
David Morales
4
Oczywiście dockerdemon musi się automatycznie uruchomić, aby to obsługiwać.
sherrellbc
Myślę, że pytanie brzmi „przy rozruchu systemu”, co oznacza po ponownym uruchomieniu serwera fizycznego lub wirtualnego, w jaki sposób samoczynne ponowne uruchomienie kontenerów, przy założeniu, że silnik dokera w pełni działa po ponownym uruchomieniu serwera?
Root Loop
8

Docker ma tę stronę, która wyjaśnia, jak to zrobić za pomocą upstart i systemd. Zgadzam się, że nie wydaje się to właściwe dla Dockera. Ich rozwiązaniem jest uruchomienie docker start, które zakłada, że ​​już utworzyłeś swój kontener. Pomyślałbym, że albo zrobisz to docker run --rmw skrypcie startowym (traktując go jak zupełnie nowy proces i kontener z obrazu) lub po prostu pozwól demonowi dokera zrestartować same kontenery podczas uruchamiania (tak jak domyślnie, jeśli nie zrobisz nic innego ). Upstart ma tę zaletę, że umożliwia łatwe uruchamianie / zatrzymywanie procesów, ale uzyskuje się to również dzięki uruchomieniu / zatrzymaniu dokera!

Myślę, że dziwne jest zmuszanie użytkownika do ręcznego utworzenia kontenera (ze wszystkimi poprawnymi powiązaniami portu / woluminu) przed uruchomieniem skryptu uruchamiania.

Lawrence Kesteloot
źródło
Łącze jest zerwane ... To wydaje się być możliwym zamiennikiem, ale z pewnością nie pokazuje „jak”
Gert van den Berg
Dzięki, naprawiłem link do podobnej strony, ale nie mogę być pewien, że mówi to samo co oryginał.
Lawrence Kesteloot
6

Ale to nie wydaje się właściwe dla Dockera.

Dlaczego nie?

Używam do tego superwizora z wielkim sukcesem.

Używaj tego, co wiesz, używaj tego, co działa, używaj czegoś, co możesz łatwo utrzymać i zrozumieć.

EEAA
źródło
Dzięki @EEAA .. czy to oznacza, że ​​uruchamiasz je w trybie innym niż demon? Czy to nie znaczy, że musisz je uruchomić --rm?
Stefan Arentz
Prowadzę kontenery w trybie pierwszego planu i pozwalam nadzorcy złapać stdout / stderr. Nie jestem pewien, dlaczego --rmma to znaczenie.
EEAA
@EEAA: o twoje pytanie: Dla niektórych osób dockerjest zamiennikiem lxclub openvzktóre mają lxc.start.auto = 1i vzctl set --onboot yes. Zawiera także ESXi i inne rozwiązania wirtualizacyjne. Podobnie jak Lawrence, nie sądzę też, aby taka funkcja autostartu powinna była zostać wdrożona w sposób specyficzny dla dystrybucji, ponieważ użytkownik doku powinien być w stanie rozwiązać ten sam problem z taką samą wiedzą na każdej platformie.
Daniel Alder,
1
Racja, Docker to świetny sposób na oddzielenie hosta od uruchomionych kontenerów, więc użycie konfiguracji specyficznej dla hosta jest krokiem wstecz.
nijave