我有两个 docker 容器在 ubuntu EC2 实例上运行。客户端是使用 docker build 和 docker run 构建和运行的。 springboot/postgres docker 是一个 docker 组合。客户端的端口为 14174:4173。 springboot/postgres 有 18080:8080。该实例的 VPC 有两个安全组(default 和 launch-wizard-1)。两者都允许端口 8080 和 18080。
IPv4 Custom TCP TCP 8080 0.0.0.0/0 allow 8080
IPv4 Custom TCP TCP 18080 0.0.0.0/0 allow 18080
这些可能是多余的,因为我也有这个:
IPv4 All traffic All All 0.0.0.0/0 all traffic
我现在只使用http(不是https)。
我可以从我的本地 PC 使用 14173 上的公共 URL 访问 React/vite 客户端。我还可以使用公共 URL 在 18080 上启动 springboot(我宁愿无法继续)。
客户端docker中的.env文件具有VITE_SERVER_API_URL。如果我将其设置为 18080 上的内部 URL 或 18080 上的 localhost,客户端将无法访问 springboot(没有数据加载,并且 springboot 日志显示没有交互)。但如果我将其设置为 18080 上的公共 url,客户端就可以访问后端。
如何设置以便客户端可以使用内部 URL 访问 springboot?
默认情况下,docker 容器是相互隔离的,除非它们位于同一个 docker 网络上。为了让您的客户端容器使用内部 URL 到达 springboot 容器,两个容器需要位于同一个 docker 网络上。
顺便说一句,从容器内部引用 localhost 引用的是其自身,而不是主机或其他容器。
因此您需要在客户端的 .env 中设置 VITE_SERVER_API_URL=http://springboot-containername:internal-port