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

时间:2017-05-08 16:46:37

标签: reactjs docker

当我在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

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

1 个答案:

答案 0 :(得分:3)

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

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

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

另请注意,docker容器在网络方面也有一些不同。 docker容器实际上没有'localhost'的概念,就像非docker容器应用程序一样。从服务器到服务器进行呼叫时,必须使用VPS的IP /本地IP。我使用的技巧是使用docker的默认docker0网桥172.17.0.1。

我倾向于在“链接”上使用网络并且实际上无法完全评论它,但是当容器位于同一个docker网络上时,您可以使用容器的名称访问另一个容器。这仅适用于服务器端代码,即:node.js server - > node.js server / mongo db。示例mongodb连接将是mongodb://mongo_server:27017/mydatabase,mongo_server将解析为容器的IP。

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