我想通过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并告知找不到该页面。
在我的情况下,链接服务的正确方法是什么?
答案 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
容器。