Docker/Flask: сервер разработки отлично работает на локальном хосте, но не может получить доступ к внешнему URL-адресу

avatar
mlan
1 июля 2021 в 17:54
253
1
1

Я новичок в Docker, поэтому думаю, что в моей настройке что-то не так.

Вот мой app.py (сокращенная версия):

import flask
from flask import request
from flask_cors import CORS, cross_origin

app = flask.Flask(__name__)
cors = CORS(app)
app.config['CORS_HEADERS'] = 'Content-Type'

@app.route('/', methods=['GET'])
@cross_origin()
def index():
    return('Home')

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

Мой Dockerfile:

FROM python:3

WORKDIR /app

ENV FLASK_APP=app.py

COPY ./requirements.txt .

RUN pip3 install -r requirements.txt

COPY . .

CMD ["python3", "app.py"]

Я создаю образ с помощью docker build -t flaskapi . и запускаю с docker run --rm -it -p 80:5000 flaskapi, который дает следующий вывод:

* Serving Flask app "app" (lazy loading)
 * Environment: development
 * Debug mode: on
 * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
 * Running on http://172.17.0.2:5000/ (Press CTRL+C to quit)
 * Restarting with stat
 * Debugger is active!

Посещение localhost в браузере, все работает нормально, но при попытке посетить http://172.17.0.2:5000/ или тестировании с помощью Postman я в конечном итоге получаю ошибку тайм-аута. Я чувствую, что это просто небольшая ошибка, которую я где-то сделал, но я не могу ее увидеть. Что я могу сделать, чтобы это исправить?

Источник

Ответы (1)

avatar
Adam Minas
1 июля 2021 в 18:08
3

По умолчанию Docker работает в отдельной подсети, недоступной для внешнего мира. Чтобы получить доступ к службе, работающей внутри контейнера, вам необходимо сопоставить один из портов вашего хоста с внутренней подсетью докера.

В вашей команде запуска вы сопоставляете TCP 80 с TCP 5000 внутри сети докера (часть -p 80:5000). Вот почему ваш сервис доступен при посещении http://localhost (подразумевается 80). По сути, любой запрос к вашему порту 80 в конечном итоге будет обслуживаться службой, работающей по адресу http://172.17.0.2:5000/.

.

IP-адрес 172.* находится в диапазоне подсети Docker. Чтобы общаться через него, с вашими текущими настройками, вы должны находиться в другом контейнере, который находится в той же сети, что и этот.

mlan
1 июля 2021 в 18:44
0

Понятно, похоже, я неправильно понял, как работает Docker. Так что на самом деле, если я могу нормально посетить http://localhost, то все работает, как задумано. И затем, чтобы на самом деле где-то разместить указанный контейнер, мне пришлось бы использовать что-то вроде Heroku?