这是我的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
即可在容器外部运行服务器。我做错了什么?
答案 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')