Docker LinuxWindows (Docker Desktop)macOS (Docker Desktop)

Контейнер Docker не разрешает имена в пользовательской сети bridge

  • Обновлено
  • Чтение ≈ 5 минут

Краткий ответ

В пользовательской bridge-сети Docker предоставляет встроенное разрешение имён контейнеров; типичная причина отказа — контейнеры находятся в разных сетях либо приложение обращается к неправильному имени.

В этой статье
  1. Что означает ошибка и при каких условиях возникает
  2. Как различить причины
  3. Пошаговая диагностика и исправление
  4. Минимальный пример для отдельного тестового проекта
  5. Как проверить результат и что делать, если проблема осталась

#Что означает ошибка и при каких условиях возникает

Пошаговая диагностика DNS контейнеров Docker: сети, имена сервисов Compose, настройки resolv.conf и внешние DNS-серверы. В пользовательской bridge-сети Docker предоставляет встроенное разрешение имён контейнеров; типичная причина отказа — контейнеры находятся в разных сетях либо приложение обращается к неправильному имени.

#Как различить причины

Возможная причинаКак узнатьЧто делать
Сервисы находятся в разных сетяхИмя сервиса разрешается для контейнеров в общей пользовательской сети, а не вообще для любых контейнеров в Docker.docker network inspect показывает нужный контейнер только в одной сети.Подключить оба сервиса к общей доверенной сети в конфигурации Compose.
Используется встроенная сеть bridge вместо пользовательскойКлассическая bridge-сеть не предоставляет такого же автоматического DNS по именам контейнеров.В конфигурации написано network_mode: bridge, а обращение идёт по имени сервиса.Использовать обычную сеть Compose или свою user-defined bridge.
Перепутали DNS и недоступность самого сервисаDNS может выдавать IP правильно, но служба не слушает нужный порт или не готова.Python socket.getaddrinfo возвращает адрес, а подключение к TCP-порту не удаётся.Проверять слушающий порт, приложение и правила сети отдельно.
Проблема только с внешними доменамиКонтейнер резолвит имена внутренних сервисов, но не имена в интернете.Имя db определяется, внешний домен нет; внутренний DNS 127.0.0.11 виден в resolv.conf.Разобраться с исходным DNS хоста, корпоративной сетью и прокси.

