【发布时间】:2021-02-11 08:29:49
【问题描述】:
我有一个reactjs 前端应用程序和一个简单的python flask。我正在使用docker-compose.yml 来启动两个容器,就像这样:
version: "3.2"
services:
frontend:
build: .
environment:
CHOKIDAR_USEPOLLING: "true"
ports:
- 80:80
links:
- "backend:backend"
depends_on:
- backend
backend:
build: ./api
# volumes:
# - ./api:/usr/src/app
environment:
# CHOKIDAR_USEPOLLING: "true"
FLASK_APP: /usr/src/app/server.py
FLASK_DEBUG: 1
ports:
- 8083:8083
我使用了links,因此frontend 服务可以使用axios 与backend 服务通信,如下所示:
axio.get("http://backend:8083/monitors").then(res => {
this.setState({
status: res.data
});
});
我使用docker-compose up --build -d 构建并启动了两个容器,它们启动时没有任何问题并且运行良好。
但现在frontend 无法与backend 对话。
我正在使用AWS ec2 实例。当页面加载时,我尝试查看任何控制台错误并收到此错误:
VM167:1 GET http://backend:8083/monitors net::ERR_NAME_NOT_RESOLVED
有人可以帮帮我吗?
backend 服务已启动并正在运行。
【问题讨论】:
-
Javascript 在客户端运行,主机名
backend只有容器知道,客户端不知道。这仅在您在容器本身(服务器端)上运行代码时才有效。 -
那么解决方法是什么?我的容器不能互相通信吗?如果服务器IP改变了怎么办?不过我不想使用静态 ip。
-
您的容器可以相互通信,但客户端不能。我建议在两者前面放置一个反向代理(如 nginx)并使用它。如果代理也是一个容器,你可以使用后端主机名
-
我正在使用
nginx代理。配置应该是什么样子? -
@Spirit 客户端能够... 客户端可以通过
ports指令直接使用从容器公开的端口。
标签: docker docker-compose