Как запустить сервер Python в контейнере Docker

Я хочу запустить HTTP-сервер Python в док-контейнере.

Мой DockerFile выглядит так:

FROM continuumio/anaconda3:latest

RUN apt-get -y update
RUN apt-get -y install linux-headers-amd64 build-essential libc-dev gcc

RUN conda install --yes gcc
RUN conda install --yes numpy
RUN conda install --yes scipy
RUN conda install --yes gensim
RUN pip install annoy

RUN conda config --add channels conda-forge
RUN conda install --yes spacy

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ADD my-app.tar /usr/src/app

WORKDIR /usr/src/app/source

Я создаю изображение с помощью:

docker build -t my-app-poc .

Запустите контейнер и введите команду:

docker run -i -t -p 9998:9998

В bash образа Docker я запускаю скрипт:

python Service.py

Что начинается правильно:

Wed Apr  5 13:09:51 2017 Server Starts - :9998

Но когда я ввожу адрес на своем хосте:

http://localhost:9998

Ничего не произошло. Я пробовал также поставить EXPOSE 9998 в конце моего DockerFile, но это не помогло.

Если я введу адрес docker-machine на своем хосте:

http://192.168.99.100:9989/

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

Я пробовал на Windows 7.

У вас есть идеи, как это запустить?

Буду очень рад вашей помощи!


person Ziemo    schedule 05.04.2017    source источник
comment
stackoverflow.com/help/someone-answers   -  person Jon Malachowski    schedule 07.04.2017


Ответы (3)


Это может быть связано или не связано, но я не могу добавить комментарий, поэтому вы получаете отдельный ответ!

В контейнере Docker вам может потребоваться привязать ваше приложение к хосту 0.0.0.0. см. эту ссылку.

Мне кажется (хотя мне нужно больше узнать о приложении, чтобы быть уверенным), что вы ищете соединение на петлевом интерфейсе. Это предоставляет прослушивателю доступ только к локальной машине. Напротив, 0.0.0.0 служит для предоставления слушателю всех сетевых интерфейсов на машине. В частности, в этом случае сетевой адаптер Docker. Для более подробного объяснения см. этот пост.

person John Patterson    schedule 05.04.2017

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

На этой странице документации должны быть все ответы, которые вам нужны.

Удачи!

person jraynal    schedule 05.04.2017

Из https://docs.docker.com/engine/reference/run/#expose-incoming-ports

Опция -p expose также может принимать IP-адрес. Если вы хотите также привязаться к 127.0.0.1, он идет туда.

попробуйте что-то вроде: -p 127.0.0.1:9998:9998

person Jon Malachowski    schedule 05.04.2017