Как автоматически запустить докер-контейнеры при загрузке системы?

113

Каков хороший способ автоматического запуска докер-контейнеров при загрузке системы?

Есть ли предпочтительный способ сделать это в Ubuntu 14.04?

В supervisordпрошлом я использовал для автоматического запуска веб-приложений. Но это не похоже на то, что нужно Докеру.

Стефан Арентц
источник

Ответы:

136

По-видимому, текущий метод автоматического запуска контейнеров Docker ( из Docker 1.2 ) - использовать политики перезапуска . Это будет контролировать, как Docker должен обрабатывать запуск контейнера при запуске и перезапуск контейнера при его выходе. До сих пор я использовал опцию 'Always' и могу подтвердить, что Docker автоматически запускает контейнер при загрузке системы:

sudo docker run --restart=always -d myimage

Выдержка из документации

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

нет - не перезапускать контейнер, когда он выходит.

on-fail - Перезапустить контейнер, только если он выходит с ненулевым статусом выхода.

всегда - всегда перезапускать контейнер независимо от состояния выхода.

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

$ sudo docker run --restart=always redis

Это запустит контейнер redis с политикой перезапуска всегда, так что если контейнер выйдет, Docker перезапустит его.

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

Это приведет к запуску контейнера redis с политикой перезапуска при сбое и максимальным числом перезапусков 10. Если контейнер redis выходит с ненулевым состоянием выхода более 10 раз подряд, Docker прекратит попытки перезапустить контейнер. Указание максимального предела перезапуска действительно только для политики при сбое.

aknuds1
источник
12
«всегда - всегда перезапускать контейнер независимо от состояния выхода» немного сбивает с толку. Контейнер не будет перезапущен, если вы вручную выйдете / остановите контейнер, что я и искал.
15:00
12
Примечание: unless-stoppedбыла добавлена другая политика с названием . Это действует так, alwaysно если контейнер остановлен и система перезагружена или демон docker перезапущен, контейнер не будет перезапущен. Смотрите здесь для хорошего описания
Дэвид Моралес
4
Конечно, dockerдемон должен автоматически запуститься, чтобы поддержать это.
sherrellbc
Я думаю, что вопрос задает вопрос «при загрузке системы», то есть, как после перезагрузки физического или виртуального сервера, как автоматически перезапускается контейнер, предполагая, что механизм докера полностью запускается после перезагрузки сервера?
Root Loop
8

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

Я думаю, что странно заставлять пользователя вручную создавать контейнер (со всеми правильными привязками порта / тома), прежде чем скрипт upstart будет работать.

Лоуренс Кестулут
источник
Ссылка не работает ... Это похоже на возможную замену, но это, безусловно, не показывает "как"
Герт ван ден Берг
Спасибо, я исправил ссылку на похожую страницу, но не могу быть уверен, что она говорит то же самое, что и оригинал.
Лоуренс Кестулут
6

Но это не похоже на то, что нужно Докеру.

Почему нет?

Я пользуюсь супервизором для этого с большим успехом.

Используйте то, что вы знаете, используйте то, что работает, используйте то, что вы можете легко поддерживать и понимать.

EEAA
источник
Спасибо @EEAA .. Значит ли это, что вы запускаете их в режиме, не являющемся демоном? Разве это не значит, что вам нужно их запускать --rm?
Стефан Арентц
Я запускаю контейнеры в режиме переднего плана и позволяю supervisord перехватывать stdout / stderr. Я не уверен, почему --rmэто актуально здесь.
EEAA
@EEAA: о вашем вопросе: для некоторых людей dockerэто замена lxcили openvzкоторые имеют lxc.start.auto = 1и vzctl set --onboot yes. Также в ESXi и другие решения для виртуализации включена такая функция. Как и Лоуренс, я также не думаю, что такая функция автозапуска должна быть реализована для конкретного дистрибутива, потому что пользователь докера должен иметь возможность решать одну и ту же проблему с одинаковыми знаниями на каждой платформе.
Даниэль Олдер
1
Правильно, Docker - отличный способ отделить хост от запущенных контейнеров, поэтому использование специфичной для хоста конфигурации - это шаг назад.
Нияве