#Пошаговая диагностика и исправление

  1. Откройте правильный Compose-проектНа Linux откройте терминал через меню приложений, на Windows — PowerShell, на macOS — «Терминал». Перейдите в каталог с compose.yaml и выполните docker compose ps и docker compose config --services. Оба действия безопасны и показывают службы. Запишите имена клиента и сервера: в примере это client и db. Если Docker не запущен, откройте Docker Desktop либо обратитесь к администратору Engine.
  2. Проверьте имя сервиса, а не localhostВ конфигурации приложения найдите адрес сервера БД. Внутри контейнера localhost и 127.0.0.1 означают сам этот контейнер; для обращения к другому сервису Compose обычно нужно его имя, например db. Откройте compose.yaml в текстовом редакторе и посмотрите ключи сразу под services:. Если используется другое имя, исправлять нужно конфигурацию приложения, а не системный DNS.
  3. Убедитесь, что оба контейнера подключены к одной сетиВыполните docker network ls, затем docker compose config; в результате найдите секцию networks и сетевые привязки служб. Для конкретной созданной сети используйте docker network inspect ИМЯ_СЕТИ, подставив существующее имя из списка. В разделе Containers должны быть обе нужные службы. Если нет, настройте общую сеть через compose.yaml после копии файла и проверки конфигурации; не присоединяйте случайные контейнеры к чужой сети.
  4. Проверьте DNS внутри контейнера, не полагаясь на pingНе все минимальные образы содержат ping, nslookup и getent. В образе с Python выполните docker compose exec client python -c "import socket; print(socket.getaddrinfo('db', 6379)[0][4][0])", заменив client и db именами своего тестового проекта и портом реального сервиса. В ответ ожидается адрес сети Docker; gaierror означает, что имя не разрешено. Для чужого образа сначала выясните доступные программы, не устанавливайте их на работающий контейнер ради одной проверки.
  5. Посмотрите настроенный DNS без правок системных файловВ учебном Linux-контейнере выполните docker compose exec client cat /etc/resolv.conf; в пользовательских сетях часто указан nameserver 127.0.0.11 — это встроенный резолвер Docker и его не нужно заменять на публичный DNS. Если файл содержит другое значение, учитывайте настройки проекта и запуска, не редактируйте его вручную внутри контейнера: при пересоздании изменения исчезнут.
  6. Отделите DNS от связи с портомКогда имя db успешно разрешилось, проверьте доступность самого сервиса отдельно; например, для Redis из контейнера, где есть redis-cli: redis-cli -h db ping должен вернуть PONG. Если IP выдаётся, но PONG нет, изучайте порт 6379, логи db и готовность Redis. Не меняйте DNS в попытке починить остановленную базу.
  7. Исправьте сеть в YAML после резервной копииСделайте копию compose.yaml, в редакторе свяжите обе службы с общей именованной сетью bridge как в примере ниже; не задавайте network_mode: bridge одновременно с networks. Выполните docker compose config -q: успешная команда не выводит ошибок. На отдельном тестовом проекте выполните docker compose up -d; на работающей системе согласуйте пересоздание, потому что оно влияет на подключения и доступность.
  8. Проверьте устойчивость после пересозданияСнова получите IP по имени сервиса через socket.getaddrinfo и проверьте реальное подключение приложения. В учебном примере выполните docker compose exec client python -c "import socket; print(socket.getaddrinfo('db', 6379)[0][4][0])"; при успехе вы увидите IP контейнера, который может измениться после пересоздания — клиент должен пользоваться именем, а не сохранённым IP. Если внешний DNS не работает при исправном внутреннем, передайте администратору параметры корпоративного DNS и хоста.
  9. Команды для отдельных ситуацийВыберите только подходящий вариант. Это не одна последовательность: часть команд диагностирует проблему, а часть меняет настройки или данные.
    Выберите подходящий вариант — это не команды для последовательного выполнения
    Вариант 1Только чтение.
    Linux · Терминал (Bash)Команда
    Только чтение. --services показывает сервисы Compose, сеть выбирайте по фактическому имени, а не по предположению.
    docker compose ps
    docker compose config --services
    docker network ls
    Вариант 2Исполнять в учебном примере с Python в сервисе client.
    Linux · Терминал (Bash)Команда
    Исполнять в учебном примере с Python в сервисе client. В чужом проекте замените имена, порт и проверьте наличие Python; команды не меняют DNS.
    docker compose exec client python -c "import socket; print(socket.getaddrinfo('db', 6379)[0][4][0])"
    docker compose exec client cat /etc/resolv.conf
    Вариант 3Первая команда проверяет YAML.
    Linux · Терминал (Bash)С осторожностью
    Первая команда проверяет YAML. Вторая создаёт/запускает контейнеры выбранного проекта; на рабочих сервисах требует согласования окна обслуживания.
    docker compose config -q
    docker compose up -d

    Команда может изменить состояние системы или её настройки. Проверьте параметры и последствия перед запуском.

#Минимальный пример для отдельного тестового проекта

Текст
Самостоятельный учебный проект: после docker compose up -d разрешение имени db из client выполняется встроенным DNS Docker. Не объявляет открытые порты наружу.
services:
  client:
    image: python:3.12-alpine
    command: ["sleep", "3600"]
    networks: [private_net]
  db:
    image: redis:7-alpine
    networks: [private_net]
networks:
  private_net:
    driver: bridge

#Как проверить результат и что делать, если проблема осталась

Результат достигнут, когда getaddrinfo из нужного контейнера возвращает IP правильного сервиса, а соединение к его реальному порту успешно. Если DNS работает, но приложение нет — соберите данные о порте и журнале приложения; при ошибке внешних доменов проверьте доступность штатного DNS вашей сети.

Так эту ошибку тоже называют

Источники и обновления

Последнее обновление статьи: 2 ноября 2026. Версии программ и интерфейсы меняются — если шаги не совпадают с вашей версией, сверяйтесь с документацией производителя.