无法点击在本地运行的docker容器

时间:2017-05-22 05:04:30

标签: python docker dockerfile

这是我的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" ]

和我的main.py文件: 来自flask im

port Flask
app = Flask(__name__)

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

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

构建标记并通过docker run <tag>运行后,获取日志说烧瓶服务器已成功启动:

$ 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 个答案:

答案 0 :(得分:3)

脚本正在容器中侦听127.0.0.1,使其无法从主机访问。它必须听取0.0.0.0。

答案 1 :(得分:1)

您看到的127.0.0.1地址是容器网络的本地主机,与主主机不同。在公开端口时,docker将容器内部IP(172.17 ....)中的端口绑定映射到主机接口中的端口。

所以你必须告诉你的烧瓶听所有接口:

app.run(host='0.0.0.0')

答案 2 :(得分:0)

127.0.0.1 是回送地址(也称为localhost)。

0.0.0.0 是不可路由的元地址,用于指定无效,未知或不适用的目标(“无特定地址”占位符)。对于网络连接的地址绑定之类的事情,结果可能是为连接分配了适当的接口地址。

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

app.run(host='0.0.0.0')