убедитесь, что данный контейнер docker запущен

#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:

Ответ несколько глубок, но я нашел несколько способов сделать это, начиная с самого элегантного:

  1. Назовите свой контейнер при его запуске, чтобы вы могли подключиться к его протоколированию процессов и связать его с монитором процесса, таким как 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

  2. Менее элегантно: следите за изменениями в содержимом 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
     
  3. Аналогично приведенному выше, вы можете увидеть, является ли данный контейнер running…in цикл / cron / что угодно
     #!/bin/bash
    RUNNING=$(docker inspect --format '{{.State.Running}}' test)
    
    if [ "$RUNNING" == false ]
    then
       # do something wise
    fi
     

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