О нас Руководства Проекты Контакты
Админка
пожалуйста подождите

Docker упрощает развёртывание, но привносит собственный класс проблем — сетевые неполадки, ошибки прав доступа, ограничения ресурсов и сбои сборки. Быстрая диагностика и устранение проблем Docker критически важны для поддержания скорости разработки и стабильности production. В этом руководстве рассматриваются распространённые проблемы Docker и способы их решения с точки зрения senior-разработчика.

Почему важны навыки устранения неполадок

Устранение неполадок Docker позволяет:

  1. Ускорить разработку: быстро разблокировать себя и коллег
  2. Надёжность production: минимизировать простои из‑за проблем с контейнерами
  3. Эффективность использования ресурсов: выявлять утечки памяти и «пожирателей» ресурсов
  4. Безопасность: понимать и исправлять проблемы с правами доступа и сетью
  5. Оптимизация затрат: предотвращать неконтролируемые контейнеры, потребляющие ресурсы

Диагностические команды

Проверка статуса 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

Ключевые выводы

  1. Сначала проверяйте логи: docker logs выявляет большинство проблем
  2. Проверяйте всё: docker inspect показывает детали конфигурации
  3. Сетевые проблемы встречаются часто: пользовательские сети решают большинство проблем с подключением
  4. Регулярно очищайте: предотвращайте проблемы с дисковым пространством с помощью docker system prune
  5. Лимиты ресурсов важны: задавайте лимиты памяти, чтобы предотвращать проблемы OOM
  6. Права доступа — сложная тема: сопоставляйте пользователя контейнера с владельцем файлов на хосте

Устранение неполадок Docker становится интуитивным с практикой — большинство проблем относится к предсказуемым категориям с известными решениями.

 
 
 
Языки
Темы
Copyright © 1999 — 2026
Зетка Интерактив