Упрощение среды разработки команды с глобальными настройками демона Docker

Когда вы работаете с Docker как локально, так и на сервере, часто приходится копировать одни и те же настройки в docker-compose.yml для каждого проекта.

  • Устанавливать DNS всегда на 1.1.1.1, 8.8.8.8
  • Фиксировать драйвер логов json-file + max-size=10m
  • Настраивать прокси, insecure registry, диапазон базовой сети и т.д.

Эти параметры можно вынести из конфигурации контейнеров в «глобальные значения хоста», что значительно упрощает управление. Именно для этого предназначен файл глобальных настроек демона Docker (daemon.json).

Ниже разберём:

  • какой файл использовать
  • где его разместить
  • как его написать
  • для кого и в каких случаях это будет полезно

1. Два способа настройки демона Docker



Демон Docker (dockerd) можно настроить двумя основными способами:

  1. Файл JSON‑конфигурации (daemon.json)рекомендуется
  2. Флаги CLI при запуске dockerd

Можно комбинировать оба подхода, но если один и тот же параметр задать и в флаге, и в daemon.json, демон просто не запустится. Например, если задать --log-driver и в daemon.json указать тот же драйвер, Docker выдаст ошибку при старте.

Для согласованной среды обычно советуем:

«Соберите как можно больше настроек в daemon.json, а флаги используйте только при необходимости».


2. Где находится daemon.json

Ниже таблица с типичными путями в зависимости от ОС и способа установки:

Окружение Путь по умолчанию Примечание
Linux (обычная установка) /etc/docker/daemon.json Самый распространённый случай
Linux (snap‑установка Docker) /var/snap/docker/current/config/daemon.json Пакет snap для Ubuntu
Windows Server / Docker Engine C:\ProgramData\Docker\config\daemon.json Может потребоваться права администратора
Docker Desktop (Mac / Windows) ~/.docker/daemon.json Внутренний путь для Desktop
  • Файл может отсутствовать по умолчанию, в таком случае создайте его вручную.
  • Для командной и серверной среды обычно берётся путь /etc/docker/daemon.json.

3. Базовый рабочий процесс: «создать файл → перезапустить демон»



На Linux типичный поток выглядит так:

  1. Создайте/отредактируйте daemon.json
{
  "dns": ["1.1.1.1", "8.8.8.8"],
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "3"
  }
}
  1. Проверьте валидность
sudo dockerd --validate --config-file=/etc/docker/daemon.json
# Если выводит "configuration OK", всё в порядке
  1. Перезапустите демон
sudo systemctl restart docker

После этого новые контейнеры будут наследовать эти глобальные настройки, если они не переопределены в docker-compose.yml или CLI.


4. Пример 1 – глобальная фиксация DNS‑серверов

4.1 Зачем делать DNS глобальным?

Если контейнеры часто «не могут найти внешние API» или «не резолвят внутренние домены», это обычно связано с настройками DNS хоста. Вместо того чтобы прописывать dns: в каждом docker-compose.yml, удобно задать это в демоне.

4.2 Конфигурация (daemon.json)

{
  "dns": ["1.1.1.1", "8.8.8.8"]
}

Если файл уже существует, добавьте ключ "dns": [...] в корневой объект.

⚠️ Важно: DNS‑настройки применяются к /etc/resolv.conf внутри контейнеров. Уже запущенные контейнеры не обновятся, но новые будут использовать новые значения.

4.3 Для кого это полезно?

  • Разработчики в компаниях с прокси и внутренним DNS
  • Платформенные команды, работающие в мульти‑облаке
  • Локальные разработчики, переключающиеся между VPN

5. Пример 2 – глобальная настройка драйвера логов

Контейнерные логи по умолчанию собираются драйвером json-file в /var/lib/docker/containers/.... Глобальная настройка позволяет задать формат, место хранения и политику ротации.

5.1 Стандартный json-file с ротацией

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "10m",
    "max-file": "5"
  }
}
  • Каждый лог‑файл ограничен 10 МБ
  • Хранится максимум 5 файлов, остальные удаляются

5.2 Драйвер для централизованного сбора логов (fluentd, journald и др.)

Если нужно отправлять логи в централизованную систему, например Fluentd:

{
  "log-driver": "fluentd",
  "log-opts": {
    "fluentd-address": "localhost:24224",
    "tag": "{{.Name}}"
  }
}

Для journald:

{
  "log-driver": "journald",
  "log-opts": {
    "tag": "{{.Name}}"
  }
}

Тогда можно использовать journalctl -t {container_name} для быстрого просмотра логов.

5.3 Как это сочетается с Compose / docker run

  • Глобальные log-driver и log-opts действуют как значения по умолчанию.
  • Если в Compose указать logging: или в CLI задать --log-driver, это переопределит глобальные настройки только для конкретного контейнера.

6. Пример 3 – прокси, insecure registry и другие сетевые настройки

6.1 Прокси

{
  "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "http://proxy.example.com:3128",
    "no-proxy": "localhost,127.0.0.1,.corp.example.com"
  }
}

Docker будет использовать эти прокси при pull‑е образов и во время сборки.

6.2 Insecure registry

{
  "insecure-registries": ["my-registry.local:5000"]
}

Используйте только в тестовых средах, так как это снижает безопасность.


7. Пример 4 – диапазон базовой сети, драйвер хранения и др.

7.1 Настройка диапазона bridge‑сети

{
  "default-address-pools": [
    {
      "base": "10.20.0.0/16",
      "size": 24
    }
  ]
}

7.2 Принудительный драйвер хранения

{
  "storage-driver": "overlay2"
}

Проверьте совместимость драйвера с вашей ОС и ядром.


8. Когда и кому это особенно полезно?

8.1 Локальные разработчики

  • Используют одинаковые Docker‑опции в разных проектах
  • Переключаются между VPN и прокси
  • Не хотят вручную управлять логами и дисковым пространством

8.2 Малые и средние команды

  • Избегают «у меня работает, у тебя нет» из-за разной локальной конфигурации
  • Синхронизируют CI и локальные среды
  • Применяют корпоративные DNS, прокси, реестры

8.3 Платформенные команды / DevOps / SRE

  • Управляют десятками/сотнями контейнеров
  • Требуется единый подход к логированию, хранению, сети
  • daemon.json становится «политикой» узла Docker

9. Советы по отладке

  1. Флаги и дублирование – проверьте unit‑файл systemd (/lib/systemd/system/docker.service), чтобы убедиться, что там нет конфликтующих флагов.
  2. Docker Desktop – GUI имеет приоритет над ручным редактированием. Если вы меняете файл вручную, убедитесь, что Desktop не перезапишет его.

Итоги

  • Глобальные настройки демона Docker находятся в daemon.json.
  • На Linux обычно /etc/docker/daemon.json.
  • Примеры: DNS, драйвер логов, прокси, insecure registry, диапазон сети, драйвер хранения.
  • Глобальные настройки упрощают жизнь как индивидуальных разработчиков, так и команд DevOps.
  • Если вы постоянно повторяете одни и те же параметры в docker-compose.yml или CLI, стоит перенести их в daemon.json.

image of docker daemon json setting