簡體   English   中英

Docker:從容器到其他停止的 http 請求

[英]Docker: http requests from a container to other stalled

我使用 VPS 在線測試我的網絡應用程序。 我使用 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 請求映射到不同的端口。 因此,我將我的在線簡歷映射到 CNAME cv.eddealmeida.net,並將這個 Speeq 應用程序映射到我的 DNS 區域中的 CNAME speeq.eddealmeida.net,兩者都指向該服務器。 當我的服務器收到對http://cv.eddealmeida.nethttp://speeq.eddealmeida.net的請求時,基於 Node/Express 的網關應用程序(偵聽端口 80)拆分請求的 HOST 參數並應用將請求分別發送到端口 81 和 82 的簡單映射。

好吧,一切都運行良好,但對於內部請求。 首先,我遇到了內部名稱解析的問題,我通過為所有服務提供 IP 解決了這個問題,正如您所看到的。

現在我的內部請求將發送到正確的位置,但是...... speeq 前端發出的獲取請求正在停滯。 他們只是一遍又一遍地拖延。 我使用curl測試了 API,一切都很好,它正確響應了我的命令行請求。 所以,我的 API / 數據庫連接或類似的東西沒有問題。 谷歌瀏覽器給了我這個解釋,但我看不出我適合提到的任何情況。

有沒有人經歷過這樣的情況給我一個提示? 在過去的 24 小時里,我一直在與這個問題作斗爭,並且沒有任何想法。 我仔細檢查了所有內容,但仍然無法正常工作。

我有一些假設可能會有所幫助。

1- 關於 IP 的使用,我建議嘗試使用網絡別名而不是 IP,這是一個長期的解決方案

2-我可以看到您使用 ReactJS 作為前端,它是客戶端-我假設您在構建 React 應用程序后使用靜態文件-在這種情況下,您需要將后端/api 公開給公共 ip通過端口映射或使用域名指向您的 api 正在偵聽的公共 ip 或任何類似方法,以使前端應用程序能夠在您從瀏覽器打開它時訪問它(在您的情況下這是不同的設備)。 因此,如果speeqfe是 reactjs 前端,您需要將指向其他容器的環境變量值更改為公共 ip,以便在構建靜態文件后使其正常工作

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM