У меня есть VPS общего назначения, и я настраиваю приложения на нем. На нем будет около 5-6 контейнеров и очень мало чего еще, так что ящик можно тривиально перестроить по мере необходимости.
Для каждого приложения у меня есть сценарий запуска. Контейнер WordPress выглядит следующим образом:
#!/bin/bash# Get the host IP addressexport DOCKER_HOSTIP=`ifconfig docker0 | grep "inet addr" | cut -d ':' -f 2 | cut -d ' ' -f 1`echo "Connecting to database on Docker host ${DOCKER_HOSTIP}"docker run \ --add-host=docker:${DOCKER_HOSTIP} \ --network dockernet \ --network-alias jonblog \ --detach \ --restart always \ --rm \ jonblog
Однако это возвращает ошибку:
Конфликтующие параметры: --restart и --rm
Есть несколько билетов Docker, в которых говорится, что это разумно, но я этого не понимаю. Я думаю, что мой смысл ясен: если контейнер не запущен (например, при запуске), то я хочу его запустить. Если он умрет, я ожидаю, что контейнер будет удален, а новый будет создан из базового изображения. Контейнеры в любом случае должны быть неизменяемыми - любое состояние, которое я хочу сохранить, например медиафайлы и журналы, будет записано в тома.
Итак, я подумал, что мне следует отказаться от --restart
установите флажок, а затем используйте диспетчер процессов для остановки и запуска контейнеров Docker. Могу ли я использовать Monit здесь? Я надеялся, что смогу сделать что-то вроде:
CHECK PROCESS jonblog MATCHING jonblog START PROGRAM = "/root/docker/jonblog/host-start.sh" STOP PROGRAM = "docker stop jon-blog"
Однако это проверяет таблицу системных процессов, а не docker ps
, и поэтому он не найдет ничего, соответствующего указанной строке. Могу ли я передать его исполнителю docker ps
периодически и сопоставлять строки в выходных данных?
Я был бы рад использовать другой инструмент, если он окажется надежным. Например, я нахожу Supervisor немного тяжеловесным, но если он больше подходит для работы с Docker, я готов его использовать.
Разъяснение по поводу --rm
Причина, по которой я хочу --rm
заключается в том, что во время процесса докеризации я останавливаю текущий запущенный контейнер, load
новую версию изображения и повторно запустите приведенный выше скрипт. Это означает, что Docker получает уведомление о restart
политика для каждого контейнера. Я обнаружил, что после перезагрузки коробки у меня будет 15 или около того слегка отличающихся версий приложения, запущенных одновременно, что не входит в мои намерения.
Я полагаю, я мог бы использовать docker update --restart never
на старых контейнерах, чтобы этого не происходило, но затем, когда мой контейнер останавливается, он остается лежать без дела, и я бы с таким же успехом удалил его автоматически. Я мог бы периодически очищать старые, используя какое-то задание cron, но это кажется немного халтурным, учитывая, что Docker может сделать это за меня.
В поисках целого ряда ответов
Очень полезный комментарий подсказал мне, что я должен изучить Minikube, который, по-видимому, упрощает настройку Kubernetes, даже до такой степени, что достаточно квалифицированный специалист может быть запущен и запущен за пять минут.
Я все еще очень хотел бы видеть предложенные более легкие решения, поэтому у меня есть целый ряд ответов на выбор. Как уже указывалось, я хотел бы узнать ответ на вопрос, будет ли работать такой супервайзер процессов, как Monit.
Навскидку, я мог бы написать цикл оболочки для записи docker ps
в файл каждые пять секунд в течение минуты, а затем запускайте его в Cron каждую минуту. Затем я мог бы отсканировать этот файл с помощью grep
и Монит CHECK PROGRAM
проверка системы. Это немного банально, но это то, что я могу легко понять, если с этим возникнут проблемы. Есть какие-нибудь подвижки в этом предложении?