【发布时间】:2025-11-25 23:25:02
【问题描述】:
我有三个容器:
- 前端(vuejs)
- 服务器(nodejs)
- mongo (mongodb)
服务器之间的通信 mongo 是好的,但是前端 -> 服务器之间的通信是 KO (对服务器的前端 http 调用无法到达)。
这里是我的 docker-compose:
version: "3.3"
services:
server:
build:
context: ../server
command: nodemon ../server/bin/www
volumes:
- ../server:/server
ports:
- "3000:3000"
networks:
- frontend
- backend
depends_on:
- mongo
front:
build:
context: ../front
command: npm run dev
volumes:
- ../front:/app
ports:
- "8081:8081"
networks:
- frontend
depends_on:
- server
mongo:
image: mongo:3.6.5
ports:
- "27017:27017"
networks:
- backend
environment:
MONGO_INITDB_DATABASE: mongo-dev
MONGO_INITDB_ROOT_USERNAME: admin
MONGO_INITDB_ROOT_PASSWORD: password
command: mongod
networks:
frontend:
backend:
运行 docker-compose up 是可以的:创建 Mongo + 服务器正在运行 + 前端正在运行。
我可以从我的浏览器访问它们(http://localhost:3000 用于服务器 + http://localhost:8081 用于前端)但我的前端无法通过
获得一个简单的 http GET 到我的服务器http://服务器:3000/myGetRoute
注意:这条路线可以通过我的浏览器访问
http://localhost:3000/myGetRoute
并且从我的前端容器中 ping 服务器 正常。
来自前端的通信 -> 服务器是不可能的。有什么想法吗?
编辑:我的前台服务运行在:http://0.0.0.0:8081)
【问题讨论】:
-
当然,你在docker网络之外。你必须使用“本地主机”而不是“服务器”。 “服务器”只是 docker 的名称,但您的本地主机不知道“服务器”是什么。
-
server:3000/myGetRoute 是我的前台应用程序使用的路线。我的前端应用程序应该知道“服务器”,因为它是在我的 docker-compose 中定义的服务的名称,并且服务器与前端位于同一网络中。没有?
-
实际上没有,你的节点进程在 docker 中运行,但是 vue 客户端在你的本地主机(在你的浏览器中)而不是在 docker 中。您是否尝试使用 server:3000/myGetRoute 从浏览器访问服务器?我不认为它会起作用。这正是您的 vue 客户端正在尝试做的事情。您应该在客户端 localhost:3000/myGetRoute 中使用。我认为这种方式应该可行。
-
你是对的!我的前面调用'localhost'它正在工作。谢谢 !但是我的前端正在运行到一个容器中,而不是在我的本地机器中:'front_1 |我您的应用程序正在这里运行:0.0.0.0:8081' => 我不太明白。我想从我的浏览器访问容器中的前端,以模拟真实的生产条件。
-
如果你想访问它,你必须使用 localhost:3000。您可以做的一种选择是创建一个充当代理的 nginx 容器。他应该决定何时必须由您的客户端或服务器处理请求。这样您就可以将两个容器封装在一个端口中。然后告诉 nginx 'api' 下的所有内容都是您的服务器,所有其他内容都是您的客户端。然后,Vue 应该能够像“/api/myGetRoute”一样调用您的 api,而无需使用完整的 URL。这样做的好处是您不必担心 CORS(如果您想进行 POST/PUT/DELETE 调用,这很重要)。
标签: node.js docker vue.js docker-compose