я должен определить клиентскую службу в файле docker-compose, расположенном в проекте на стороне сервера?
Это один из вариантов, и это, вероятно, самый простой и простой способ.По умолчанию docker-compose устанавливает сеть докеров для сервисов, которые вы определяете для docker-compose.yml.Поскольку все службы находятся в одной сети, они могут разрешать друг друга по имени хоста, т. Е. Ваше клиентское приложение достигнет бэкэнда, например http://app:9000/api/login/
, где вы используете имя службы docker-compose в качестве хоста.
Или это нормально, что они запускаются отдельно?
Можно запускать их отдельно, если хотите.Вам нужно будет сделать небольшую модификацию, чтобы гарантировать, что внешний интерфейс может достигнуть внутреннего интерфейса.Возможны два варианта:
- Создать сеть Docker Bridge вручную . Вот документы для этого .Вам просто нужно определить сеть с помощью
docker network create
, , добавить эту сеть в ваш docker-compose и убедиться, что вы поместили свой интерфейсный контейнер в ту же сеть, когда вы docker run
, используя--network
вариант.Точно так же вы можете просто определить новую сеть в вашем docker-compose.yml, пропустить ее создание вручную и поместить свой контейнер внешнего интерфейса в эту сеть.
Любая из этих опций # 1 оказывается хрупкой, потому что вам нужно убедиться, что ваша сеть существует перед запуском фронтэнда или, возможно, стека docker-compose.В любом случае, это опция.
В режиме моста, который является сетевым режимом по умолчанию, ссылка на localhost в вашем контейнере не ссылается на ваш хост.Например, curl localhost:9000
из вашего внешнего интерфейса будет пытаться свернуть контейнер внешнего интерфейса на порту 9000. curl localhost:9000
из службы приложений должно завершиться успешно, потому что оно само сворачивается.
Используйте сетевой драйвер хоста ,
, который поместит ваши контейнеры в вашу хост-сеть, удалив сетевую изоляцию Docker .Тогда все будет просто использовать
localhost:<port>
, чтобы общаться друг с другом.
Если у вас нет веских оснований не пускать интерфейс в docker-compose.yml, я бы посоветовал вампросто добавьте его туда и все будет готово.Делая это, выгрузите много мыслей, чтобы составить докер.Он также будет лучше масштабироваться, если вы используете конвейер CI, и его будет легче передать другому разработчику, поскольку все это в аккуратной упаковке.Удачи!