Ответ
Для взаимодействия контейнеров без Docker Compose используется механизм пользовательских сетей (docker network). Это позволяет контейнерам обращаться друг к другу по имени, используя встроенный в Docker DNS-сервер.
Шаг 1: Создание пользовательской сети
Сначала необходимо создать сеть типа bridge (используется по умолчанию).
# Создаем сеть с именем 'my-app-net'
docker network create my-app-net
Шаг 2: Запуск контейнеров в созданной сети
При запуске контейнеров укажите созданную сеть с помощью флага --network.
# Запускаем контейнер с базой данных
docker run -d --name db --network my-app-net postgres:13
# Запускаем контейнер с приложением
docker run -d --name api --network my-app-net my-api-image
Шаг 3: Взаимодействие по имени контейнера
Теперь из контейнера api можно обратиться к контейнеру db по его имени. Например, в строке подключения к базе данных можно использовать хост db.
# Пример строки подключения в Python-приложении (контейнер 'api')
DATABASE_URL = "postgresql://user:password@db:5432/mydatabase"
Ключевые моменты:
- DNS-разрешение: Docker автоматически разрешает имена контейнеров в их IP-адреса внутри пользовательской сети.
- Изоляция: Контейнеры в одной сети изолированы от контейнеров в других сетях и от хост-машины.
- Отсутствие необходимости в
-p: Для внутреннего взаимодействия между контейнерами не нужно публиковать порты на хост-машину. Порты публикуются только для доступа извне.