Невозможно получить доступ к другому сервису docker-compose из HTML - PullRequest
0 голосов
/ 03 февраля 2019

Я хочу соединить две службы через docker-compose.Один из них - это один HTML-файл, обслуживаемый Apache, а другой - сервер, который просто регистрирует запрос и возвращает 200, успешно.Я не знаю, как правильно написать ссылку действия в теге <form>.

Я назвал свои изображения, такие как интерфейс и сервер, а свойство подписанного действия - http://server:8080/user/add.

Вот моя форма:

<form action="http://server:8080/user/add" method="post">
    Name: <input name="name"><br>
    Sname: <input name="sname"><br>
    Email: <input type="email" name="email"><br>
    <button type="submit"></button>
</form>

docker-compose.yml:

version: "3"
services:
  server:
    image: server
  frontend:
    image: frontend
    ports:
      - '8080:80'

сервер работает как положено(если запустить его локально) с помощью curl -d "name=name&sname=sname&email=email" -X POST http://localhost:8080/user/add

Но после нажатия кнопки браузер перенаправляет меня на сервер: 8080 и сообщает, что страница не найдена.

Как правильно связать службыв моем случае?

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Когда вы отправляете html-файл из вашего apache, работающего в Docker, он будет отображаться в вашем браузере (на вашем хост-компьютере).Поэтому, когда вы заполняете форму и публикуете ее, браузер отправляет данные на http://server:8080/user/add, которые не являются общедоступными, и я вижу, что вы не хотите раскрывать их напрямую.Если вы хотите отправить данные с вашего frontend сервера, вам нужно будет добавить некоторые функции бэкэнда в ваше веб-приложение, которое обрабатывает данные ответа, которые отправляют клиенты (поскольку браузер отправляет форму, а не ваш * 1003).*).Подводя итог, если вы не предоставляете свой server доступным, вам нужно добавить что-то еще для обработки данных, отправляемых клиентом, а затем отправить их на ваш сервер.

0 голосов
/ 03 февраля 2019

Поскольку браузер работает на хост-компьютере, запрос отправляется из браузера, а не из контейнера докера.Мы можем использовать имя сервиса для связи между контейнерами;но не может использовать имя службы для доступа к контейнеру с хоста (на котором запущен браузер).Чтобы получить доступ к контейнеру с хост-машины, нам нужно предоставить порт из службы server хост-машине, добавив необходимые порты, которые будут отображаться в docker-compose.yml (при условии, что приложение работает на порте 8080 внутри контейнера server):

  server:
    image: server
    ports:
      - '8081:8080'

Затем измените server:8080 на localhost:8081 в атрибуте action.

<form action="http://localhost:8081/user/add" method="post">
    ...
</form>

Теперь, когда браузер отправляет запрос на localhost:8081, запрос будет перенаправлен на8080 порт server контейнера.

Если вы не хотите открывать порт из server контейнера , вам необходимо прокси-запросы на определенный путь отКонтейнер frontend в контейнер server, использующий что-то вроде this для сервера Apache.Таким образом, вы можете использовать /api/user/add для атрибута действия (предполагая, что /api - путь прокси).Теперь браузер отправит запрос /api/user/add в frontend контейнер.Контейнер frontend увидит, что URL начинается с /api и перенаправит запрос в контейнер server в сети докеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...