Docker упрощает развёртывание, но привносит собственный класс проблем — сетевые неполадки, ошибки прав доступа, ограничения ресурсов и сбои сборки. Быстрая диагностика и устранение проблем Docker критически важны для поддержания скорости разработки и стабильности production. В этом руководстве рассматриваются распространённые проблемы Docker и способы их решения с точки зрения senior-разработчика.
Почему важны навыки устранения неполадок
Устранение неполадок Docker позволяет:
- Ускорить разработку: быстро разблокировать себя и коллег
- Надёжность production: минимизировать простои из‑за проблем с контейнерами
- Эффективность использования ресурсов: выявлять утечки памяти и «пожирателей» ресурсов
- Безопасность: понимать и исправлять проблемы с правами доступа и сетью
- Оптимизация затрат: предотвращать неконтролируемые контейнеры, потребляющие ресурсы
Диагностические команды
Проверка статуса Docker
# Статус Docker daemon
sudo systemctl status docker
# Логи Docker daemon
sudo journalctl -u docker.service
# Информация Docker
docker info
# Версия Docker
docker version
Диагностика контейнеров
# Список всех контейнеров
docker ps -a
# Логи контейнера
docker logs container_name
docker logs -f container_name # Следить/стримить
docker logs --tail 100 container_name # Последние 100 строк
docker logs --since 1h container_name # Последний час
# Детали контейнера
docker inspect container_name
# Использование ресурсов
docker stats
docker stats container_name --no-stream
# Процессы внутри контейнера
docker top container_name
# Выполнить диагностические команды
docker exec -it container_name sh
docker exec container_name cat /etc/hosts
docker exec container_name env
Распространённые проблемы и решения
1. Контейнер не запускается
Симптом: контейнер завершается сразу после запуска.
# Проверить код завершения
docker ps -a --filter "name=container_name"
# Просмотреть логи
docker logs container_name
Распространённые причины:
# Код завершения 0: процесс успешно завершён (проверьте, что команда выполняется в foreground)
# Исправление: убедитесь, что основной процесс работает в foreground
# Плохо: CMD service nginx start
# Хорошо: CMD ["nginx", "-g", "daemon off;"]
# Код завершения 1: ошибка приложения
# Проверьте логи на наличие stack trace
# Код завершения 137: нехватка памяти (OOM killed)
# Увеличьте лимит памяти
docker run -m 512m my-app
# Код завершения 139: ошибка сегментации (segmentation fault)
# Проверьте приложение на проблемы с повреждением памяти
# Код завершения 126: доступ запрещён (permission denied)
# Проверьте права на файлы и пользователя
# Код завершения 127: команда не найдена
# Убедитесь, что пути CMD/ENTRYPOINT указаны корректно
2. Не удаётся подключиться к Docker daemon
Симптом: Cannot connect to the Docker daemon at unix:///var/run/docker.sock
# Запустите Docker daemon
sudo systemctl start docker
# Проверьте, состоит ли текущий пользователь в группе docker
groups
# Добавьте пользователя в группу docker
sudo usermod -aG docker $USER
# Примените изменение группы (или выйдите/войдите в систему)
newgrp docker
# Или
su - $USER
3. Проблемы с сетью контейнеров
Симптом: контейнеры не могут обмениваться данными друг с другом или с интернетом.
# Проверьте конфигурацию сети
docker network ls
docker network inspect bridge
# Проверьте DNS-резолвинг внутри контейнера
docker exec -it container_name nslookup google.com
# Проверьте доступность другого контейнера
docker exec -it container1 ping container2
# Проверьте правила firewall
sudo firewall-cmd --list-all
Решения:
# Контейнеры не выходят в интернет: добавьте DNS в daemon
# /etc/docker/daemon.json
{
"dns": ["8.8.8.8", "8.8.4.4"]
}
sudo systemctl restart docker
# Контейнеры не видят друг друга (CentOS/Firewalld)
sudo firewall-cmd --zone=docker --add-masquerade --permanent
sudo firewall-cmd --reload
sudo systemctl restart docker
# Создайте пользовательскую сеть для взаимодействия контейнеров
docker network create my-network
docker run --network my-network --name container1 image1
docker run --network my-network --name container2 image2
# Теперь контейнеры могут обращаться друг к другу по имени
4. Сбои сборки
Симптом: docker build завершается с различными ошибками.
# Доступ запрещён при чтении каталога
# Добавьте каталог в .dockerignore или исправьте права доступа
echo "problematic-folder" >> .dockerignore
# Слишком большой context (медленные сборки)
# Проверьте, что отправляется
du -sh .
# Добавьте в .dockerignore:
node_modules
.git
*.log
# Не удаётся найти пакет/зависимость
# Проверьте, корректны ли имя/версия пакета
# Попробуйте собрать без cache
docker build --no-cache -t my-app .
# apt-get update завершается с ошибкой
# Проблема сети или устаревший base image
# Попробуйте другой base image или проверьте сеть
docker build --network=host -t my-app .
5. Проблемы с правами доступа к volume
Симптом: приложение не может читать/записывать в примонтированный volume.
# Проверьте права доступа
ls -la /host/path
docker exec container_name ls -la /container/path
# Проверьте пользователя внутри контейнера
docker exec container_name id
# Запускайте контейнер от конкретного пользователя
docker run -u $(id -u):$(id -g) -v /host:/container image
# Исправьте владельца в Dockerfile
RUN chown -R appuser:appuser /app
USER appuser
6. Закончилось место на диске
Симптом: no space left on device
# Проверьте использование диска
docker system df
docker system df -v
# Очистите неиспользуемые ресурсы
docker system prune
# Агрессивная очистка (удаляет все неиспользуемые images)
docker system prune -a
# Удалить все volumes (ПОТЕРЯ ДАННЫХ!)
docker system prune -a --volumes
# Удалить конкретные старые images
docker images --filter "dangling=true" -q | xargs docker rmi
# Удалить контейнеры старше 24 ч
docker container prune --filter "until=24h"
7. Высокое потребление памяти
Симптом: контейнер использует слишком много памяти, система замедляется.
# Проверьте использование памяти
docker stats
# Задайте лимиты памяти
docker run -m 512m --memory-swap 512m my-app
# В docker-compose.yml
services:
app:
deploy:
resources:
limits:
memory: 512M
reservations:
memory: 256M
8. Порт уже используется
Симптом: Bind for 0.0.0.0:80 failed: port is already allocated
# Найдите, что использует порт
sudo lsof -i :80
sudo netstat -tulpn | grep :80
# Найдите контейнер, использующий порт
docker ps --filter "publish=80"
# Остановите контейнер
docker stop container_name
# Или используйте другой порт
docker run -p 8080:80 nginx
9. Сбой DNS-резолвинга
Симптом: Temporary failure resolving 'deb.debian.org' во время сборки.
# Добавьте DNS в Docker daemon
# /etc/docker/daemon.json
{
"dns": ["1.1.1.1", "8.8.8.8"]
}
sudo systemctl restart docker
# Или выполняйте сборку с host networking
docker build --network=host -t my-app .
10. Проблемы с SSL-сертификатами
Симптом: self-signed certificate in certificate chain
# Для Node.js в разработке (НЕ для production!)
docker run -e NODE_TLS_REJECT_UNAUTHORIZED=0 my-node-app
# Установите пользовательский CA-сертификат в Dockerfile
COPY my-ca.crt /usr/local/share/ca-certificates/
RUN update-ca-certificates
Проблемы Docker Compose
Контейнеры не взаимодействуют
# Убедитесь, что контейнеры находятся в одной сети
services:
web:
networks:
- app-network
db:
networks:
- app-network
networks:
app-network:
driver: bridge
Переменные окружения не загружаются
# Проверьте расположение файла .env (в той же директории, что и docker-compose.yml)
# Проверьте синтаксис переменных в docker-compose.yml
services:
app:
environment:
- DATABASE_URL=${DATABASE_URL} # Из .env
- STATIC_VALUE=hardcoded # Литеральное значение
Volumes не синхронизируются
# Удалите volumes и создайте заново
docker-compose down -v
docker-compose up -d
# Проверьте путь монтирования volume
docker-compose config # Показывает итоговую конфигурацию
Платформенно-специфичные проблемы
macOS Docker Desktop
# Медленная синхронизация файлов с volumes
# Используйте флаги :cached или :delegated
volumes:
- ./src:/app/src:cached
# Закончилось место на диске
# Docker Desktop -> Preferences -> Resources -> Disk
Linux с SELinux
# Доступ запрещён для volumes
# Добавьте флаг :z или :Z
docker run -v /host:/container:z image
# Или отключите SELinux для Docker
# Не рекомендуется для production
Apple Silicon (M1/M2)
# Image несовместим
# Укажите platform
services:
app:
platform: linux/amd64
image: some-x86-only-image
Ключевые выводы
- Сначала проверяйте логи:
docker logs выявляет большинство проблем - Проверяйте всё:
docker inspect показывает детали конфигурации - Сетевые проблемы встречаются часто: пользовательские сети решают большинство проблем с подключением
- Регулярно очищайте: предотвращайте проблемы с дисковым пространством с помощью
docker system prune - Лимиты ресурсов важны: задавайте лимиты памяти, чтобы предотвращать проблемы OOM
- Права доступа — сложная тема: сопоставляйте пользователя контейнера с владельцем файлов на хосте
Устранение неполадок Docker становится интуитивным с практикой — большинство проблем относится к предсказуемым категориям с известными решениями.