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