无法访问本地运行的Docker容器

3
以下是我的Dockerfile:
FROM alpine:3.5


RUN apk add --no-cache python3 && \ 
    python3 -m ensurepip && \ 
    rm -r /usr/lib/python*/ensurepip && \ 
    pip3 install --upgrade pip setuptools && \ 
    rm -r /root/.cache 

# Copy files
COPY ./requirements.txt /app/requirements.txt
COPY ./main.py /app/main.py

# Install deps
RUN pip install --upgrade pip
RUN pip install --requirement /app/requirements.txt

# Set the default directory where CMD will execute
WORKDIR /app

EXPOSE 5000

CMD [ "python3", "-u", "./main.py" ]

and my main.py file: from flask im

port Flask
app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run()

构建标签并通过 docker run <tag> 运行后,获取日志记录,表示 Flask 服务器已成功启动:
$ docker run test:latest
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

但是我无法在浏览器中连接服务器。

我认为问题可能出在端口映射上,所以我按照以下方式运行了容器:

$ docker run -p 5000:5000 test:latest
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)

还是不行。在容器外,我可以通过运行python3 main.py来运行服务器。我做错了什么?

3个回答

4
该脚本正在容器中监听127.0.0.1,使其无法从主机访问。必须将其更改为监听0.0.0.0。

我明白了...我以为127.0.0.1是环回IP...这个不应该可以访问吗?0.0.0.0不是实际上相同的IP地址吗? - dopatraman
1
容器的环回接口与主机不同。 - Ricardo Branco

2

你看到的127.0.0.1地址是容器网络的本地主机,不同于主机。当暴露端口时,Docker会将容器内部IP(172.17....)中的端口绑定映射到主机接口中的端口。

因此,你必须让Flask监听所有的接口:

app.run(host='0.0.0.0')

0

127.0.0.1 是回环地址(也称为本地主机)。

0.0.0.0 是一个不可路由的元地址,用于指定无效、未知或不适用的目标(一个“没有特定地址”的占位符)。对于网络连接的地址绑定等事情,结果可以是将适当的接口地址分配给连接。

在 Docker 中,容器的回环地址(127.0.0.1)与主机不同。请使用0.0.0.0作为主机。

app.run(host='0.0.0.0')

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