#docker
#docker
Вопрос:
Сейчас я использую docker на довольно большом количестве серверов, но иногда некоторые контейнеры, которые я использую, выходят из строя из-за большой нагрузки. Я думал о добавлении cron, который проверяет каждую минуту, запущен контейнер или нет, но я не нашел ни одного удовлетворительного метода для этого.
Я запускаю контейнер с cid-файлом, который сохраняет идентификатор запущенного контейнера. Если контейнер выходит из строя, cid-файл остается там с идентификатором внутри, и мне просто интересно, как вы, ребята, убедитесь, что контейнер запущен или нет, и обновите его в случае, если он вышел из строя. Должен ли я просто проанализировать вывод docker ps -a
или есть более элегантное решение?
Комментарии:
1. Знаете ли вы, происходит сбой контейнера или команда, запущенная внутри него, завершается сбоем? Если это процесс, вы можете попробовать запустить его через supervisord, чтобы он был перезапущен
2. Процесс внутри запускается с помощью supervisord, но я уверен, что это сбой контейнера, поскольку мне нужно перезапустить весь процесс docker daemon на хосте, чтобы иметь возможность снова запустить контейнер…
3. Тьфу! Тогда это похоже на ошибку Docker. Я бы убедился, что вы запускаете последнюю версию docker daemon и открываете проблему в проекте github
Ответ №1:
Начиная с версии docker 1.2.0, для run
вызываемой команды есть новый переключатель --restart
, который должен сделать любые внешние инструменты или мониторинг устаревшими. Поскольку на момент написания этой статьи документация должным образом не объясняет эту функцию, прочитайте анонсирующее сообщение в блоге для получения подробной информации.
Комментарии:
1. Теперь документация также обновлена.
Ответ №2:
Ответ несколько глубок, но я нашел несколько способов сделать это, начиная с самого элегантного:
- Назовите свой контейнер при его запуске, чтобы вы могли подключиться к его протоколированию процессов и связать его с монитором процесса, таким как upstart / systemd / supervisorord
docker run -itd --name=test ubuntu
пример выскочки (
/etc/init/test.conf
):description "My test container"
start on filesystem and started docker
stop on runlevel [!2345]
respawn
script
/usr/bin/docker start -a test
end script
- Менее элегантно: следите за изменениями в содержимом cidfile
docker run -itd --name=test --cidfile=/tmp/cidfile_path ubuntu
Возможно, ежечасный cron…
#!/bin/bash RUNNING=$(docker ps -a --no-trunc | awk '/test/ amp;amp; /Up/' | awk '{print $1}') CIDFILE=$(cat /tmp/cidfile_path) if [ "$RUNNING" != "$CIDFILE" ] then # do something wise fi
- Аналогично приведенному выше, вы можете увидеть, является ли данный контейнер running…in цикл / cron / что угодно
#!/bin/bash RUNNING=$(docker inspect --format '{{.State.Running}}' test) if [ "$RUNNING" == false ] then # do something wise fi
Вы можете комбинировать команды для выполнения любого сценария проверки, который вам нравится, я выбрал, upstart
потому что он подходит для моей ситуации, но эти примеры можно использовать для всех возможных сценариев, если вам понадобится больше контроля.