Стек Docker выставлен на публичный ip по имени хоста
Я пытаюсь настроить стек докера для одновременного запуска некоторых приложений. Он будет развернут для нескольких клиентов на одном компьютере, и он немного сложен - 3 службы API и два веб-сайта.
Я хотел бы создать стек для каждого клиента, чтобы ограничить накладные расходы, необходимые для настройки этого приложения для нового клиента - благодаря стеку я могу одновременно запускать эти API-интерфейсы и веб-сайты, предоставляя переменные среды.
Моя производственная машина имеет только один публичный IP. У меня есть докер с установленным режимом роя (необходимо использовать стеки). Однако мой рой - всего лишь одна машина, и я думаю, что так будет долго - мне просто не нужно больше ресурсов.
Упрощенный составной файл (всего с 2 сервисами) выглядит так:
version: "3.2"
services:
auth_api:
image: my-registry/auth-api:latest
stdin_open: true
tty: true
ports:
- 8010:80
deploy:
mode: global
environment:
- some_var
volumes:
- /var/my-app/${INSTANCE_NAME}:/store
secrets:
- auth_certificate
office_web:
image: my-registry/office-web:latest
stdin_open: true
tty: true
ports:
- 8012:80
deploy:
mode: global
secrets:
auth_certificate:
external:
name: ${INSTANCE_NAME}-auth-identity-certificate
Этот стек создан, и мои приложения доступны на серверах общего IP с портами 8080 и 8081, что является нежелательным поведением.
Предполагая, что: мой веб-сервер имеет один публичный IP: A.B.C.D
Я настроил DNS для указания двух поддоменов на мой веб-сервер:
A.B.C.D api.example.com
A.B.C.D web.example.com
Я хочу настроить весь стек и веб-сервер следующим образом:
- служба auth_api доступна для публичного IP-адреса через порт 80 только с настройкой имени хоста api.example.com
- служба office_web доступна для общедоступного IP-адреса через порт 80 только при настройке имени хоста web.example.com
- обе службы НЕ доступны по общедоступным IP-адресам через опубликованные порты - 8080,8081
- когда я создаю новый стек для нового клиента, я не хочу "что-то" (обратный прокси-сервер?) автоматически заполнять новые публичные привязки имени хоста; Я могу предоставить их в качестве переменных label /env при создании стека, но я не хочу вручную редактировать что-то еще, кроме моего файла compose yaml
Как мне этого добиться? Без режима роя и стеков я использовал jwilder/nginx-proxy, который прекрасно работает, но стеки (режим роя) не поддерживаются этим замечательным образом докера.
Я не знаю, с чего начать, в "режиме без роя" я могу использовать конфигурацию портов в формате 127.0.0.1:8080:80, и мои контейнеры не были доступны по общедоступным IP-адресам. Я использовал jwilder/nginx-proxy, который автоматически заполняет IP-адрес контейнера и привязывает к нему публичный IP-адрес, используя имя хоста, передаваемое в качестве переменной env.
Как я могу добиться чего-то подобного?