理解 Docker 容器端口暴露的基本原理
掌握使用 -p 或 --publish 参数进行端口映射的方法
学会通过 Docker Hub 和 docker inspect 查看镜像暴露的端口
能够为本地应用(如 React 应用)构建镜像并正确发布端口
Docker Hub 是 Docker 官方提供的镜像托管仓库,用户可在此查找、分享和管理容器镜像。我们将使用官方的 Nginx 镜像作为示例。官方镜像通常带有 “Official Image” 标识。在 Nginx 镜像页面右上角,可以看到拉取命令
$ docker pull nginx执行后,Nginx 镜像将被下载到本地。
默认情况下,使用 docker run 启动的容器不会对外暴露任何端口。若希望外部服务(或不同网络中的容器)能访问该容器,必须使用 --publish(简写为 -p)参数进行端口映射。
示例命令:
$ docker run -p 8080:80 --name webhost -d nginx命令解析:
端口映射格式:
-p <主机端口>:<容器端口>
关键问题:我们怎么知道应该把主机的哪个端口映射到容器的哪个端口?
进入 Nginx 官方镜像页面,查找 “Exposed ports” 部分,通常会注明:
Exposes port 80 (HTTP) and 443 (HTTPS)
docker inspect$ docker inspect nginx该命令会输出镜像的完整配置信息,其中包含 ExposedPorts 字段。为简化输出,可使用 --format 过滤:
$ docker inspect --format='{{.NetworkSettings.Ports}}' nginx输出示例:
map[80/tcp:{}]这表明 Nginx 容器内部监听的是 TCP 80 端口。
确认端口后,运行容器:
$ docker run -p 8080:80 --name webhost -d nginx然后在浏览器中访问:
http://localhost:8080你将看到经典的 “Welcome to nginx!” 页面。也可通过命令行验证:
$ curl http://localhost:8080如果你在运行容器时只写了 -p 80 而没有指定主机端口(如 -p 80:80),会发生什么?Docker 会如何处理?
EXPOSE 指令在 Dockerfile 中的作用是什么?它是否等同于 -p 参数?
假设你有一个 Python Flask 应用,默认监听 5000 端口,请写出完整的 Dockerfile 和运行命令,使其能在 http://localhost:5000 访问。
🌐 延伸阅读: