我使用VPS在线测试我的Web应用程序。而且我使用Docker在同一服务器上运行许多Web应用程序。这是我的
version: "3.7"
services:
gateway:
build:
context: ./gateway
dockerfile: Dockerfile
restart: always
ports:
- 80:3000
networks:
erealm:
ipv4_address: 10.5.0.2
db:
image: mysql/mysql-server:5.5
restart: always
environment:
MYSQL_ROOT_PASSWORD: 4lf483t0
networks:
erealm:
ipv4_address: 10.5.0.3
phpmyadmin:
image: nazarpc/phpmyadmin:latest
environment:
- MYSQL_HOST=10.5.0.3:3306
restart: always
depends_on:
- db
ports:
- 1234:80
networks:
erealm:
ipv4_address: 10.5.0.4
static:
build:
context: ./static
dockerfile: Dockerfile
restart: always
networks:
erealm:
ipv4_address: 10.5.0.5
onlinecv:
build:
context: ./onlinecv
dockerfile: Dockerfile
restart: always
ports:
- 81:3000
networks:
erealm:
ipv4_address: 10.5.0.10
speeqapi:
build:
context: ./speeq/api
dockerfile: Dockerfile
restart: always
environment:
MYSQL_SERVER: 10.5.0.3
MYSQL_PORT: 3306
MYSQL_USER: xxxxxxxxxx
MYSQL_PASSWORD: xxxxxxxxxx
MYSQL_DATABASE: xxxxxxxxxx
depends_on:
- db
networks:
erealm:
ipv4_address: 10.5.0.20
speeqfe:
build:
context: ./speeq/fe
dockerfile: Dockerfile
restart: always
environment:
REACT_APP_API_SERVER: 10.5.0.20:3000
REACT_APP_STATIC_SERVER: 10.5.0.5:3000
ports:
- 82:3000
depends_on:
- db
- static
- speeqapi
networks:
erealm:
ipv4_address: 10.5.0.21
networks:
erealm:
driver: bridge
ipam:
config:
- subnet: 10.5.0.0/24
此方案背后的主要思想是仅向世界开放HTTP端口,而所有必需的服务均受Docker内部网络保护,外部世界无法访问。
我使用网关服务将来自不同应用程序的HTTP请求映射到不同端口。因此,我将在线CV映射到CNAME cv.eddealmeida.net,并将此Speeq应用程序映射到我的DNS区域中的CNAME speeq.eddealmeida.net,两者均指向此服务器。当我的服务器收到对http://cv.eddealmeida.net或http://speeq.eddealmeida.net的请求时,基于节点/ Express的网关应用程序(侦听端口80)将拆分请求的HOST参数,并应用简单的映射将请求发送至端口81和82。
嗯,一切正常,但是对于内部请求。首先,我遇到了内部名称解析的问题,如您所见,我通过为所有服务提供IP来解决了这个问题。
现在我的内部请求转到了正确的位置,但是... speeq前端发出的获取请求停滞了。他们只是不断地拖延着。我使用curl
测试了API,一切都很好,它正确地回答了我的命令行请求。因此,我的API /数据库连接或类似内容没有问题。谷歌浏览器给了我explanation,但我看不出我适合上述任何一种情况。
有人曾经遇到过这样的情况给我提示吗?在过去的24小时里,我一直在与这个问题作斗争,并且耗尽了所有想法。我仔细检查了所有内容,但仍然无法使用。
答案 0 :(得分:1)
我有一些可能会有所帮助的假设。
1-关于IP的使用,我建议尝试使用network aliases代替IP,这是一个长期解决方案
2-我可以看到您正在使用ReactJS作为客户端的前端-我假设您在构建React应用程序后正在使用静态文件-在这种情况下,您需要公开后端/ api通过端口映射或使用域名将公共IP指向您的api正在监听的公共IP或任何类似方法,以使您在从浏览器(这是另一台设备)中打开前端应用程序时能够访问它在您的情况下)。因此,如果speeqfe
是reactjs前端,则需要更改指向其他容器的环境变量值,以使其成为公共ip,以便在构建静态文件后正常工作