Если вы окончательно настроитесь на то, что каждый сервис будет работать в физически другой системе, то на самом деле вариантов нет. Одна система не может получить прямой доступ к сети Docker в другой системе;единственный способ, которым служба 1 сможет связаться со службой 2, - это DNS-имя своего хоста (или IP-адрес) и опубликованный порт. Поскольку в разных средах это будет по-разному, я бы рекомендовал сделать это значение настраиваемой переменной среды.
environment:
SERVICE_2_URL: 'http://service-2-host.example.com/' # default port 80
Как только вы остановитесь на этом, вы можете использовать ту же настройку для развертывания на одном хосте. , в основном. Если ваши системы разработчика используют Docker для Mac или Docker для Windows, вы можете использовать специальное имя хоста Docker для доступа к другой службе
environment:
SERVICE_2_URL: 'http://host.docker.internal:8082/'
(Если вы используете Linux на рабочем столевам нужно знать некоторый IP-адрес для хоста, а не localhost
, потому что это означает «этот контейнер», а не адрес интерфейса docker0
, потому что он будет в конкретной сети, а что-то вроде eth0
адреса хоста.)
Другой вариант - заимствовать другую сеть Docker Compose как внешнюю сеть. Есть некоторая хитрость, если все ваши настройки Docker Compose имеют одинаковые имена;из некоторых экспериментов кажется, что внутренний DNS Docker всегда будет сначала преобразовываться в ваш собственный файл Docker Compose, и вам нужно знать что-то вроде имени контейнера, назначенного Compose (которое не сложно восстановить и является стабильным), чтобы достичьдругие службы.
version: '3'
networks:
app2:
external:
name: app2_appnet
services:
app:
networks:
- appnet
- app2_appnet
environment:
SERVICE_2_URL: 'http://app2_app_1/' # using the service-internal port
MYSQL_HOST: db # in this docker-compose.yml
(я бы предложил использовать Docker Compose default
сеть вместо объявления своей собственной; это в основном позволит вам удалить все блоки networks:
вфайл без какого-либо вредного воздействия, но в этом конкретном случае вам нужно будет объявить networks: [default, app2_default]
для подключения к обоим.)
Вы также можете рассмотреть решение для размещения нескольких хостов, когда вы начинаете смотреть на это,Kubernetes довольно тяжеловесен, но он будет запускать контейнеры на любом узле кластера (вам не нужно особо беспокоиться о размещении), и он предоставляет вам как пространства имен, так и автоматическое разрешение DNS;вы можете просто установить SERVICE_2_URL: 'http://app.app2/'
, чтобы он указывал на другое пространство имен, не беспокоясь об этих сетевых деталях.