Docker: демон не запускается без containerd
Демон Docker не работает сам по себе: запуском контейнеров занимается containerd. Если тот не поднялся, Docker завершается с ошибкой подключения к его сокету, и разбираться надо с containerd, а не с Docker.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Служба containerd не запущена или упала
Docker подключается к сокету containerd при старте. Нет сокета — нет запуска.
-
Путь к сокету containerd в ключах Docker неверен
После ручной установки или обновления путь мог измениться. Ключ
--containerd=указывает на несуществующий сокет. -
Свой containerd конфликтует с поставляемым Docker
Установка containerd из отдельного пакета поверх версии от Docker приводит к двум конкурирующим службам.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Состояние обеих служб рядом.
systemctl status containerd docker --no-pager | head -20Причина падения containerd.
journalctl -u containerd -n 40 --no-pagerСуществует ли сокет containerd.
sudo ss -xln | grep containerdРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Docker подключается к сокету containerd при старте. Нет сокета — нет запуска.
- Как проверить
-
Посмотрите состояние обеих служб.
systemctl status containerd --no-pager | head -8 systemctl status docker --no-pager | head -8
- Как исправить
-
Запустите containerd и разберитесь, почему он падал: его журнал содержит причину.
sudo systemctl start containerd && sudo systemctl start docker
- Почему происходит
- После ручной установки или обновления путь мог измениться. Ключ
--containerd=указывает на несуществующий сокет.
- Как проверить
-
Сравните ключ и фактический сокет.
systemctl cat docker | grep containerd sudo ss -xln | grep containerd
- Как исправить
- Приведите путь к фактическому. Обычно это /run/containerd/containerd.sock.
- Почему происходит
- Установка containerd из отдельного пакета поверх версии от Docker приводит к двум конкурирующим службам.
- Как проверить
-
Посмотрите, сколько служб containerd есть в системе.
systemctl list-unit-files "*containerd*" --no-pager command -v containerd
- Как исправить
- Оставьте одну реализацию: либо из репозитория Docker, либо системную. Смешение приводит к неочевидным сбоям.
Пример вывода
Docker не может подключиться к containerd. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
dockerd[4500]: failed to start containerd: timeout waiting for containerd to start
dockerd[4500]: failed to start daemon: failed to dial "/run/containerd/containerd.sock": connection refused
systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE
systemd[1]: docker.service: Failed with result 'exit-code'.
Связанные ошибки
- Connection refused в журнале службы Соединение отклонено: служба не может подключиться к базе, кешу или другому сервису. Порядок запуска, адрес, брандмауэр.
- Dependency failed for … и результат 'dependency' Сообщение Dependency failed for: служба не запускалась, потому что упала её зависимость. Как найти настоящего виновника.
- Docker: unable to configure the Docker daemon with file daemon.json Демон Docker не запускается из-за ошибки в /etc/docker/daemon.json: неверный JSON или неизвестный ключ.
- Контейнеры не поднимаются при загрузке сервера Контейнеры с политикой перезапуска не стартуют после перезагрузки: docker не включён, тома на неподмонтированном разделе, своя служба без зависимостей.
- Docker и kubelet: несовпадение драйвера cgroup Драйвер контрольных групп Docker не совпадает с systemd: предупреждения, нестабильная работа контейнеров, проблемы с kubelet.
- Docker: no space left on device при запуске контейнеров Раздел с /var/lib/docker заполнен образами и слоями. Как посчитать занятое и что можно удалить безопасно.
- Docker: unable to configure the Docker daemon — конфликт -H и hosts Адрес прослушивания задан дважды: ключом -H в unit-файле и параметром hosts в daemon.json. Демон отказывается стартовать.
- Docker: имена не разрешаются внутри контейнера Контейнеры не разрешают имена: конфликт с локальным разрешателем, неверные серверы в daemon.json, отключённый проброс.
Где встречается чаще всего
Источники
- Документация Docker: устройство демона и containerd
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено остановкой containerd при работающем docker.