Инструменты пользователя

Инструменты сайта


docker:healthcheck:main

Различия

Здесь показаны различия между двумя версиями данной страницы.

Ссылка на это сравнение

Предыдущая версия справа и слева Предыдущая версия
Следующая версия
Предыдущая версия
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&​amp;​nb=1|Нажмите,​ чтобы открыть на Facebook (Открывается в новом окне)]] 
-  * [[https://​dotsandbrackets.com/​docker-health-check-ru/?​share=twitter&​amp;​nb=1|Нажмите,​ чтобы поделиться на Twitter (Открывается в новом окне)]] 
-  * [[https://​dotsandbrackets.com/​docker-health-check-ru/?​share=linkedin&​amp;​nb=1|Нажмите,​ чтобы поделиться на LinkedIn (Открывается в новом окне)]] 
-  * [[https://​dotsandbrackets.com/​docker-health-check-ru/?​share=telegram&​amp;​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]] 
docker/healthcheck/main.1703189902.txt.gz · Последние изменения: 2023/12/21 23:18 — werwolf