【问题标题】:Communicate with HTTP between two docker containers (Vue.js to Node.js)在两个 docker 容器之间使用 HTTP 通信(Vue.js 到 Node.js)
【发布时间】: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


【解决方案1】:

您可能想尝试 links 而不是 depends_on 。 另请参阅Difference between links and depends_on in docker_compose.yml 以了解更多详细信息。

【讨论】:

  • 链接已弃用并替换为depends_on