В течение многих лет я без проблем запускал два веб-сайта, используя несколько контейнеров 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
, в отличие от развертывания в виде стека. Мне это все очень незнакомо и непонятно. Наконец у меня закончились идеи, и я смиренно обращаюсь за помощью.
Теперь мои вопросы:
Спасибо за чтение и ваши усилия.
А также проверьте, заполнен ли buff/cache
, в этом случае лучше очистить кеш
Stack Overflow предназначен для вопросов по программированию. Возможно, вы захотите изучить наш родственный сайт Unix & Linux , но, пожалуйста, прочитайте их справочные страницы, прежде чем спрашивать там (и, пожалуйста, удалите этот пост не по теме и просмотрите наш справочный центр, прежде чем публиковать здесь снова).
В случае, если 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 минут. Бинго! Поздравляем!
Однако после переустановки я получил много свободного места, поэтому в будущем эта проблема не должна возникнуть снова.
Большое спасибо всем, кто пытался решить мою проблему. Я воспринимаю эту историю как урок, чтобы смотреть в нужное место.
Привет, я думаю, в этом случае было бы лучше проверить ресурсы хост-узла и системные журналы. Потому что ваш контейнер завершился с кодом 137 , и это может означать, что контейнер был закрыт, потому что он использовал больше памяти, чем разрешено (OOM). 1. Найдите журналы ошибок
journalctl -u docker
journalctl -f
journalctl | grep "too many open files"
journalctl | grep -i 'out of memory'
2. Проверьте, достаточно ли памяти или дискаfree -h
df -h