Docker: діагностика типових проблем
Контейнер перезапускається, порт зайнятий, місця не залишилося, «permission denied», сервіс не бачить сусіда — таблиця симптомів і процедура діагностики.
Оновлено 23 серпня 2026 р.
Майже всі проблеми з контейнерами зводяться до десятка типових. Діагностика завжди починається з тих самих трьох команд.
Перші три команди
docker compose ps
docker compose logs --tail 100 <service>
docker inspect -f '{{.State.Status}} {{.State.ExitCode}} {{.State.OOMKilled}} {{.State.Error}}' <container>
Статус, останні рядки логу та код виходу відповідають на більшість питань. Далі працюйте від симптому.
Таблиця симптомів
| Симптом | Ймовірна причина | Що робити |
|---|---|---|
Постійно Restarting | Застосунок падає під час запуску | docker compose logs --tail 200, читайте першу помилку, а не останню |
Код виходу 137, OOMKilled: true | Бракує пам'яті | Збільште ліміт або знайдіть витік, див. обмеження ресурсів |
| Код виходу 1 одразу після запуску | Помилка в конфігурації або змінних | docker compose config — перевірте підстановки |
port is already allocated | Порт зайнятий іншим процесом | sudo ss -tulpn | grep :<port> |
no space left on device | Забракло місця на диску або inode | df -h і df -i, див. місце на диску |
permission denied на файлі тому | Незбіг UID | docker compose exec app id, потім chown або PUID/PGID |
| Застосунок не бачить базу даних | Різні мережі або запит до localhost | Див. мережі Docker |
Cannot connect to the Docker daemon | Сервіс не запущений або бракує прав | sudo systemctl status docker, група docker |
| Усе повільно, навантаження низьке | Вузьке місце — диск | iostat -x 2, див. швидкість диска |
Контейнер падає, але лог порожній
Так буває, коли процес завершується, перш ніж щось надрукувати. Запустіть образ вручну з оболонкою замість основної команди:
docker run --rm -it --entrypoint sh <image>
Усередині виконайте команду запуску вручну — помилка з'явиться на екрані. Заодно перевірте, чи на місці файли конфігурації:
docker compose run --rm app cat /app/config.yaml
Зміни не застосовуються
Класика: ви редагуєте файл, перезапускаєте — і нічого не змінюється.
docker compose config # does Compose see your changes
docker compose up -d --force-recreate app
docker compose exec app cat /etc/app/config.yaml
Зазвичай причин дві: файл змонтований не туди, де ви думаєте, або контейнер бачить копію, що потрапила в образ під час збирання.
Не виправляйте проблему через
docker system prune -a. Вона видаляє невикористані образи, мережі та кеш збирання, а з прапорцем--volumes— ще й томи з даними. Том стає «невикористаним» у момент, коли його контейнер зупинено. Спершу з'ясуйте причину, потім прибирайте.
Коли все ж таки прибирати
docker system df
docker image prune
docker builder prune
docker container prune
docker system df покаже, що саме займає місце: образи, кеш збирання, томи чи логи контейнерів. Зазвичай винний кеш збирання — видаляти його безпечно.
Якщо машина не відповідає
SSH не підключається, сайт не відкривається — зазвичай контейнер з'їв пам'ять, і система пішла в swap. Заходьте через консоль у панелі машини. Для htop і btop потрібен режим «Screen»: розмір вікна не передається текстовим рядком, тож він завжди 80×24.
free -h
sudo dmesg -T | tail -40
sudo systemctl restart docker
Якщо система взагалі не завантажується, перемкніть режим завантаження на рятувальний диск SystemRescue у вкладці «Доступ»: машина перезавантажиться в нього, вхід під root без пароля, а диск буде видно як /dev/sda. Звідти можна змонтувати розділ і забрати дані.
Що перевірити до, а не після
- Ліміти розміру логів встановлені — див. логи контейнерів.
- Ліміти пам'яті встановлені для всіх сервісів.
- Версії образів закріплені, а старий образ не видалено — див. оновлення контейнерів.
- Копія даних існує й перевірена — див. навчання відновленню.