如何在 Docker 的容器上运行 Python 服务器



我想在docker容器上运行Python HTTP服务器。

我的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

在 Docker 镜像的 bash 中,我运行脚本:

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/

它有效。但是我想在常规服务器上运行该映像,而不是我的本地机器 - 所以所有内容都应该暴露给 localhost。

我在Windows 7上尝试过。

你知道怎么运行这个吗?

我会很高兴你的帮助!

这可能相关,也可能不相关,但我无法添加评论,因此您可以获得独立的回复!

在 Docker 容器中,可能需要将应用程序绑定到0.0.0.0主机。请参阅此链接。

在我看来(尽管我必须了解有关该应用程序的更多信息才能确定(您正在环回界面上寻找连接。这只会向本地计算机公开侦听器。相比之下,0.0.0.0用于向计算机上的所有网络接口公开侦听器。在本例中,具体为 docker 网络适配器。有关更详细的解释,请参阅此帖子。

你描述的是一种正常行为。Docker 映像在虚拟化环境中运行,因此无法共享环回地址。您需要做的是将流量从服务器重定向到 docker 映像。

此文档页面应包含您需要的所有答案。

祝你好运!

来自 https://docs.docker.com/engine/reference/run/#expose-incoming-ports

-p 暴露选项也可以采用 IP 地址。如果您还想绑定到 127.0.0.1,它会转到那里。

尝试类似以下内容:-p 127.0.0.1:9998:9998

John Patterson 的回答基本上一针见血,让我再添加一些不适合评论的内容。

如果你想查看你的HTTP服务器的日志(你应该这样做(,那么将以下内容添加到你的Dockerfile:

ENV PYTHONUNBUFFERED=1

因为默认情况下,Python 打印到 stdout 的所有内容都将进入缓冲区,除非已经写入了大量内容,否则您不会看到带有docker logs的服务器的输出。

另请注意,Dockerfile 中的EXPOSE带来很少的宝贵内容。根据Docker文档:

暴露指令实际上并不发布端口。它功能作为构建人员之间的一种文档类型映像和运行容器的人员

这并不多。但是,docker run-P 标志将所有 EXPOSE -d 端口映射到一些随机的高阶端口。IMO 使用 -p(小写(指定端口映射的最佳方式。

相关内容

  • 没有找到相关文章

最新更新