LinuxСредняя

Контейнер Docker не запускается: причины и способы решения

Разбираем типичные причины ошибки «container failed to start» в Docker и Docker Compose. Пошаговые инструкции по диагностике и устранению проблем с запуском контейнеров на Linux.

Обновлено 9 апреля 2026 г.
10-15 мин
Средняя
FixPedia Team
Применимо к:Docker 20.10+Docker Compose 2.0+Ubuntu 20.04+Debian 11+CentOS 8+

Что означает ошибка «container failed to start»

Ошибка «container failed to start» (или «Error starting container») означает, что Docker не смог запустить контейнер после команды docker run или docker-compose up. Контейнер создаётся, но переходит в состояние Exited с ненулевым кодом возврата.

Типичные проявления проблемы:

  • Команда docker-compose up завершается с ошибкой
  • Контейнер постоянно перезапускается (restart loop)
  • После docker start контейнер сразу останавливается

Полный текст ошибки может выглядеть так:

Error response from daemon: driver failed programming external connectivity on endpoint

или

OCI runtime create failed: container_linux.go: starting container process caused process

Причины возникновения

  1. Конфликт портов — порт, который пытается занять контейнер, уже используется другим процессом или контейнером
  2. Ошибка в приложении — приложение внутри контейнера падает из-за неправильной конфигурации, отсутствия зависимостей или ошибок в коде
  3. Проблемы с томами (volumes) — неверный путь для монтирования, отсутствие прав на чтение/запись, несуществующая директория на хосте
  4. Недостаток ресурсов — не хватает оперативной памяти, места на диске или CPU
  5. Проблемы с сетью — неправильная конфигурация сетевого драйвера, отсутствие доступа к интернету для загрузки образов
  6. Повреждённый или отсутствующий образ — образ не был правильно собран или удалён
  7. Неверные права доступа — пользователь внутри контейнера не имеет прав на запуск процессов или доступ к файлам
  8. Ошибки в CMD/ENTRYPOINT — неправильная команда запуска в Dockerfile

Способы решения

Способ 1: Диагностика через логи

Первое, что нужно сделать — посмотреть логи контейнера. Они покажут точную причину ошибки.

# Просмотр всех контейнеров и их статус
docker ps -a

# Получение логов конкретного контейнера
docker logs container_name

# Логи в реальном времени (если контейнер пытается запуститься)
docker logs -f container_name

💡 Совет: Если контейнер постоянно перезапускается, используйте docker events для отслеживания в реальном времени.

Способ 2: Проверка конфликтов портов

Частая причина — порт уже занят. Проверьте и освободите его.

# Найдите процесс, занимающий порт (например, 8080)
sudo lsof -i :8080

# Или с помощью netstat
sudo netstat -tulpn | grep 8080

# Остановите контейнер или процесс, занимающий порт
docker-compose down
# или
sudo kill <PID>

Измените порт в docker-compose.yml:

services:
  web:
    ports:
      - "8081:80"  # Измените на свободный порт

Способ 3: Проверка прав доступа к томам

Если в логах ошибка «permission denied», проблема в правах на монтируемые директории.

# Проверьте владельца директории
ls -la /path/to/volume

# Измените владельца на текущего пользователя
sudo chown -R $(id -u):$(id -g) /path/to/volume

# Или для конкретного пользователя
sudo chown -R user:group /path/to/volume

В Dockerfile можно добавить создание пользователя:

RUN usermod -u 1000 appuser
USER appuser

Способ 4: Проверка системных ресурсов

Недостаток памяти или места на диске — частая причина отказа контейнеров.

# Проверка свободной оперативной памяти
free -h

# Проверка места на диске
df -h

# Очистите неиспользуемые образы и контейнеры
docker system prune -a

Способ 5: Пересборка образа

Образ может быть повреждён или содержать устаревшие зависимости.

# Остановите все контейнеры
docker-compose down

# Пересоберите образ без кэша
docker-compose build --no-cache

# Запустите заново
docker-compose up -d

Или для отдельного образа:

docker build -t my_image --no-cache .
docker run -d my_image

Способ 6: Проверка конфигурации Docker Compose

Ошибки в docker-compose.yml часто приводят к проблемам с запуском.

version: '3.8'
services:
  app:
    build: .
    restart: always  # Автоперезапуск при падении
    environment:
      - NODE_ENV=production
    volumes:
      - ./data:/app/data  # Проверьте пути
    ports:
      - "3000:3000"
    depends_on:         # Проверьте зависимости
      - db
  db:
    image: postgres:14
    volumes:
      - db_data:/var/lib/postgresql/data

volumes:
  db_data:

⚠️ Важно: Убедитесь, что все пути в volumes существуют на хосте, а переменные окружения имеют корректные значения.

Способ 7: Проверка состояния Docker демона

Иногда проблема в самом Docker.

# Проверьте статус демона
sudo systemctl status docker

# Перезапустите Docker
sudo systemctl restart docker

# Проверьте логи Docker
sudo journalctl -u docker -f

Профилактика

Чтобы избежать проблем с запуском контейнеров в будущем:

  • Используйте restart: always в docker-compose.yml для автоматического перезапуска при падении
  • Регулярно очищайте систему: docker system prune -a раз в месяц
  • Укажите явные версии образов (например, postgres:14, а не postgres:latest)
  • Настройте мониторинг — используйте docker stats для отслеживания потребления ресурсов
  • Ведите документацию — записывайте все особенности конфигурации и зависимости
  • Тестируйте на стейдже — перед деплоем проверяйте запуск контейнеров в тестовом окружении

Часто задаваемые вопросы

Почему контейнер сразу завершается после запуска?
Как исправить ошибку «port is already allocated»?
Контейнер не запускается после перезагрузки сервера
Как понять, что проблема в правах доступа?

Полезное

Проверьте статус контейнера и логи
Проверьте доступность портов
Проверьте ресурсы системы
Пересоберите образ
Проверьте конфигурацию