Я использую 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: НЕ работает
Спасибо за любые подсказки!