为什么我的两个Docker容器无法通信?

时间:2019-11-10 22:45:08

标签: python python-3.x api docker flask

我有两个运行Flask的Docker容器,只是我正在运行的一个简单的后端/前端示例位,用于学习docker和flask。

我的前端是:

from flask import Flask, jsonify
import requests
import simplejson
import json

app = Flask(__name__)

@app.route('/')
def hello():
    uri = "http://127.0.0.1:5000/tasks"
    try:
        uResponse = requests.get(uri)
    except requests.ConnectionError:
        return "Connection Error"

    Jresponse = uResponse.text
    data = json.loads(Jresponse)
    fullString = ""

    title = data['tasks'][0]['title']
    description = data['tasks'][0]['description']

    fullString += title
    fullString += "<br/>"
    fullString += description

    return fullString


if __name__ == '__main__':
    app.run(debug=True,host="0.0.0.0", port=2000)

当我在本地运行它时,它工作正常,当我在docker中运行它时,它也工作。我可以转到localhost:2000的前端,并且看到有效的数据。

我的后端代码是:

from flask import Flask,request, jsonify, make_response
from flask import abort
import csv
import json
import flask

app = Flask(__name__)

tasks = [
    {
        'id': 1,
        'title': u'example title 1',
        'description': u'example description 1', 
        'done': False
    },
    {
        'id': 2,
        'title': u'example title 2',
        'description': u'example description 2', 
        'done': False
    }
]

@app.route('/tasks', methods=['GET'])
def get_tasks():
    return jsonify({'tasks': tasks})

if __name__ == '__main__':
    app.run(debug=True,host="0.0.0.0", port=5000)

如果我都在没有docker的情况下运行这两个程序,而我去了localhost:2000的前端,我得到了我所期望的任务描述和标题的第0个条目。

当我在docker中运行这些命令时,一切似乎正常,但是我从前端获得了Connection Error。因此,requests.get(uri)似乎在被docker化后无法正常工作。

这是我的docker文件

对于后端

FROM ubuntu:latest
MAINTAINER me
RUN apt-get update -y
RUN apt-get install -y python3-pip python3-dev build-essential
COPY . /app
WORKDIR /app
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["backend.py"]

对于前端

FROM ubuntu:latest
MAINTAINER me
RUN apt-get update -y
RUN apt-get install -y python3-pip python3-dev build-essential
COPY . /app
WORKDIR /app
ENV FLASK_APP=/app/frontend.py
ENV FLASK_ENV=development
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["frontend.py"]

因此,似乎它们都可以单独工作,但无法沟通。这是为什么?似乎并不明显,我是Docker的新手。


EDIT1

前端命令:

sudo docker run -d -p 2000:2000 frontend

后端命令:

sudo docker run -d -p 5000:5000 backend

EDIT2

我将其移至docker compose,并出现了相同的问题。

docker-compose.yml

version: '3'
services:
  backend:
    build: 
      context: backend/
      dockerfile: compose/lib/backend/Dockerfile
    ports:
      - "5000:5000"
  frontend:
    build:
      context: lib/frontend/
      dockerfile: compose/lib/frontend/Dockerfile
    ports:
      - "2000:2000"

未更改Docker文件。根据文档here,我不需要特定的网络连接是正确的,并且创建了默认网络。但是,这在烧瓶下仍然可以正常工作,但是我无法使用docker或docker-compose来附加它们。

1 个答案:

答案 0 :(得分:2)

您可以共享您正在使用的docker run命令吗?

您是否使用-p标志公开端口?

docker run -p 5000:5000 ...

[更新] :根据您的docker安装和配置,您可能无法使用该IP。 Docker认为127.0.0.1 IP的意思是“这个容器”,而不是“这台机器”。

一个bridged network可能解决了这个问题,但是我建议改用docker-compose(以下详细信息)。

如果出于本实验的目的,您打算始终在同一台计算机上同时运行这两个容器,请始终使用docker-compose,允许您从同一master命令运行多个容器,并为您提供了不错的附加功能,例如创建一个虚拟网络以使两者相互连接,而无需外部网络访问它们。例如您的数据服务器只能对另一个烧瓶容器可见,但可以在主机的网络接口上公开。

对于docker-compose,您可以使用以下(未经测试的)docker-compose.yml作为开始:

version: 3
services:
    backend:
        build: path/to/dockerfile
        ports:
            - 5000:5000
    frontend:
        build: path/to/dockerfile
        ports:
            - 2000:2000