Реализовать задуманное можно с помощью прокси.
В самом примитивном варианте это будет что-то вроде
nginx-proxy.
Можно так же использовать
Traefik, но с ним не задалось, так как почему-то всегда один из хостов поставлялся с авто-балансировкой в зависимости от того, какой компоуз был поднят первым (если api, то api.local отвечал всегда с нужного сервиса, а front.local постоянно переключался то на api, то на front сервис, балансируя между ними), проблему не смог решить и пошёл более простым способом -- воспользовался nginx-proxy.
Если кто знает как правильно сконфигурировать Traefik, чтобы не возникло этой проблемы с балансировкой -- отпишите в комментарии.
Nginx Proxy запускается так же в Докере, как контейнер, можно через docker-compose:
version: '3'
services:
nginx-proxy:
image: jwilder/nginx-proxy
container_name: nginx-proxy
ports:
- "80:80"
networks:
- proxy
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
networks:
proxy:
driver: bridge
# вне этого docker-compose.yml сеть будет доступна по имени {директория}_proxy, в моём случае это nginx_proxy
Конфигурация Docker Compose для хостов (описано только самое важное):
# ...
services:
# Web server
web:
image: nginx
environment:
- 'VIRTUAL_HOST=${NGINX_HOST}' # подтягиваем из конфигурации окружения (.env, NGINX_HOST=api.local)
networks:
nginx_proxy: # чтобы наш хостовый nginx мог достучаться по общей с прокси сети до других контейнеров в той же сети
aliases:
- ${NGINX_HOST} # указываем алиас, по которому будет доступен контейнер, в моём случае это локальный хост api.local
default: # дефолтная сеть, чтобы не ломать связь внутри текущей Docker Compose конфигурации
# PHP
php:
image: php
networks:
- nginx_proxy # возможность из PHP иметь доступ к общей прокси сети, чтобы взаимодействовать с другими хостами
- default
networks:
nginx_proxy: # возьмём сеть извне
external: true
Примерно повторяем конфигурирование для front-сервиса.
Сначала стартуем прокси, потом уже хосты.
Теперь хост front.local может обратиться к api.local по имени хоста (например, curl или file_get_contents('
http://api.local/
')).