Докер убивает все процессы через 5 минут, а также не может запустить созданные контейнеры

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

До настоящего времени. С прошлой недели я борюсь с явлениями, которые не могу ни понять, ни взять под контроль.

Предварительное условие

По какой-то причине мне пришлось перезагрузить машину. Не удалось выполнить автоматический процесс запуска контейнеров. Я ничего не менял в машине, так что это было неожиданно и понятия не имел.

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

# systemctl status docker.service
● docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2024-07-14 19:05:13 CEST; 7s ago
     Docs: https://docs.docker.com
 Main PID: 123469 (dockerd)
    Tasks: 8
   Memory: 80.4M
   CGroup: /system.slice/docker.service
           └─123469 /usr/bin/dockerd -H fd://

Jul 14 19:05:13 IONOS-1 dockerd[123469]: time = "2024-07-14T19:05:13.067795763+02:00" level=info msg = "Graph migration to content-addressability took 0.00 seconds"
Jul 14 19:05:13 IONOS-1 dockerd[123469]: time = "2024-07-14T19:05:13.068075039+02:00" level=warning msg = "Your kernel does not support cgroup blkio weight"
Jul 14 19:05:13 IONOS-1 dockerd[123469]: time = "2024-07-14T19:05:13.068092922+02:00" level=warning msg = "Your kernel does not support cgroup blkio weight_device"
Jul 14 19:05:13 IONOS-1 dockerd[123469]: time = "2024-07-14T19:05:13.068447780+02:00" level=info msg = "Loading containers: start."
Jul 14 19:05:13 IONOS-1 dockerd[123469]: time = "2024-07-14T19:05:13.278561566+02:00" level=info msg = "Default bridge (docker0) is assigned with an IP address 172.17.0.0/16. Daemon option --bip can be used to>
Jul 14 19:05:13 IONOS-1 dockerd[123469]: time = "2024-07-14T19:05:13.370232284+02:00" level=info msg = "Loading containers: done."
Jul 14 19:05:13 IONOS-1 dockerd[123469]: time = "2024-07-14T19:05:13.390172816+02:00" level=info msg = "Docker daemon" commit=4c52b90 graphdriver(s)=overlay2 version=18.09.1
Jul 14 19:05:13 IONOS-1 dockerd[123469]: time = "2024-07-14T19:05:13.390223822+02:00" level=info msg = "Daemon has completed initialization"
Jul 14 19:05:13 IONOS-1 dockerd[123469]: time = "2024-07-14T19:05:13.455692794+02:00" level=info msg = "API listen on /var/run/docker.sock"
Jul 14 19:05:13 IONOS-1 systemd[1]: Started Docker Application Container Engine.

Мое расследование предупреждений относительно blkio показало, что ими можно пренебречь.

Мой оригинальный стек

Когда я запускаю процесс запуска, например docker stack deploy -c /root/external.net/wp/docker-compose.yml wp, я замечаю, что все контейнеры появляются в обзоре со статусом created, но ни один из них не переходит в статус running, как обычно:

Creating network wp_back_ntw
Creating service wp_adm
Creating service wp_joe
Creating service wp_wp
Creating service wp_master

Вместо этого через некоторое время все контейнеры перезапускаются, и это повторяется бесконечно, накапливая created контейнеры, ни разу не приводя ни к одному из них running. Я убедился, что ни один из контейнеров в моем файле .yml не имеет инструкции по перезапуску, поэтому я уверен, что не перезапущу себя.

Сначала я попытался удалить мусор с помощью своей универсальной команды очистки:

docker ps -a | grep 'ted'| awk {'print $1'} |xargs docker rm -v; docker ps -a | grep 'ead'| awk {'print $1'} |xargs docker rm -v

Но это не останавливает процесс воспроизведения, он просто начинается заново. Поэтому, не мудрствуя лукаво, я прибегнул к серии команд, которые скопировал откуда-то еще (не понимая последствий), но ранее успешно использовал несколько раз:

systemctl stop docker
rm -rf /var/lib/docker
systemctl start docker

Эта процедура прошла нормально, как и ожидалось.

Отступая назад

Чтобы изолировать проблемы и получить больше понимания, я переключился на использование команды run и обычных тестовых процедур, которые обязательно должны работать как положено:

docker run -d --name loop-demo alpine sh -c "while true; do sleep 1; done"
docker run -d --name sleep-demo alpine sleep infinity
docker run -d --name tail-demo alpine tail -f /dev/null
docker run -dt --name tty-demo alpine

