Як автоматично запустити контейнери докера під час завантаження системи?


113

Який хороший спосіб автоматичного запуску контейнерів docker, коли система завантажується?

Чи є бажаний спосіб зробити це на Ubuntu 14.04?

Раніше я використовував supervisordдля автоматичного запуску веб-додатків. Але це не здається правильним для Докера.

Відповіді:


136

Мабуть, поточний метод автоматичного запуску контейнерів Docker ( від Docker 1.2 ) полягає у використанні політики перезавантаження . Це дозволить контролювати, як Docker повинен обробляти запуск контейнера при запуску та повторному запуску контейнера при його виході. Я до цього часу використовував варіант "завжди" і можу підтвердити, що це робить Docker автоматично запускати контейнер під час завантаження системи:

sudo docker run --restart=always -d myimage

Витяг з документації

Політика перезапуску Використовуючи прапор --restart під час запуску Docker, ви можете вказати політику перезавантаження того, як контейнер повинен або не повинен бути перезапущений при виході.

ні - не перезавантажуйте контейнер під час його виходу.

при відмові - перезавантажте контейнер лише в тому випадку, якщо він закінчується зі статусом виходу з нуля.

завжди - завжди перезавантажуйте контейнер незалежно від стану виходу.

Ви також можете вказати максимальну кількість разів, коли Docker намагатиметься перезапустити контейнер під час використання політики відмови. За замовчуванням Docker завжди намагатиметься перезапустити контейнер.

$ sudo docker run --restart=always redis

Це запустить контейнер redis з політикою перезавантаження завжди, так що, якщо контейнер вийде, Docker перезапустить його.

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

Це запустить контейнер redis із політикою перезапуску відмови та максимальним числом перезапуску 10. Якщо контейнер redis виходить із ненульовим статусом виходу більше 10 разів поспіль Docker перерве спроби перезапустити контейнер. Надання максимального ліміту перезапуску справедливе лише для політики щодо відмов.


12
"завжди - завжди перезавантажувати контейнер незалежно від стану виходу" - це трохи заплутано. Він не перезапустить контейнер, якщо ви вручну вийдете / зупините контейнер, що таке поведінка, яку я шукав.
w00t

12
Примітка: інша політика називається unless-stoppedбула додана. Це діє так, alwaysале якщо контейнер зупинений і система перезавантажена або демон докера перезапущений, контейнер не перезапуститься. Дивіться тут, щоб приємно написати всі 4 варіанти blog.codeship.com/…
Девід Моралес

4
Звичайно, dockerдемон повинен автоматично запуститися, щоб підтримати це.
sherrellbc

Я думаю, що питання задається "на завантаження системи", тобто після перезавантаження фізичного або віртуального сервера, як контейнери автоматично перезавантажуються, припускаючи, що движок docker повністю працює після перезавантаження сервера?
Коренева петля

8

У Docker є ця сторінка, яка пояснює, як це зробити з запуском та systemd. Я згоден, що це не здається правильним для Докера. Їх рішення полягає в запуску docker start, який передбачає, що ви вже створили свій контейнер. Я б подумав, що ви або зробите docker run --rmв початковому сценарії (трактуючи його як абсолютно новий процес і контейнер із зображенням) або просто дозвольте демон-докеру перезапустити контейнери самостійно під час завантаження (як це буде за замовчуванням, якщо ви нічого більше не робите ). Upstart має перевагу в тому, що дозволяє легко запускати / зупиняти процеси, але ви це отримуєте і при запуску / зупинці докера!

Я думаю, що дивно змушувати користувача створити контейнер вручну (з усіма правильними прив'язками порту / гучності) до того, як сценарій на початку роботи буде працювати.


Посилання розірвано ... Це здається можливою заміною, але це, звичайно, не показує "як"
Герт ван ден Берг

Дякую, я зафіксував посилання на подібну сторінку, але не можу бути впевнений, що в ній написано те саме, що і в оригіналі.
Лоуренс Кестелут

6

Але це не здається правильним для Докера.

Чому ні?

Я використовую для цього нагляд з великим успіхом.

Використовуйте те, що знаєте, використовуйте те, що працює, використовуйте те, що ви можете легко підтримувати і розуміти.


Дякую @EEAA .. це означає, що ти запускаєш їх у недемоновому режимі? Чи це також не означає, що вам потрібно запустити їх --rm?
Стефан Аренц

Я запускаю контейнери в режимі переднього плану і дозволяю супервізору ловити stdout / stderr. Я не впевнений, чому --rmце актуально.
EEAA

@EEAA: про ваше запитання: Для деяких людей dockerце заміна для lxcабо, openvzщо мають lxc.start.auto = 1і vzctl set --onboot yes. Також у ESXi та інших рішень для віртуалізації є така функція. Як і Лоуренс, я також не думаю, що таку функцію автозапуску слід реалізовувати в залежності від розподілу, оскільки користувач докера повинен мати можливість вирішувати ту саму проблему з однаковими знаннями на кожній платформі.
Даніель Олдер

1
Правильно, Docker - це чудовий спосіб від'єднати хоста від запуску контейнерів, тому використання конфігурації хоста - це трохи крок назад.
nijave
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.