API в докеризованном приложении недоступен с хоста - PullRequest
0 голосов
/ 03 декабря 2018

Я использую Docker Desktop (версия 2.0.0.0-win81 (29211)) на 64-битной машине с Windows 10.Я также активировал WSL, настроил и настроил Ubuntu 18.04.1, следуя этому руководству: Docker в Windows и WSL .

Теперь закрываюсь по своей проблеме: я работаю и работаю с контейнерами Docker, которыея использую из коробки, mongodb и neo4j db.Они в порядке.

Недавно я решил докернизировать свое собственное приложение Python3.6 с помощью Flask.Это приложение имеет API и должно быть развернуто на облачном сервере в ближайшее время.

Если я запускаю приложение локально, я могу взаимодействовать с API через почтальона (GET, POST), и все работает хорошо/ bad как задумано.

Итак, я создал образ с открытыми портами, развернул докер-контейнер во время публикации портов и запустил его (код приведен ниже), выглядит хорошо:

CONTAINER ID        IMAGE                    COMMAND                  CREATED             STATUS              PORTS                                                      NAMES
fba51f89f31a        m002_production:latest   "python communicatio…"   About an hour ago   Up About an hour    0.0.0.0:5000->5000/tcp, 0.0.0.0:5003->5003/tcp             M002_gi
f36cd69cf5ce        mongo:4.1.5              "docker-entrypoint.s…"   4 hours ago         Up 4 hours          0.0.0.0:27017->27017/tcp                                   M002_testmongo
ae8d610bbcd8        neo4j:3.0                "/docker-entrypoint.…"   4 hours ago         Up 4 hours          0.0.0.0:7474->7474/tcp, 7473/tcp, 0.0.0.0:7687->7687/tcp   M002_testneo4j

Затем я проверяю, правильно ли запущено приложение с помощью 'docker logs M002_gi':

Path given:  /config/
 * Serving Flask app "M002" (lazy loading)
 * Environment: production
   WARNING: Do not use the development server in a production environment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

Оно запустилось, как и ожидалось.Однако достижение API не работает.Что я знаю сейчас:

  • Привязки портов и опубликованные порты кажутся нормальными.
  • Все контейнеры имеют одинаковые настройки сети в соответствии с проверкой докера, я даже запустил diff в целомДокер проверяет, чтобы найти ключ к решению - нет никакой подсказки.
  • Если я вхожу в контейнеры докера через docker exec -it ... и проверяю все сетевые функции, используя curl: все работает как положено.
  • Другие два контейнера (neo4j и mongodb) доступны снаружи, также как хост-компьютер.
  • Мой собственный контейнер приложений Python не является.

Следовательно, янаверняка что-то упустил, но я не могу понять, что это такое.Dockerfile:

FROM python:3.6-alpine
MAINTAINER default "addanaddress@here.com"
# We copy just the requirements.txt first to leverage Docker cache
COPY ./requirements.txt /M002/requirements.txt
RUN apk add --update build-base
EXPOSE 5000/tcp
EXPOSE 5003/tcp
# holds externally mounted volumes
VOLUME ["/M002/data", "/M002/config"]
WORKDIR /M002
RUN pip install -r requirements.txt
COPY . /M002
# this is the main executable
ENTRYPOINT [ "python" ]
# this is the default argument for the executable
CMD [ "communication_handler.py", "/config/" ]

Моя команда сборки docker:

docker build -t m002_production:latest .

Моя команда запуска docker:

docker run --name M002_test -p 5000:5000 -p 5003:5003 -v /c/Users/MyName/MyConfig:/M002/config -v /c/Users/MyName/MyConfig:/config --rm -d m002_production:latest

Мой результат запроса при запуске запроса API противЛокальная версия (без докера на порту 5001): Успешный запрос Результат моего запроса, когда я запускаю его для докеризованной версии (порт 5000 открыт и опубликован): Неудачный запрос

Когда я свернусь с Hyper:

curl localhost:5000
curl: (52) Empty reply from server

Что я ожидаю:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<title>404 Not Found</title>
<h1>Not Found</h1>
<p>The requested URL was not found on the server.  If you entered the URL manually please check your spelling and try again.</p>

Что я пробовал до сих пор (в дополнение ко всем вещам, которые я нашел в Интернете):

  • Вызов FLASK выполняется с другими IP-адресами, включая 0.0.0.0, localhost, и IP-адреса, совместимые с системой Docker и различными другими портами.
  • Назначение различных сетей Docker Bridge для контейнеров (по умолчанию и MProject).Я убедился в правильности назначения контейнеров сетям.

Моя докерская сеть ls:

NETWORK ID          NAME                DRIVER              SCOPE
a41825cf65ca        MProject            bridge              local
60aae249fa11        bridge              bridge              local
3f5cb1334815        host                host                local
b6746f907725        none                null                local

Сводка моих выводов на данный момент:

  • curl @ host -> mongodb @ docker: works
  • curl @ host -> neo4j @ docker: works
  • почтальон @ host -> mongodb @ docker: works
  • почтальон@host -> neo4j @ docker: works
  • mypythonapplication @ host (не докернизирован) -> mongodb @ docker: works
  • mypythonapplication @ host (не докеризован) -> neo4j @ docker: works
  • curl / postman @ host -> mypythonapplication @ host (не dockerized): работает

    , если я вхожу в систему с помощью: docker exec mypythonapplication -it sh, затем используйте curl или ping или любой другойя получаю именно те ответы, которые ожидаю, поэтому:

  • mypythonapplication @ docker -> mongodb @ docker: works
  • mypythonapplication @ docker -> neo4j @ docker: works

  • curl @ host -> mypythonapplication @ docker: НЕ работает

  • postman @ host -> mypythonapplication @ docker: НЕ работает

Спасибо за любые подсказки!

1 Ответ

0 голосов
/ 03 декабря 2018

Ваша проблема, скорее всего, вызвана флягой, использующей "неправильный" IP: Running on http://127.0.0.1:5000/

По умолчанию для фляги является прослушивание только на локальном хосте, в этом случае это будет локальный хост в пределах контейнер, а не localhost хоста докера.

Попробуйте вместо этого запустить колбу: flask.run(host='0.0.0.0', port=5000)

...