Docker:从容器到其他停滞状态的HTTP请求

时间:2019-02-22 10:00:18

标签: node.js docker http express fetch

我使用VPS在线测试我的Web应用程序。而且我使用Docker在同一服务器上运行许多Web应用程序。这是我的

docker-compose.yml

version: "3.7"

services:

  gateway:
    build:
      context: ./gateway
      dockerfile: Dockerfile
    restart: always
    ports:
      - 80:3000
    networks:
      erealm:
        ipv4_address: 10.5.0.2

  db:
    image: mysql/mysql-server:5.5
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: 4lf483t0
    networks:
      erealm:
        ipv4_address: 10.5.0.3

  phpmyadmin:
    image: nazarpc/phpmyadmin:latest
    environment:
      - MYSQL_HOST=10.5.0.3:3306
    restart: always
    depends_on:
      - db
    ports:
      - 1234:80
    networks:
      erealm:
        ipv4_address: 10.5.0.4

  static:
    build:
      context: ./static
      dockerfile: Dockerfile
    restart: always
    networks:
      erealm:
        ipv4_address: 10.5.0.5

  onlinecv:
    build:
      context: ./onlinecv
      dockerfile: Dockerfile
    restart: always
    ports:
      - 81:3000
    networks:
      erealm:
        ipv4_address: 10.5.0.10

  speeqapi:
    build:
      context: ./speeq/api
      dockerfile: Dockerfile
    restart: always
    environment:
      MYSQL_SERVER: 10.5.0.3
      MYSQL_PORT: 3306
      MYSQL_USER: xxxxxxxxxx
      MYSQL_PASSWORD: xxxxxxxxxx
      MYSQL_DATABASE: xxxxxxxxxx
    depends_on:
      - db
    networks:
      erealm:
        ipv4_address: 10.5.0.20

  speeqfe:
    build:
      context: ./speeq/fe
      dockerfile: Dockerfile
    restart: always
    environment:
      REACT_APP_API_SERVER: 10.5.0.20:3000
      REACT_APP_STATIC_SERVER: 10.5.0.5:3000
    ports:
      - 82:3000
    depends_on:
      - db
      - static
      - speeqapi
    networks:
      erealm:
        ipv4_address: 10.5.0.21

networks:
  erealm:
    driver: bridge
    ipam:
      config:
        - subnet: 10.5.0.0/24

此方案背后的主要思想是仅向世界开放HTTP端口,而所有必需的服务均受Docker内部网络保护,外部世界无法访问。

我使用网关服务将来自不同应用程序的HTTP请求映射到不同端口。因此,我将在线CV映射到CNAME cv.eddealmeida.net,并将此Speeq应用程序映射到我的DNS区域中的CNAME speeq.eddealmeida.net,两者均指向此服务器。当我的服务器收到对http://cv.eddealmeida.nethttp://speeq.eddealmeida.net的请求时,基于节点/ Express的网关应用程序(侦听端口80)将拆分请求的HOST参数,并应用简单的映射将请求发送至端口81和82。

嗯,一切正常,但是对于内部请求。首先,我遇到了内部名称解析的问题,如您所见,我通过为所有服务提供IP来解决了这个问题。

现在我的内部请求转到了正确的位置,但是... speeq前端发出的获取请求停滞了。他们只是不断地拖延着。我使用curl测试了API,一切都很好,它正确地回答了我的命令行请求。因此,我的API /数据库连接或类似内容没有问题。谷歌浏览器给了我explanation,但我看不出我适合上述任何一种情况。

有人曾经遇到过这样的情况给我提示吗?在过去的24小时里,我一直在与这个问题作斗争,并且耗尽了所有想法。我仔细检查了所有内容,但仍然无法使用。

1 个答案:

答案 0 :(得分:1)

我有一些可能会有所帮助的假设。

1-关于IP的使用,我建议尝试使用network aliases代替IP,这是一个长期解决方案

2-我可以看到您正在使用ReactJS作为客户端的前端-我假设您在构建React应用程序后正在使用静态文件-在这种情况下,您需要公开后端/ api通过端口映射或使用域名将公共IP指向您的api正在监听的公共IP或任何类似方法,以使您在从浏览器(这是另一台设备)中打开前端应用程序时能够访问它在您的情况下)。因此,如果speeqfe是reactjs前端,则需要更改指向其他容器的环境变量值,以使其成为公共ip,以便在构建静态文件后正常工作