Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

COMPOSE_SERVICE_UNREACHABLE Linux / DevOps

Траблшутинг Docker Compose: DNS резолвинг, сети и depends_on condition

Обновлено: 21.08.2026
  • Ошибка Connection refused или Host not found при попытке бэкенда подключиться к базе данных при старте стека.
  • Контейнеры стартуют не в том порядке, приводя к аварийному завершению зависимых сервисов.
  • Конфликты имен хостов и сбои встроенного DNS-резолвера Docker Compose.

1. Настройка правильного порядка запуска через condition: service_healthy

Создайте docker-compose.yml с контролем готовности служб:

version: '3.8'

services:
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_DB: app_db
      POSTGRES_PASSWORD: secret
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d app_db"]
      interval: 5s
      timeout: 5s
      retries: 5
    networks:
      - backend_net

  api:
    image: my_api:latest
    depends_on:
      db:
        condition: service_healthy
    networks:
      - backend_net

networks:
  backend_net:
    driver: bridge

2. Проверка связности и сетевого DNS

# Проверка статуса компонентов стека
docker compose ps

# Проверка сетевого резолвинга из контейнера API
docker compose exec api nslookup db
docker compose exec api ping -c 2 db

3. Перезапуск стека с принудительным пересозданием анонимных томов и сетей

docker compose down -v
docker compose up -d --force-recreate
💡 Практика специалистов: Не используйте порты (ports: '5432:5432') для взаимодействия контейнеров внутри одного compose-стека. Это открывает доступ к БД извне хоста. Контейнеры в одной сети должны общаться через внутренние имена сервисов (expose: '5432').

Частые вопросы (FAQ)

Почему базовый depends_on без condition не решает проблему падения бэкенда?

Базовый depends_on ожидает только старта процесса в контейнере БД (статус 'running'), но не ожидает момента, когда СУБД инициализирует сокет и начнет принимать TCP-соединения.

Как обращаться к сервисам из другого docker-compose файла?

Используйте внешнюю сеть (external network): создайте ее через docker network create shared_net и укажите в обоих compose-файлах как external: true.

Полезные материалы
Рекомендуем