SystemdDoctor
служба не работает docker конфигурация

Docker: unable to configure the Docker daemon — конфликт -H и hosts

Адрес демона Docker можно задать либо ключом -H в unit-файле, либо параметром hosts в daemon.json — но не двумя способами одновременно. При конфликте демон завершается с сообщением о том, что адрес указан дважды.

Что это значит

Причина частая: в дистрибутивном unit-файле уже стоит -H fd://, а администратор добавляет hosts в daemon.json, следуя руководству. Правильный порядок — убрать ключ из unit-файла через переопределение и оставить настройку в одном месте.

Вероятные причины

По порядку: сверху то, что встречается чаще.

  1. Адрес задан и в unit-файле, и в daemon.json

    Демон не может выбрать, какой источник главнее, и отказывается работать. Это защита от неоднозначности.

  2. Сокет-активация вместе с явным адресом

    Значение fd:// означает получение дескриптора от docker.socket. Явный адрес в daemon.json с этим конфликтует.

Диагностика

Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.

Ключи запуска демона из действующего unit-файла.

systemctl cat docker | grep ExecStart

Настройка адреса в файле демона.

sudo grep -i hosts /etc/docker/daemon.json

Сообщение о конфликте.

journalctl -u docker -n 20 --no-pager

Решение

Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.

1. Адрес задан и в unit-файле, и в daemon.json
Почему происходит
Демон не может выбрать, какой источник главнее, и отказывается работать. Это защита от неоднозначности.
Как проверить
Посмотрите оба источника.
systemctl cat docker | grep -E "^ExecStart"
sudo grep -i hosts /etc/docker/daemon.json
Как исправить
Оставьте настройку в одном месте. Чтобы убрать ключ из unit-файла, сбросьте команду запуска в переопределении и задайте её заново без него.
sudo systemctl edit docker   # [Service]\nExecStart=\nExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock
2. Сокет-активация вместе с явным адресом
Почему происходит
Значение fd:// означает получение дескриптора от docker.socket. Явный адрес в daemon.json с этим конфликтует.
Как проверить
Посмотрите состояние сокета и настройку.
systemctl status docker.socket --no-pager | head -6
sudo grep -i hosts /etc/docker/daemon.json
Как исправить
Выберите один способ: сокет-активацию (оставить fd://) или явный адрес (убрать сокет из автозапуска).

Пример вывода

Адрес задан двумя способами. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.

dockerd[4300]: unable to configure the Docker daemon with file /etc/docker/daemon.json: the following directives are specified both as a flag and in the configuration file: hosts: (from flag: [fd://], from file: [unix:///var/run/docker.sock])
systemd[1]: docker.service: Main process exited, code=exited, status=1/FAILURE

Связанные ошибки

Где встречается чаще всего

Источники

  • Документация Docker: настройка демона через systemd документация программы
    сверено 15 сентября 2026
  • Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
    Воспроизведено добавлением hosts в daemon.json при -H fd:// в unit-файле.
    собственная проверка, systemd 255
    сверено 15 сентября 2026