Как я могу защитить контейнер Docker, чтобы он всегда работал?

У меня есть контейнер HBase Docker, который работает на нескольких ноутбуках разработчиков. Когда разработчики закрывают свои ноутбуки, контейнер Docker неизменно умирает и перестает работать.

Вот как мы вызываем контейнер:

$ docker run -d --hostname hbase-db --name hbase \ -p 2181:2181 -p 8080:8080 -p 8085:8085 -p 9090:9090 -p 9095:9095 \ -p 16000:16000 -p 16010:16010 -p 16201:16201 -p 16301:16301 \ harisekhon/hbase 

Вопрос

Как я могу защитить этот контейнер, чтобы он автоматически перезагружался, когда / если он умирает?

Политика перезапуска Docker

Docker предоставляет функцию, которая решает эту проблему и называется политикой перезапуска Docker :

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

Типы политик перезапуска:

 no Do not automatically restart the container. (the default) on-failure Restart the container if it exits due to an error, which manifests as a non-zero exit code. unless-stopped Restart the container unless it is explicitly stopped or Docker itself is stopped or restarted. always Always restart the container if it stops. 

использование

Затем вы можете использовать политику перезапуска следующим образом:

 $ docker run -dit --restart always redis 

Соображения

  • Политика перезапуска вступает в силу только после успешного запуска контейнера. В этом случае успешный запуск означает, что контейнер работает не менее 10 секунд, и Docker начал его мониторинг. Это предотвращает переход контейнера, который вообще не запускается, в цикл перезапуска.

  • Если вы остановите контейнер вручную, его политика перезапуска будет игнорироваться до тех пор, пока демон Docker не перезапустится или контейнер не будет перезапущен вручную. Это еще одна попытка предотвратить перезапуск цикла.

  • Политики перезапуска применяются только к контейнерам. Политики перезапуска для служб роя настроены по-разному. Смотрите флаги, связанные с перезапуском сервиса.

пример

Здесь мы собираемся использовать Docker-контейнер hello-world, чтобы проиллюстрировать, как это работает.

Для начала потянем вниз:

 $ docker pull hello-world Using default tag: latest Trying to pull repository docker.io/library/hello-world ... latest: Pulling from docker.io/library/hello-world 9db2ca6ccae0: Pull complete Digest: sha256:4b8ff392a12ed9ea17784bd3c9a8b1fa3299cac44aca35a85c90c5e3c7afacdc Status: Downloaded newer image for docker.io/hello-world:latest $ 

Загрузив наш контейнер, давайте запустим его:

 $ docker run -dit --restart always hello-world 0f6a61dddd3b667727a20df2c198941b2202653a71b6c86b8ace7b236bafc974 

И если мы запустим пару docker ps мы увидим, что он перезапускается снова и снова:

 $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0f6a61dddd3b hello-world "/hello" 27 seconds ago Up Less than a second upbeat_brown ...time passes... $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0f6a61dddd3b hello-world "/hello" 5 minutes ago Restarting (0) About a minute ago upbeat_brown ...time passes... $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0f6a61dddd3b hello-world "/hello" 10 minutes ago Restarting (0) 3 minutes ago upbeat_brown 

Просматривая журналы Docker, мы видим, что он перезапускается несколько раз:

 $ docker logs 0f6a61dddd3b -f | grep "Hello from Docker" Hello from Docker! Hello from Docker! Hello from Docker! Hello from Docker! Hello from Docker! Hello from Docker! Hello from Docker! Hello from Docker! Hello from Docker! Hello from Docker! Hello from Docker! Hello from Docker! Hello from Docker! 

Когда вы все закончите, обязательно остановите контейнер, чтобы он не перезапускался вечно:

 $ docker stop 0f6 0f6 

Ваше исправление

Чтобы решить вашу проблему, просто запустите ваш контейнер HBase Docker следующим образом:

 $ docker run -d --hostname hbase-db --name hbase --restart always \ -p 2181:2181 -p 8080:8080 -p 8085:8085 -p 9090:9090 -p 9095:9095 \ -p 16000:16000 -p 16010:16010 -p 16201:16201 -p 16301:16301 \ harisekhon/hbase 

Рекомендации

  • Автоматически запускать контейнеры