Что означает ошибка "Cannot connect to the Docker daemon"
Ошибка Cannot connect to the Docker daemon (или docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?) означает, что клиентская утилита docker (например, команда docker ps) не может установить соединение с фоновым процессом — демоном Docker (dockerd).
Демон — это сервис, который управляет всеми объектами Docker: образами, контейнерами, сетями, томами. Без работающего демона любые команды docker бесполезны. Ошибка появляется мгновенно, сразу после ввода команды, и обычно не содержит длинного трассировочного стека.
Причины возникновения
- Служба Docker остановлена. Наиболее частая причина. Демон просто не запущен в системе.
- Служба завершилась с ошибкой (failed). Docker пытался запуститься, но столкнулся с проблемой (например, конфликт порта, ошибка в конфигурации
daemon.json, нехватка памяти). - Docker не настроен на автозагрузку. После перезагрузки компьютера служба не стартует автоматически.
- Конфликт портов. Если в
/etc/docker/daemon.jsonили в аргументах запуска указан TCP-порт (например,-H tcp://0.0.0.0:2375), а этот порт уже занят другим приложением, демон не сможет запуститься. - Повреждение файлов Docker. Критические файлы пакета (бинарники, конфиги) могли быть повреждены при обновлении или аварийном завершении.
- Недостаток прав у пользователя. Пользователь, запускающий
docker, не имеет прав на доступ к сокету/var/run/docker.sock(хотя это обычно вызываетPermission denied, а не "daemon not running", но может быть связано).
Способ 1: Запуск и проверка статуса службы через systemd
В современных дистрибутивах Linux (Ubuntu, Debian, CentOS 7+, RHEL 7+, Fedora) Docker управляется через systemd.
- Проверьте статус службы:
sudo systemctl status docker
Ищите строкуActive:. Если онаinactive (dead)илиfailed— служба не работает. - Запустите службу:
sudo systemctl start docker - Включите автозагрузку (чтобы не запускать вручную после каждой перезагрузки):
sudo systemctl enable docker
Вы увидите создание символической ссылки. - Убедитесь, что демон работает:
sudo systemctl is-active docker
Команда должна вернутьactive. - Попробуйте выполнить команду Docker:
docker version
Илиdocker ps
💡 Совет: Если
systemctl start dockerзавершается мгновенно без ошибок, ноstatusпоказываетfailed, посмотрите логи:sudo journalctl -u docker.service --no-pager -n 50.
Способ 2: Диагностика через логи systemd
Если служба не запускается, её логи содержат причину сбоя.
- Просмотрите последние записи лога службы Docker:
sudo journalctl -u docker.service --no-pager -n 100
Ищите строки, начинающиеся сdocker[...]:или просто сообщения об ошибках (error,failed,cannot). - Типичные ошибки в логах и их решения:
Error starting daemon: pid file found, ensure Docker is not running or delete /var/run/docker.pid— удалите файл блокировки:sudo rm /var/run/docker.pidи попробуйте снова.failed to start daemon: port is already allocated— конфликт порта. Найдите процесс, занимающий порт (по умолчанию для Unix-сокета конфликта нет, но если используется TCP):sudo lsof -i :2375. Остановите конфликтующий процесс или измените порт Docker в/etc/docker/daemon.json.Error initializing graphdriver: overlay— проблема с драйвером хранения (overlay/overlay2). Часто решается обновлением ядра или переключением драйвера вdaemon.json.
Способ 3: Проверка и настройка конфигурационного файла
Некорректный JSON в /etc/docker/daemon.json может помешать запуску.
- Проверьте синтаксис файла:
sudo cat /etc/docker/daemon.json | python3 -m json.tool > /dev/null && echo "JSON valid" || echo "JSON invalid"
Если выводJSON invalid, отредактируйте файл (sudo nano /etc/docker/daemon.json) и исправьте ошибки (лишние запятые, неверные кавычки). - Временно отключите конфигурацию для теста:
sudo mv /etc/docker/daemon.json /etc/docker/daemon.json.bak sudo systemctl restart docker
Если после этого Docker запустился — проблема в конфигурации. Восстанавливайте настройки по одной, перезапуская службу после каждого изменения.
Способ 4: Проверка системных ресурсов и зависимостей
Демону Docker могут требоваться определённые ресурсы или модули ядра.
- Убедитесь, что модуль ядра
overlayзагружен (для драйвера overlay2):lsmod | grep overlay
Если вывод пуст, загрузите модуль:sudo modprobe overlay. - Проверьте, достаточно ли места в разделе
/var. Docker хранит образы и данные там. Если место закончилось, демон может не запуститься:df -h /var - Для дистрибутивов на основе RHEL/CentOS: Убедитесь, что установлен пакет
containerd.ioи он работает:sudo systemctl status containerd
Способ 5: Полная переустановка Docker (если другие способы не помогли)
- Удалите пакеты Docker:
Для Debian/Ubuntu:
sudo apt-get purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo rm -rf /var/lib/docker /etc/docker
Для RHEL/CentOS/Fedora:sudo yum remove docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin sudo rm -rf /var/lib/docker /etc/docker - Установите Docker заново, следуя официальному гайду для вашего дистрибутива. Это гарантирует получение корректных зависимостей и конфигурационных файлов.
Профилактика
- Всегда включайте автозагрузку: После первой установки Docker сразу выполните
sudo systemctl enable docker. - Следите за обновлениями ядра: При обновлении ядра (особенно в RHEL-совместимых дистрибутивах) может потребоваться перезагрузка. После перезагрузки проверяйте статус Docker.
- Не редактируйте
/etc/docker/daemon.jsonбез проверки синтаксиса. Используйте валидатор JSON или командуpython3 -m json.tool. - Регулярно проверяйте место на диске, особенно в
/var/lib/docker. Логи контейнеров могут быстро расти. - Избегайте запуска Docker вручную (
dockerd &). Всегда используйтеsystemctl, чтобы systemd мог корректно управлять процессом и перехватывать его логи.