Docker - 将 http 请求从一个容器发送到另一个容器

IT技术 reactjs docker
2021-05-06 00:41:49

当我在 AWS 服务器生产中运行应用程序时,我无法向后端容器发送 HTTP 请求。但是,当我在本地运行应用程序时,我可以很好地向后端发出请求。为了提出请求,我使用 fetch:

fetch('http://localhost:8000/something')

下面是项目结构的样子:

.
├── docker-compose.yml
|
├── backend
│   ├── Dockerfile
│   └── server.js
|
└── frontend
    ├── Dockerfile
    ├── package.json
    ├── public
    │   └── index.html
    └── src
       ├── components
       ├── data
       ├── index.js
       ├── routes.js
       ├── static
       ├── tests
       └── views

docker-compose.yml:

version: '3'

services:
  frontend:
    build:
      context: .
      dockerfile: frontend/Dockerfile
    volumes:
      - ./frontend:/frontend
    ports:
      - "80:5000"
    links:
      - backend
  backend:
    build:
      context: .
      dockerfile: backend/Dockerfile
    volumes:
      - ./backend:/backend
    ports:
      - "8000:8000"

前端的 Dockerfile:

FROM node:latest

RUN mkdir -p /frontend

WORKDIR /frontend

ADD . /frontend

VOLUME ["/frontend"]

EXPOSE 5000

CMD yarn && yarn build && yarn global add serve && serve -s build

后端的 Dockerfile:

FROM node:latest

RUN mkdir -p /backend

WORKDIR /backend

ADD . /backend

VOLUME ["/backend"]

EXPOSE 8000

CMD yarn && yarn start

有人可以解释我的配置有什么问题吗?我很困惑,因为它在本地没有任何问题。

1个回答

TLDR:需要更改前端代码以调用当前主机而不是'localhost'

问题是您的应用程序在从您的浏览器访问时说的是“hey localhost”而不是“hey VPS ip”。您需要编辑前端代码以访问您正在访问的当前主机。这就是您在本地主机服务器上收到请求的原因。

而不是将其fetch("http:///localhost:8000/something")更改为fetch("http://"+location.host+":8000")(有更好的方法,这可以完成)。

另请注意,docker 容器在网络方面也略有不同。docker 容器并没有像非 docker 容器应用程序那样真正具有“本地主机”的概念。在服务器之间进行呼叫时,您必须使用 VPS 的 IP/本地 IP。我使用的一个技巧是使用 docker 的默认 docker0 网桥 172.17.0.1。

我倾向于通过“链接”使用网络,实际上无法对其进行完整评论,但是当容器位于同一个 docker 网络上时,您可以使用容器的名称访问另一个容器。然而,这只适用于服务器端代码,即:node.js server -> node.js server/mongo db。示例 mongodb 连接将是mongodb://mongo_server:27017/mydatabasemongo_server 将解析为容器的 IP。

尝试使用 IP 时您可能会遇到的另一件事是您的防火墙,您还必须允许该特定 ip/端口通过您的防火墙。