Docker – 从一个容器向另一个容器发送http请求

在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 

泊坞窗,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 

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

TLDR:需要更改前端代码来调用当前主机而不是“localhost”

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

取而代之fetch("http:///localhost:8000/something")将其改为fetch("http://"+location.host+":8000") (有更好的方法,这样做)。

另外注意docker集装箱在networking方面也有一些不同。 docker集装箱并不像真正的Docker容器应用那样具有“localhost”的概念。 从服务器到服务器进行呼叫时,您必须使用VPS的IP /本地IP。 我使用的一个技巧是使用docker的默认docker桥172.17.0.1。

我倾向于通过“链接”使用networking,实际上完全不能对其进行评论,但是当容器位于相同的dockernetworking上时,可以使用容器的名称访问另一个容器。 这只适用于服务器端代码,即:node.js server – > node.js server / mongo db。 示例mongodb连接将是mongodb://mongo_server:27017/mydatabase和mongo_server将parsing为该容器的IP。

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