无法从HTML访问docker-compose的其他服务

时间:2019-02-03 20:00:46

标签: html docker docker-compose

我想通过docker-compose连接两个服务。其中一个是Apache提供的一个HTML文件,另一个是正在运行的服务器,该服务器仅记录请求并成功返回200。我不知道在<form>标签中编写操作链接的正确方法是什么。

我已经将我的图像(例如前端和服务器)命名为http://server:8080/user/add,并将签名的动作属性命名为{{3}}。

这是我的表单:

<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

但是在点击按钮后,浏览器将我重定向到server:8080并告知找不到该页面。

在我的情况下,链接服务的正确方法是什么?

2 个答案:

答案 0 :(得分:2)

当您从在docker上运行的Apache提供html文件时,该文件将在您的浏览器(您的主机)上呈现。因此,当您完成表单并将其发布时,浏览器会将数据发送到http://server:8080/user/add,而该数据不是公开可访问的,我看到您不想直接公开它。如果要从frontend服务器发送数据,则需要向前端应用程序添加一些后端功能,以处理客户端将发送的响应数据(因为浏览器是发送表单的,而不是发送表单的frontend)。 总结一下,如果您不公开server的访问权限,则需要添加其他内容来处理客户端发送的数据,然后将其发送到服务器。

答案 1 :(得分:0)

由于浏览器在主机上运行,​​因此请求是从浏览器而不是从Docker容器发送的。我们可以使用服务名称在容器之间进行通信;但不能使用服务名称从主机(运行浏览器的主机)访问容器。要从主机访问容器,我们需要通过在server中添加所需公开的端口来将docker-compose.yml服务的端口公开给主机(假设应用程序正在{{1}内的端口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容器到{{1 }}容器,对Apache服务器使用类似this的容器。这样,您可以将frontend用作操作属性(假设server是代理路径)。现在,浏览器将请求/api/user/add发送到/api容器。 /api/user/add容器将看到URL以frontend开头并将请求转发到docker网络中的frontend容器。