Почему два моих док-контейнера не могут общаться? - PullRequest
0 голосов
/ 11 ноября 2019

У меня есть два контейнера-докера, на которых запущен 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)

Это работаетхорошо, когда я запускаю его локально, и он также работает, когда я запускаю его в докере. Я могу перейти на веб-интерфейс в 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)

Если я запускаю оба из них без докера, и яперейти к интерфейсу на localhost:2000 Я получаю то, что ожидаю, 0-ую запись описания и названия задач.

Когда я запускаю их в Docker, кажется, что все работает, но я получаю Connection Error отвнешний интерфейс. Таким образом, requests.get(uri), кажется, не работает, когда докеризован.

Вот мои файлы докеров

Для Backend

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"]

Для Frontend

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"]

Похоже, они оба работают индивидуально, но не могут общаться. Почему это? Как будто это не очевидно, я новичок в докере.


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. Согласно документам здесь правильно, что мне не нужна определенная сеть, и создана сеть по умолчанию. Тем не менее, это все еще работает нормально только при фляге, но я не могу заставить их присоединиться, используя docker или docker-compose.

1 Ответ

2 голосов
/ 11 ноября 2019

Можете ли вы поделиться используемой командой docker run?

Вы открываете порты с флагом -p?

docker run -p 5000:5000 ...

[Обновить] : в зависимости от установки и конфигурации докера, вы не сможете использовать этот IP. Докер считает, что 127.0.0.1 IP означает «этот контейнер», а не «этот компьютер».

сеть с мостовым соединением может решить эту проблему, но я бы рекомендовал вместо этого использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...