Как лучше всего автоматически запускать контейнеры докеров при загрузке системы?
Есть ли предпочтительный способ сделать это в Ubuntu 14.04?
Я использовал supervisord
в прошлом для автоматического запуска веб-приложений. Но это не кажется правильным для Docker.
Судя по всему, текущий способ автозапуска контейнеров Docker (из Docker 1.2) заключается в использовании политики перезапуска. Это будет контролировать, как Docker должен обрабатывать запуск контейнера при запуске и перезапуск контейнера при его выходе. До сих пор я использовал параметр «всегда» и могу подтвердить, что он заставляет Docker автоматически запускать контейнер при загрузке системы:
sudo docker run --restart=always -d myimage
Политики перезапуска. Используя флаг --restart при запуске Docker, вы можете указать политику перезапуска, определяющую, как контейнер должен или не должен перезапускаться при выходе.
нет - Не перезапускать контейнер при выходе.
при сбое - перезапускать контейнер только в том случае, если он выходит с ненулевым статусом выхода.
always - всегда перезапускать контейнер независимо от статуса выхода.
Вы также можете указать максимальное количество раз, когда Docker будет пытаться перезапустить контейнер при использовании политики при сбое. По умолчанию Docker будет вечно пытаться перезапустить контейнер.
$ sudo docker run --restart=always redis
Это запустит контейнер redis с политикой перезапуска всегда, так что, если контейнер выйдет, Docker перезапустит его.
$ sudo docker run --restart=on-failure:10 redis
Это запустит контейнер redis с политикой перезапуска при сбое и максимальным количеством перезапусков, равным 10. Если контейнер redis выходит с ненулевым статусом выхода более 10 раз подряд, Docker прекратит попытку перезапуска контейнера. Предоставление максимального предела перезапуска действительно только для политики отказа.
Докер имеет эта страница Это объясняет, как это сделать с помощью upstart и systemd. Я согласен с тем, что это не похоже на Docker. Их решение - запустить docker start
, что предполагает, что вы уже создали свой контейнер. Я бы подумал, что ты тоже docker run --rm
в сценарии выскочки (рассматривая его как новый процесс и контейнер из образа) или просто позвольте демону докера перезапустить сами контейнеры при загрузке (как это будет по умолчанию, если вы больше ничего не сделаете). Преимущество Upstart в том, что он позволяет легко запускать / останавливать процессы, но вы также получаете это с помощью запуска / остановки докера!
Я считаю странным заставлять пользователя вручную создавать контейнер (со всеми правильными привязками портов / томов) до того, как скрипт выскочки заработает.
Но это не кажется правильным для Docker.
Почему нет?
Я с большим успехом использую для этого supervisord.
Используйте то, что вы знаете, используйте то, что работает, используйте то, что вам легко поддерживать и понимать.