【问题标题】:Connecting two docker-compose containers连接两个 docker-compose 容器
【发布时间】:2021-01-26 02:17:31
【问题描述】:

我有一个开放了 80 端口的 Ubuntu 远程服务器。 80 端口用于前端,我的应用程序的后端位于 8080 端口。

我的 docker-compose.yml 文件:

version: '3.3'

services: 
  frontend: 
    image: bloomingthebrand/developers:frontv0.0.12
    ports:
      - 80:80
    depends_on:
      - backend
  backend:
    image: bloomingthebrand/developers:backv0.0.4
    ports: 
      - 8080:8080

由于我没有在服务器上打开端口 8080,我希望它们在内部进行通信。

我已尝试放置网络属性,但我无法访问 http://mynet:8080/api

version: '3.3'

services: 
  frontend: 
    image: bloomingthebrand/developers:frontv0.0.12
    ports:
      - 80:80
    depends_on:
      - backend
    networks:
    - mynet
  backend:
    image: bloomingthebrand/developers:backv0.0.4
    ports:
      - 8080:8080
    networks:
    - mynet
networks:
  mynet:
    driver: bridge
    ipam:
      driver: default

我也尝试访问http://host.docker.internal:8080/,但这仅适用于寡妇,我的服务器在 ubuntu 上

【问题讨论】:

  • 试试http://backend:8080/api
  • 不工作。控制台显示此错误:ERROR Error: Uncaught (in promise): x: {"headers":{"normalizedNames":{},"lazyUpdate":null,"headers":{}},"status":0," statusText":"Unknown Error","url":"backend:8080/api/…backend:8080/api/products 的失败响应:0 Unknown Error","error":{"isTrusted":true}}
  • 最后一个错误看起来像是从浏览器中出来的。实际发出 HTTP 请求的原因是什么?
  • http请求是通过angular来完成的,就是其他容器里面的东西
  • @Nja Java。 Carlos 的回答对我有用!!

标签: docker docker-compose docker-container ubuntu-server


【解决方案1】:

当使用 compose 进行 angular 和 react 开发时,您通常需要 angular/react 代理您的 api 调用,默认情况下,这些框架不会这样做,您的浏览器会尝试进行这些调用,这就是正在发生的事情你的情况。看看这个角度示例以及它如何在 app-ui/proxy.conf.json 中为 api 设置代理:https://github.com/bbachi/angular-nodejs-docker-compose

在你的情况下,你的代理配置应该是这样的:

{
  "/api": {
    "target": "http://backend:8080",
    "secure": false
  }
}

顺便说一句,您实际上并不需要指定网络,默认情况下,同一撰写文件中的所有服务将通过自动为它们设置的默认网络相互通信,因此您的撰写应该可以正常工作,如下所示:

version: '3.3'

services: 
  frontend: 
    image: bloomingthebrand/developers:frontv0.0.12
    ports:
      - 80:80
    depends_on:
      - backend
  backend:
    image: bloomingthebrand/developers:backv0.0.4

【讨论】:

    【解决方案2】:

    我可能是错的,但你试过用“localhost”替换“mynet”

    【讨论】:

    • 它不起作用。这仅适用于我在我的计算机上启动端口 8080 上的应用程序,但它不适用于其他设备