当我在AWS服务器上运行应用程序时,我无法向后端容器发送HTTP请求。但是,当我在本地运行应用程序时,我可以向后端提出请求。为了发出请求,我使用了fetch:
fetch('http://localhost:8000/something')
以下是项目结构的样子:
.
├── docker-compose.yml
|
├── backend
│ ├── Dockerfile
│ └── server.js
|
└── frontend
├── Dockerfile
├── package.json
├── public
│ └── index.html
└── src
├── components
├── data
├── index.js
├── routes.js
├── static
├── tests
└── views
搬运工-compose.yml:
version: '3'
services:
frontend:
build:
context: .
dockerfile: frontend/Dockerfile
volumes:
- ./frontend:/frontend
ports:
- "80:5000"
links:
- backend
backend:
build:
context: .
dockerfile: backend/Dockerfile
volumes:
- ./backend:/backend
ports:
- "8000:8000"
前端的Dockerfile:
FROM node:latest
RUN mkdir -p /frontend
WORKDIR /frontend
ADD . /frontend
VOLUME ["/frontend"]
EXPOSE 5000
CMD yarn && yarn build && yarn global add serve && serve -s build
后端的Dockerfile:
FROM node:latest
RUN mkdir -p /backend
WORKDIR /backend
ADD . /backend
VOLUME ["/backend"]
EXPOSE 8000
CMD yarn && yarn start
有人可以解释一下我的配置有什么问题吗?我很困惑,因为它在本地没有任何问题。
答案 0 :(得分:3)
TLDR:需要更改前端代码以调用当前主机而不是“localhost”
问题是当您从浏览器访问时,您的应用程序正在说'嘿localhost'而不是'嘿VPS ip'。您需要编辑前端代码以访问您正在访问的当前主机。这就是您在本地主机服务器上收到请求的原因。
而不是fetch("http:///localhost:8000/something")
将其更改为fetch("http://"+location.host+":8000")
(有更好的方法,这样就完成了。)
另请注意,docker容器在网络方面也有一些不同。 docker容器实际上没有'localhost'的概念,就像非docker容器应用程序一样。从服务器到服务器进行呼叫时,必须使用VPS的IP /本地IP。我使用的技巧是使用docker的默认docker0网桥172.17.0.1。
我倾向于在“链接”上使用网络并且实际上无法完全评论它,但是当容器位于同一个docker网络上时,您可以使用容器的名称访问另一个容器。这仅适用于服务器端代码,即:node.js server - > node.js server / mongo db。示例mongodb连接将是mongodb://mongo_server:27017/mydatabase
,mongo_server将解析为容器的IP。
尝试使用IP时可能会遇到的另一件事是防火墙,您也必须通过防火墙允许该特定的IP /端口。