Как настроить сетевое взаимодействие между Docker-контейнерами без использования Docker Compose?

«Как настроить сетевое взаимодействие между Docker-контейнерами без использования Docker Compose?» — вопрос из категории Devops, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для взаимодействия контейнеров без 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: Для внутреннего взаимодействия между контейнерами не нужно публиковать порты на хост-машину. Порты публикуются только для доступа извне.