【问题标题】:Why can't my two docker containers communicate?为什么我的两个 docker 容器不能通信?
【发布时间】:2019-11-10 22:45:08
【问题描述】:

我有两个运行 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) 似乎在 dockerized 后无法正常工作。

这是我的 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 将它们附加。

【问题讨论】:

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


    【解决方案1】:

    您能分享一下您正在使用的docker run 命令吗?

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

    docker run -p 5000:5000 ...
    

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

    bridged network 可以解决这个问题,但我建议改用docker-compose(详情如下)。

    如果出于本实验的目的,您计划在同一台机器上同时运行这两个容器总是,您可能需要查看docker-compose,它可以让您从同一个主命令运行多个容器,并为您提供很好的奖励功能,例如为两者创建一个虚拟网络以相互连接,而无需外部网络能够访问它们。例如您的数据服务器对您的其他烧瓶容器可见,但那个可以在您的主机网络接口上公开。

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

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

    【讨论】:

    • 我将它添加到原始问题中,但命令是sudo docker run -d -p 5000:5000 backendsudo docker run -d -p 2000:2000 frontend
    • 另外,我这样做的最终目标实际上是学习 docker compose。所以,谢谢,这可能会解决问题。但由于我不太了解 docker,所以我想我应该先运行它并了解它为什么工作(或者在这种情况下不工作),然后再继续撰写。
    • 刚刚相应地更新了答案——问题是 127.0.0.1 没有映射到您的主机;它映射到当前运行代码的容器。
    • 还添加了一个起点 docker-compose 文件来帮助您入门 :)
    • @DavidMaze 谢谢!猜我是老派;从未停止将其添加到我的 yamls 中。相应更新!
    猜你喜欢
    • 2019-10-09
    • 2015-11-01
    • 1970-01-01
    • 2020-10-10
    • 2021-12-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多