Я ожидал, что эти контейнеры будут работать бесконечно, но докер надежно завершил их работу через 5 минут:

# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS                        PORTS               NAMES
5666ba05baf1        alpine              "sh -c 'while true; …"   About a minute ago   Exited (137) 34 seconds ago                       loop-demo
cef06c31d246        alpine              "sleep infinity"         2 minutes ago        Exited (137) 34 seconds ago                       sleep-demo
cd813e81f3c6        alpine              "/bin/sh"                3 minutes ago        Exited (137) 34 seconds ago                       tty-demo
8aa49ec219cd        alpine              "tail -f /dev/null"      5 minutes ago        Exited (137) 33 seconds ago                       tail-demo

Этого не ожидается. Кроме того, мне непонятен лог, например:

# docker logs cd813e81f3c6
/ #

Я попробовал то же самое с контейнером в своем стеке, и результат тот же: он работает всего 5 минут. Ну, по крайней мере, он работает до сих пор и не остается навсегда в режиме created, в отличие от развертывания в виде стека. Мне это все очень незнакомо и непонятно. Наконец у меня закончились идеи, и я смиренно обращаюсь за помощью.

Есть идеи или идеи?

Теперь мои вопросы:

  • кто-нибудь когда-нибудь сталкивался с таким поведением
  • Что я делаю не так
  • чему я могу научиться из этой установки
  • как я могу продолжить расследование этого сценария
  • и как мне сделать так, чтобы все работало так же надежно, как и раньше?
  • и, наконец, как это вообще могло произойти?

Спасибо за чтение и ваши усилия.

Привет, я думаю, в этом случае было бы лучше проверить ресурсы хост-узла и системные журналы. Потому что ваш контейнер завершился с кодом 137 , и это может означать, что контейнер был закрыт, потому что он использовал больше памяти, чем разрешено (OOM). 1. Найдите журналы ошибок journalctl -u dockerjournalctl -fjournalctl | grep "too many open files"journalctl | grep -i 'out of memory' 2. Проверьте, достаточно ли памяти или диска free -hdf -h

Kade Youn 15.07.2024 04:27

А также проверьте, заполнен ли buff/cache, в этом случае лучше очистить кеш

Kade Youn 15.07.2024 04:30

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

tripleee 15.07.2024 08:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В случае, если Docker исправен (см. комментарий @kade-youn, чтобы проверить это), а затем, чтобы выяснить, почему Docker уничтожил бы исправный в остальном контейнер, используйте docker inspect <container_id>:

Найдите идентификатор убитого контейнера. например docker container ls --all

Проверка остановленного контейнера может сказать вам, почему докер остановил его — обычно проверка работоспособности (если установлена) или нехватка памяти:

например

❯ docker container ls --all
CONTAINER ID   IMAGE                             COMMAND                  CREATED       STATUS                     PORTS      NAMES
28aa07338440   gcr.io/cadvisor/cadvisor:latest   "/usr/bin/cadvisor -…"   5 days ago    Exited (255) 2 days ago    8080/tcp   prometheus_cadvisor.vks4pi2inixb3kpm0ivc3gynt.n9uvbj1ujxhfv4v13cbtsp0ff
❯ docker container inspect 28aa --format '{{json .State}}' | jq
{
  "Status": "exited",
  "Running": false,
  "Paused": false,
  "Restarting": false,
  "OOMKilled": false,
  "Dead": false,
  "Pid": 0,
  "ExitCode": 255,
  "Error": "",
  "StartedAt": "2024-07-10T06:22:52.676158847Z",
  "FinishedAt": "2024-07-12T10:21:08.633161044Z",
  "Health": {
    "Status": "healthy",
    "FailingStreak": 0,
    "Log": [
      {
        "Start": "2024-07-12T10:14:02.255315062Z",
        "End": "2024-07-12T10:14:02.293230789Z",
        "ExitCode": 0,
        "Output": ""
      },
  ...
Ответ принят как подходящий

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

Я должен был воспринять обычное выполнение every 5 minutes как подсказку, чтобы сразу же просмотреть мою работу cron. Почему?

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

В результате этих мер я сам удалял контейнеры каждые 5 минут. Бинго! Поздравляем!

Однако после переустановки я получил много свободного места, поэтому в будущем эта проблема не должна возникнуть снова.

Большое спасибо всем, кто пытался решить мою проблему. Я воспринимаю эту историю как урок, чтобы смотреть в нужное место.

Другие вопросы по теме