无法到达 docker 容器 - 端口未绑定

use*_*412 14 networking docker dockerfile

首先设置:

没有 WSL2 的 Windows 10 - 旧的 Hyper-V 后端

Docker for Windows - Linux 容器。

我有一个小的 python 脚本:

from flask import Flask
server = Flask(__name__)

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

if __name__ == "__main__":
   server.run(host='0.0.0.0') 
Run Code Online (Sandbox Code Playgroud)

当我在本地运行它(没有docker)时,我可以localhost:5000/ping很好地到达。

Dockerfile:

FROM python:3.8-buster

RUN useradd -ms /bin/bash user
USER user

WORKDIR /home/user

COPY requirements.txt .
RUN pip install -r requirements.txt && rm requirements.txt
COPY app.py .

EXPOSE 5000

ENTRYPOINT [ "python", "app.py"]
Run Code Online (Sandbox Code Playgroud)

构建得很好。启动:docker container run -t test_tag -dp 5000:5000 启动后日志也正常:

* Serving Flask app "app" (lazy loading)

* Environment: production

WARNING: This is a development server. Do not use it in a production deployment.

Use a production WSGI server instead.

* Debug mode: off

* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
Run Code Online (Sandbox Code Playgroud)

localhost:5000/ping不起作用 - 连接失败。

但是运行 docker 示例docker run -dp 80:80 docker/getting-started效果很好 - 我可以访问下面容器的网络服务器localhost:80

在两个容器上运行 dockerspect 显示出一个区别:我的容器有

"Ports": {
                "5000/tcp": null
            },
Run Code Online (Sandbox Code Playgroud)

在网络设置中,对于工作示例来说它是(更正确的外观)

 "Ports": {
                "80/tcp": [
                    {
                        "HostIp": "0.0.0.0",
                        "HostPort": "80"
                    }
                ]
            },
Run Code Online (Sandbox Code Playgroud)

所以看来所需的端口没有正确绑定。我需要做什么来绑定端口?

use*_*412 13

正如 David Maze 指出的那样,顺序对于 docker cmd 命令确实很重要。

-dp选项需要位于图像名称之前。

所以使用

docker container run -dp 5000:5000 -t test_tag 
Run Code Online (Sandbox Code Playgroud)

奇迹般有效。

  • 我如何在 dockerfile 上设置它? (2认同)