本地运行Docker容器时未发送任何数据

7

我想在 Docker 容器中运行一个基本的 Flask 应用程序。Docker 构建正常,但当我尝试在本地测试时出现“127.0.0.1 没有发送任何数据”错误。

Dockerfile:

FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7 

ENV LISTEN_PORT=5000
EXPOSE 5000

RUN pip install --upgrade pip

WORKDIR /app
ADD . /app

CMD ["python3","main.py","--host=0.0.0.0"]

main.py

import flask
from flask import Flask, request
import os

app = Flask(__name__)

@app.route('/')

def this_works():
  return "This works..."

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

我所使用的容器运行命令是:
docker run -it --name dockertestapp1 --rm -p 5000:5000 dockertestapp1

构建的命令为:

docker build --tag dockertestapp1 .

请问有人可以帮忙吗?


1
你能否同时添加一下你正在使用的命令来运行容器? - akazuko
请确保使用--net=host选项运行容器,或者使用Docker容器IP尝试连接。 - rdas
上面的帖子已经修改。 - RoDo
@rdas 我已经使用了docker inspect来获取IP地址,并尝试使用http://172.17.0.2:5000/通过IP地址访问它,但这也失败了。 - RoDo
3个回答

9
问题在于你传递了 --host 参数,但没有使用 flask 二进制文件来启动应用程序。因此,你需要从 Dockerfile 中的 CMD 中将参数移除到你的代码中。有效的设置如下:
Dockerfile:
FROM tiangolo/uwsgi-nginx-flask:python3.6-alpine3.7 

ENV LISTEN_PORT=5000
EXPOSE 5000

RUN pip install --upgrade pip

WORKDIR /app
ADD . /app

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

以及main.py

import flask
from flask import Flask, request
import os

app = Flask(__name__)

@app.route('/')

def this_works():
  return "This works..."

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

您构建镜像并启动容器的方式是正确的。我再次添加步骤,以使答案完整:
# build the image
docker build --tag dockertestapp1 .

# run the container
docker run -it --name dockertestapp1 --rm -p 5000:5000 dockertestapp1

0

你现在使用的方式,Flask 只监听容器内的 127.0.0.1 地址。所以唯一可以访问它的方式就是从同一容器内部访问。

对于你使用的 Docker 镜像,你不需要覆盖默认命令。从你的 Dockerfile 文件中删除这行代码即可:

CMD ["python3","main.py","--host=0.0.0.0"]


0

嗯...每个Docker容器都有自己的内存空间和网络边界。要使端口对客户机(您的操作系统)可用,您需要执行两个步骤:

  1. 暴露端口
  2. 发布端口

暴露端口

通常通过在您的Docker文件中放置EXPOSE语句来完成,这是您已经完成的。

现在您需要执行第二步

发布端口

使用以下命令来执行此操作(将主机机器(Docker容器)的端口映射到客户机)。

docker run -p client_port:host_port imageName

在您的情况下,应该是:

docker run -p 5000:5000 imageName

将imageName替换为您的Docker镜像名称

然后您可以执行:

localhost:5000

谢谢,我之前尝试过这个方法,但是我一直在使用运行容器时提供的http链接,即“Running on http://0.0.0.0:5000/”。为什么使用localhost:5000不起作用呢? - RoDo
你可以尝试使用 docker run -p 0.0.0.0:5000:5000 imageName 命令。你是在使用 Windows 吗? - Kartik Sikka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接