Не удаётся подключиться к Docker daemon

TL;DR
Если команда docker сообщает «Cannot connect to the Docker daemon», проверьте, что сервис docker работает, что ваш CLI использует правильный endpoint (контекст/DOCKER_HOST) и что у вашей учётной записи есть права доступа к сокету /var/run/docker.sock. Откройте системный журнал и используйте systemctl, dockerd и docker context для диагностики.
Быстрые ссылки
- Признаки проблемы
- Проверить, запущен ли сервис Docker daemon
- Запуск демона вручную
- Убедиться, что CLI обращается к правильному демону
- Проблемы с правами доступа
- Дополнительные сценарии и методики
- Критерии приёмки
- Резюме
Признаки проблемы
Docker CLI зависит от соединения с демоном (daemon). CLI общается с демоном по API через Unix-сокет или TCP. Если настроенный демон недоступен, команды такие как:
docker psdocker rundocker buildбудут выдавать ошибку вида:
$ docker run hello-world:latest
Cannot connect to the Docker daemon at unix:///var/run/docker.sock
Is the docker daemon running?Это говорит о том, что CLI пытался использовать Unix-сокет /var/run/docker.sock, но сокет был недоступен — соединение не удалось.
Иногда в ошибке указан TCP-адрес, например:
Cannot connect to the Docker daemon at tcp:///0.0.0.0:2375В этом случае CLI пытается подключиться по сети к удалённому демону, а не к локальному сокету.
1. Проверить, запущен ли сервис Docker daemon
На большинстве систем Docker управляется systemd-сервисом. Сначала проверьте состояние сервиса:
$ sudo systemctl status dockerОжидаемое состояние:
Active: active (running)Если вы видите inactive (dead) или failed, демон не запущен или завершился с ошибкой. Запустите сервис:
$ sudo systemctl start dockerЧтобы автозапускать Docker после перезагрузки хоста:
$ sudo systemctl enable docker
$ sudo systemctl daemon-reloadКоманда daemon-reload обновляет конфигурацию systemd.
Важно: если systemctl сообщает, что daemon завершился с ошибкой, посмотрите логи:
$ sudo journalctl -u docker --no-pagerЛоги помогут выявить причины — нехватка места, проблемы с драйвером хранения, конфликт портов и т. п.
2. Запуск демона вручную
На системах без systemd или если сервис отсутствует, можно запустить демон напрямую:
$ sudo dockerdПример вывода запуска:
INFO[2022-06-29T15:12:49.303428726+01:00] Starting upDockerd будет работать в текущем терминале до тех пор, пока вы не нажмёте Ctrl+C или не завершите процесс. Этот способ полезен для отладки: вы увидите поток логов в реальном времени.
Советы при ручном запуске:
- Запускайте dockerd с ключом
-Dдля включения дебага. - Если требуется отличная конфигурация (например, задать другой socket или TLS), используйте опции командной строки или файл конфигурации
/etc/docker/daemon.json.
3. Убедиться, что CLI обращается к правильному демону
Проблема часто возникает, когда CLI направлен к удалённому демону. Ошибка с TCP-адресом сигнализирует, что используется сетевой endpoint:
Cannot connect to the Docker daemon at tcp:///0.0.0.0:2375Проверьте текущие контексты Docker и активный endpoint:
$ docker context lsВывод может выглядеть так:
NAME DESCRIPTION DOCKER ENDPOINT
default * Current DOCKER_HOST based configuration unix:///var/run/docker.sockЕсли в колонке DOCKER ENDPOINT вы видите tcp://… — значит CLI направлен на удалённый хост. Частая причина — установлена переменная окружения DOCKER_HOST. Пример:
$ export DOCKER_HOST=1.2.3.4
$ docker context ls
NAME DESCRIPTION DOCKER ENDPOINT
default * Current DOCKER_HOST based configuration tcp://1.2.3.4:2375
Warning: DOCKER_HOST environment variable overrides the active context. To use a context, either set the global --context flag, or unset DOCKER_HOST environment variable.Если DOCKER_HOST установлен, он переопределяет выбранный контекст. Очистите переменную, чтобы вернуться к контексту:
$ export DOCKER_HOST=Или явно выберите контекст:
$ docker context use defaultПосле этого docker будет по умолчанию обращаться к unix:///var/run/docker.sock, если вы не настраивали кастомный контекст.
4. Проблемы с правами доступа
Если демон работает, но у вас нет прав на сокет, команда выдаст ошибку вида:
Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sockUnix-сокет имеет владельца и права доступа. Лучшая практика — добавить пользователя в группу docker:
$ sudo usermod -aG docker $USERПосле изменения групповой принадлежности откройте новый терминал или выполните выход и повторный вход в сессию; изменения вступят в силу только в новой сессии.
Альтернатива (менее рекомендуемая) — запускать команды с sudo:
$ sudo docker psНо постоянный запуск Docker от root не рекомендуется по соображениям безопасности.
Дополнительные сценарии и методики
Ниже — набор практических приёмов для редких или сложных случаев.
Проверка состояния сокета
Посмотрите, существует ли сокет и какие у него права:
$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Jun 29 15:12 /var/run/docker.sockЕсли сокета нет — демон не запущен. Если сокет есть, убедитесь, что ваша учётная запись в группе docker или права позволяют доступ.
Диагностика сетевых попыток
Если CLI пытается подключиться по TCP, проверьте доступность порта:
$ nc -vz 1.2.3.4 2375Если порт закрыт — соединение будет недоступно. Также проверьте брандмауэр и сетевые правила между вашей машиной и хостом демона.
Проверка конфигурации daemon.json
Файл /etc/docker/daemon.json содержит параметры демона. Ошибки в JSON приведут к тому, что systemd не сможет запустить сервис. Валидируйте файл перед перезапуском:
$ sudo cat /etc/docker/daemon.json | jq .Если jq отсутствует, используйте любой JSON-валидатор.
Логи контейнерного движка и драйверов
При ошибках драйверов хранения или сети демон может падать. Изучите journalctl -u docker и системные логи ядра.
Методика быстрого устранения неполадок (минимальный чек-лист)
- Проверить, работает ли systemd-сервис:
sudo systemctl status docker. - Если нет — запустить:
sudo systemctl start dockerи проверить логи:sudo journalctl -u docker. - Проверить, к какому endpoint обращается CLI:
docker context lsиecho $DOCKER_HOST. - Убедиться в правах доступа к
/var/run/docker.sock:ls -l /var/run/docker.sockиid. - При необходимости перезапустить демон и/или пересоздать socket:
sudo systemctl restart docker. - Проверить конфигурацию
/etc/docker/daemon.jsonна валидность.
Decision flowchart
flowchart TD
A[Команда docker выдала ошибку подключения] --> B{systemd?}
B -- Да --> C[Проверить status: sudo systemctl status docker]
C --> D{Active?}
D -- Да --> E[Проверить DOCKER_HOST и context]
D -- Нет --> F[Запустить sudo systemctl start docker и посмотреть логи]
B -- Нет --> G[Запустить sudo dockerd вручную для отладки]
E --> H{Права на /var/run/docker.sock}
H -- Нет --> I[Добавить в группу docker: sudo usermod -aG docker $USER]
H -- Да --> J[Проверить сеть/порт для TCP и firewall](Диаграмма на языке Mermaid; визуализируется в поддерживающих рендер.)
Ролевые чек-листы
Администратор хоста:
- Проверить systemd и логи (journalctl).
- Перезапустить сервис и изучить причину падения демона.
- Проверить диск, inode, SELinux/AppArmor.
- Обновить daemon.json, если конфигурация изменилась.
DevOps/инженер CI:
- Проверить, не поменялся ли DOCKER_HOST в CI-скриптах.
- Убедиться, что сборщики направлены на корректный контекст.
- Проверить workspace на недостаток прав к сокету.
Разработчик:
- Проверить локальную переменную окружения DOCKER_HOST.
- Добавить себя в группу docker или использовать sudo для краткосрочной проверки.
- Попробовать
docker context use default.
SOP: быстрое восстановление доступа (шаги)
- В терминале выполнить
sudo systemctl status docker. - Если сервис не активен, выполнить
sudo systemctl start docker. - Если после старта демон падает — посмотреть
sudo journalctl -u docker --no-pagerи исправить причину. - Проверить контексты:
docker context lsи очистить переменнуюDOCKER_HOST, если нужно:export DOCKER_HOST=. - Проверить права на сокет:
ls -l /var/run/docker.sockи добавить пользователя в группу:sudo usermod -aG docker $USER. - Открыть новый терминал, повторить команду
docker run hello-world:latest.
Критерии приёмки
- docker ps возвращает список контейнеров (или пустой список) без ошибок подключения.
docker infoвыполняется и показывает статус демона и endpoint.- Пользователь может запустить
docker run hello-worldбез sudo, если добавлен в группу docker. - Для CI-систем — все сборочные агенты успешно подключаются к ожидаемому демону.
Когда стандартные подходы не помогут
- Демон запускается, но падает сразу из-за ошибок драйвера хранения — проверьте драйверы и сообщения ядра.
- Сетевая политика в облаке блокирует доступ к удалённому демону — проверьте правила Security Group/Firewall.
- SELinux/AppArmor может блокировать доступ к сокету — исследуйте AVC-логи и профиль безопасности.
Альтернативные подходы
- Использовать Docker-in-Docker (dind) в CI, если нет прямого доступа к демону.
- Перейти на rootless mode, чтобы запускать docker daemon от непривилегированного пользователя (требует настройки).
- Перейти на контейнерную платформу типа Podman, если политика безопасности запрещает демон Docker.
Факты и полезные константы
- Unix-сокет по умолчанию: /var/run/docker.sock
- TCP-порт по умолчанию для неконфигурированного демона: 2375 (обычно небезопасен без TLS)
- Файл конфигурации демона: /etc/docker/daemon.json
Риски и рекомендации по безопасности
- Открытие TCP-порта 2375 без TLS даёт полный доступ к демону и потенциально к хосту — избегайте этого в продакшене.
- Добавление пользователя в группу docker даёт ему привилегии, эквивалентные root в контексте управления контейнерами. Управляйте членством в группе осторожно.
Резюме
Ошибка «Cannot connect to the Docker daemon» означает, что CLI не может связаться с демоном по текущей конфигурации. Чаще всего это простые причины: сервис Docker не запущен, CLI направлен не на тот endpoint (DOCKER_HOST/контекст) или у пользователя нет прав на сокет. Следуйте чек-листам в статье для быстрой диагностики и используйте логи демона для поиска корневой причины.
Важно: при работе с удалёнными демонами всегда проверяйте безопасность соединения (TLS) и сетевые правила.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента