Траблшутинг Docker Compose: DNS резолвинг, сети и depends_on condition
- Ошибка
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: bridge2. Проверка связности и сетевого DNS
# Проверка статуса компонентов стека
docker compose ps
# Проверка сетевого резолвинга из контейнера API
docker compose exec api nslookup db
docker compose exec api ping -c 2 db3. Перезапуск стека с принудительным пересозданием анонимных томов и сетей
docker compose down -v
docker compose up -d --force-recreate Частые вопросы (FAQ)
Почему базовый depends_on без condition не решает проблему падения бэкенда?
Базовый depends_on ожидает только старта процесса в контейнере БД (статус 'running'), но не ожидает момента, когда СУБД инициализирует сокет и начнет принимать TCP-соединения.
Как обращаться к сервисам из другого docker-compose файла?
Используйте внешнюю сеть (external network): создайте ее через docker network create shared_net и укажите в обоих compose-файлах как external: true.