Здесь показаны различия между двумя версиями данной страницы.
| Предыдущая версия справа и слева Предыдущая версия Следующая версия | Предыдущая версия | ||
|
docker:healthcheck:main [2023/12/21 23:18] werwolf [Узнаём статус контейнера из Docker events] |
docker:healthcheck:main [2023/12/21 23:20] (текущий) werwolf [Мораль] |
||
|---|---|---|---|
| Строка 197: | Строка 197: | ||
| Чтобы начать играться с сервисами, мне пришлось временно перевести локальный Docker в Swarm режим через ''docker swarm init''. Зато теперь наш ''server'' образ можно запускать вот так: | Чтобы начать играться с сервисами, мне пришлось временно перевести локальный Docker в Swarm режим через ''docker swarm init''. Зато теперь наш ''server'' образ можно запускать вот так: | ||
| - | Shell | + | <code bash> |
| $ docker service create -p 8080:8080 -p8081:8081 \ | $ docker service create -p 8080:8080 -p8081:8081 \ | ||
| --name server \ | --name server \ | ||
| Строка 210: | Строка 209: | ||
| #ohkvwbsk06vkjyx69434ndqij | #ohkvwbsk06vkjyx69434ndqij | ||
| - | + | </code> | |
| - | | 1 2 3 4 5 6 7 8 9 10 11 | $ docker service create -p 8080:8080 -p8081:8081 \ --name server \ --health-cmd='curl -sS 127.0.0.1:8080' \ --health-retries=3 \ --health-interval=5s \ server #unable to pin image server to digest: errors: #denied: requested access to the resource is denied #unauthorized: authentication required #ohkvwbsk06vkjyx69434ndqij | | + | |
| Оказывается, Swarm не очень любит локально созданные образы, поэтому-то и выплюнул в консоль несколько ошибок со своим недовольством. Но сервис всё-таки создал и вернул его айдишку: | Оказывается, Swarm не очень любит локально созданные образы, поэтому-то и выплюнул в консоль несколько ошибок со своим недовольством. Но сервис всё-таки создал и вернул его айдишку: | ||
| - | Shell | + | <code bash> |
| docker service ls | docker service ls | ||
| #ID NAME MODE REPLICAS IMAGE | #ID NAME MODE REPLICAS IMAGE | ||
| #ohkvwbsk06vk server replicated 1/1 server | #ohkvwbsk06vk server replicated 1/1 server | ||
| - | + | </code> | |
| - | | 1 2 3 | docker service ls #ID NAME MODE REPLICAS IMAGE #ohkvwbsk06vk server replicated 1/1 server | | + | |
| ''curl 127.0.0.1:8080'' теперь снова будет возвращать OK (я проверял), а запрос на порт 8081 временно заткнёт сервер. Но в отличие от первого примера, примерно через пол минуты после того, как сервер был явно отключён, он снова начнёт отзываться на 8080. Как же так? | ''curl 127.0.0.1:8080'' теперь снова будет возвращать OK (я проверял), а запрос на порт 8081 временно заткнёт сервер. Но в отличие от первого примера, примерно через пол минуты после того, как сервер был явно отключён, он снова начнёт отзываться на 8080. Как же так? | ||
| Строка 227: | Строка 223: | ||
| Прикол в том, что как только мы отключили сервер и его контейнер получил статус unhealthy, это тут же заметил Swarm менеджер и понял, что заявленная конфигурация сервиса больше не выполняется. А так нельзя, поэтому он быстренько прибил проблемный сервисный контейнер и заменил его на новый, рабочий. Следы этого можно увидеть, посмотрев историю задач для всего сервиса: | Прикол в том, что как только мы отключили сервер и его контейнер получил статус unhealthy, это тут же заметил Swarm менеджер и понял, что заявленная конфигурация сервиса больше не выполняется. А так нельзя, поэтому он быстренько прибил проблемный сервисный контейнер и заменил его на новый, рабочий. Следы этого можно увидеть, посмотрев историю задач для всего сервиса: | ||
| - | Shell | + | <code bash> |
| $ docker service ps server | $ docker service ps server | ||
| #ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS | #ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS | ||
| #mt67hkhp7ycr server.1 server moby Running Running 50 seconds ago | #mt67hkhp7ycr server.1 server moby Running Running 50 seconds ago | ||
| #pj77brhfhsjm \_ server.1 server moby Shutdown Failed about a minute ago "task: non-zero exit (137): do…" | #pj77brhfhsjm \_ server.1 server moby Shutdown Failed about a minute ago "task: non-zero exit (137): do…" | ||
| - | + | </code> | |
| - | | 1 2 3 4 | $ docker service ps server #ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS #mt67hkhp7ycr server.1 server moby Running Running 50 seconds ago #pj77brhfhsjm \_ server.1 server moby Shutdown Failed about a minute ago "task: non-zero exit (137): do…" | | + | |
| Маленькая предыстория: для каждого контейнера в сервисе Swarm создаёт задачу. То есть сначала идёт задача, а она уже приводит к контейнеру. Наш первый контейнер «упал», поэтому менеджер создал новую задачу, и она привела к новому контейнеру. Но старая задача осталась в истории! ''docker service ps'' показывает всё цепочку смертей и реинкарнаций задач, и в нашем случае видно, что самая старая задача с айди ''pj77brhfhsjm'' помечена как упавшая, и через ''docker inspect'' можно узнать почему: | Маленькая предыстория: для каждого контейнера в сервисе Swarm создаёт задачу. То есть сначала идёт задача, а она уже приводит к контейнеру. Наш первый контейнер «упал», поэтому менеджер создал новую задачу, и она привела к новому контейнеру. Но старая задача осталась в истории! ''docker service ps'' показывает всё цепочку смертей и реинкарнаций задач, и в нашем случае видно, что самая старая задача с айди ''pj77brhfhsjm'' помечена как упавшая, и через ''docker inspect'' можно узнать почему: | ||
| - | Shell | + | <code bash> |
| $ docker inspect pj77 | jq '.[].Status.Err' | $ docker inspect pj77 | jq '.[].Status.Err' | ||
| # "task: non-zero exit (137): dockerexec: unhealthy container" | # "task: non-zero exit (137): dockerexec: unhealthy container" | ||
| - | + | </code> | |
| - | | 1 2 | $ docker inspect pj77 %%|%% jq '.[].Status.Err' # "task: non-zero exit (137): dockerexec: unhealthy container" | | + | |
| «Unhealthy container», вот почему. | «Unhealthy container», вот почему. | ||
| - | ===== Мораль ===== | ||
| - | |||
| - | Проверки состояния контейнеров в Docker — это возможность регулярно запускать сторонние скрипты и экзешники внутри контейнера, чтобы узнать, достаточно ли живо его содержимое. В однохостовом режиме докер просто пометит проблемные контейнеры как unhealthy и сгенерирует health_status событие. В облачном же режиме он ещё и отключит этот контейнер и заменит его на новый, всё ещё здоровый. Быстро и автоматически. | ||
| - | |||
| - | ==== Поделиться ссылкой: ==== | ||
| - | |||
| - | * [[https://dotsandbrackets.com/docker-health-check-ru/?share=facebook&nb=1|Нажмите, чтобы открыть на Facebook (Открывается в новом окне)]] | ||
| - | * [[https://dotsandbrackets.com/docker-health-check-ru/?share=twitter&nb=1|Нажмите, чтобы поделиться на Twitter (Открывается в новом окне)]] | ||
| - | * [[https://dotsandbrackets.com/docker-health-check-ru/?share=linkedin&nb=1|Нажмите, чтобы поделиться на LinkedIn (Открывается в новом окне)]] | ||
| - | * [[https://dotsandbrackets.com/docker-health-check-ru/?share=telegram&nb=1|Нажмите, чтобы поделиться в Telegram (Открывается в новом окне)]] | ||
| - | Метки[[https://dotsandbrackets.com/tag/container/|container]][[https://dotsandbrackets.com/tag/docker/|docker]][[https://dotsandbrackets.com/tag/monitoring/|monitoring]][[https://dotsandbrackets.com/tag/quick-guide/|quick guide]] | ||