Введение / Зачем это нужно
Сети в Docker Compose упрощают взаимодействие контейнеров друг с другом без публикации портов. Правильно настроенная сеть позволяет использовать имена хостов, изолирует трафик и ускоряет разработку и запуск приложений. После выполнения этого руководства у вас будет рабочая сеть для любого набора сервисов Docker Compose.
Требования / Подготовка
- Docker Engine ≥ 20.10 и Docker Compose ≥ 2.0 (установлены и работают).
- Права на выполнение команд
docker(обычно требуется пользователь в группеdocker). - Базовый проект Docker Compose (
docker-compose.yml), который вы хотите расширить сетью.
Пошаговая инструкция
Шаг 1: Установите Docker и Docker Compose
Установите необходимые пакеты.
# Ubuntu/Debian
sudo apt update && sudo apt install docker.io docker-compose
# CentOS/RHEL
sudo yum install docker docker-compose
# Либо через установщик Docker (https://docs.docker.com/engine/install/)
💡 Совет: После установки перезапустите службу Docker:
sudo systemctl restart docker.
Шаг 2: Определите сеть в docker-compose.yml
Добавьте секцию networks: в корневой раздел файла docker-compose.yml. Пример для bridge-сети:
version: "3.9"
services:
web:
image: nginx:alpine
ports:
- "80:80"
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
networks:
appnet:
driver: bridge
Шаг 3: Подключите сервисы к сети
Для каждого сервиса, который должен быть в сети, укажите networks: со списком сетей. Если сервис использует только одну сеть, можете передать её как строку:
services:
web:
image: nginx:alpine
ports:
- "80:80"
networks:
- appnet
db:
image: postgres:15
environment:
POSTGRES_PASSWORD: example
networks:
- appnet
Шаг 4: Проверьте подключение
Запустите проект и проверьте сетевое взаимодействие:
docker compose up -d
# Проверьте пингом внутри контейнера web
docker exec <container_id_web> ping db
# Либо через curl, если сервис предоставляет HTTP
docker exec <container_id_web> curl -s http://db:5432
Если пинг успешен, сеть работает правильно.
Шаг 5: Диагностика типичных проблем
| Симптом | Возможная причина | Решение |
|---|---|---|
| Контейнеры не видят друг друга | Сеть не определена в корневом разделе networks: | Убедитесь, что сети указаны в корне файла. |
ping не успешен | Контейнер подключён к другой сети или отсутствует DNS | Проверьте docker inspect <контейнер> на наличие сетевых алиасов; переопределите networks: в сервисе. |
| Контейнер не может разрешить DNS по имени хоста | Отсутствует сетевой драйвер bridge или используется пользовательская сеть без DNS | Используйте стандартный драйвер bridge или настройте сетевую подсеть вручную. |
⚠️ Важно: Если вы используете пользовательскую сеть, убедитесь, что драйвер установлен (
docker network create --driver <driver> <name>).
Проверка результата
- Каждый сервис должен иметь корректный IP-адрес в подсети сети (
docker network inspect appnet). docker compose psпоказывает состояние сервисов как «up».- Внутри контейнера
ping <имя-соседа>успешен, аcurl http://<имя-сервиса>возвращает ответ.
Если всё вышеперечисленное работает, сеть настроена корректно и готова к использованию в производстве или разработке.
Возможные проблемы
- Разрешение DNS не работает: Убедитесь, что сетевые алиасы сервисов определены корректно (
networks: - appnetилиaliases: [...]). - Конфликт портов: Избегайте публикации одного и того же хост-порта несколькими сервисами; используйте уникальные порты или перенаправления внутри сети.
- Утечка IP-адресов: После удаления сервисов удалите неиспользуемые сети:
docker compose down --remove-orphansиdocker network prune.
Следуя этим рекомендациям, вы сможете быстро настроить надёжные сети Docker Compose и избежать типичных ошибок.