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

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

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

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

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

sudo docker run --restart=always -d myimage

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

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

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

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

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

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

$ sudo docker run --restart=always redis

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

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

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

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

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

Но мне кажется, что это не совсем правильно для Docker.

Почему нет?

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

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