【问题标题】:Docker-Compose - Communication with "Internal" Api.Docker-Compose - 与“内部”API 的通信。
【发布时间】:2017-05-10 21:25:55
【问题描述】:

我开发了一个 Angular 应用程序,它通过 Nginx 与 UWSGI Flask Api 进行通信。目前我有 3 个容器(Angular [web_admin]、Api [api_admin]、Nginx[nginx])

当我在我的开发机器上运行它时,通信工作正常。角度请求通过 url:http://localhost:5000 和 api 响应良好,一切正常。

但是当我将它部署到我的生产服务器时,我注意到应用程序无法运行,因为我的防火墙中没有打开端口 5000。

我的问题很简单,如何制作angular容器,通过内部网络调用api容器,而不是从外部调用它?

version: '2'

services:
  data:
    build: data

  neo4j:
    image: neo4j:3.0
    networks: 
      - back 
    volumes_from: 
      - data
    ports: 
      - "7474:7474"
      - "7473:7473"
      - "7687:7687"
    volumes:
      - /var/diariooficial/neo4j/data:/data  

  web_admin:
    build: frontend/web
    networks:
      - front
      - back
    ports:
      - "8001:8001"
    depends_on:
      - api_admin      
    links:
      - "api_admin:api_admin"
    volumes:
      - /var/diariooficial/upload/diario_oficial/:/var/diariooficial/upload/diario_oficial/

  api_admin:
    build: backend/api
    volumes_from: 
      - data    
    networks:
      - back   
    ports:
      - "5000:5000"   
    depends_on:
      - neo4j
      - neo4jtest
    volumes:
      - /var/diariooficial/upload/diario_oficial/:/var/diariooficial/upload/diario_oficial/

  nginx:
    build: nginx
    volumes_from: 
      - data    
    networks:
      - back
      - front
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/diariooficial/log/nginx:/var/log/nginx
    depends_on:
      - api_admin      
      - web_admin

networks:
  front:
  back:

【问题讨论】:

    标签: angularjs api nginx docker communication


    【解决方案1】:

    链接在网络上为服务创建 DNS 名称。您应该让web_admin 服务与api_admin:5000 而不是localhost:5000 交谈。 api_admin DNS 名称将解析为 api_admin 服务之一的 IP 地址。

    请参阅https://docs.docker.com/compose/networking/ 以获得解释,具体而言:

    现在每个容器都可以查找主机名 web 或 db 并取回相应容器的 IP 地址。例如,web 的应用程序代码可以连接到 URL postgres://db:5432 并开始使用 Postgres 数据库。

    【讨论】:

    • 嗨,安迪,感谢您的回复。我在 Nginx 中使用 DNS 名称,它工作正常,但我不知道为什么,angular 不会转换 dns 名称。 $http.get(__env.apiUrl + '/websites') 选项api_admin:5000/auth/login net::ERR_NAME_NOT_RESOLVED
    • 这是从浏览器 JavaScript 代码访问的意思吗?在这种情况下,请求来自 Docker 网络之外。您必须提供一种在运行时配置 __env.apiUrl 的方法。听起来您的问题类似于stackoverflow.com/a/42938882/684908。在这种情况下,您的 URL 将是 Docker 主机的 IP 地址(例如,在装有 Docker Machine 的笔记本电脑上,我的 Docker 主机是 192.168.99.100)。
    猜你喜欢
    • 2016-12-17
    • 2020-09-10
    • 1970-01-01
    • 1970-01-01
    • 2019-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 2019-07-24
    相关资源
    最近更新 更多