源本科技 | 码上会

Docker 端口管理

2025/12/24
32
0

学习目标

  • 理解 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

命令解析:

参数

说明

docker run nginx

从 Nginx 镜像启动容器

-p 8080:80

将主机的 8080 端口 映射到容器内的 80 端口(TCP 协议)

--name webhost

为容器指定名称 webhost(否则 Docker 会随机命名)

-d

后台模式(detached mode)运行容器

端口映射格式-p <主机端口>:<容器端口>


如何知道使用了哪个端口?

关键问题:我们怎么知道应该把主机的哪个端口映射到容器的哪个端口?

方法 1:查看镜像文档

进入 Nginx 官方镜像页面,查找 “Exposed ports” 部分,通常会注明:

Exposes port 80 (HTTP) and 443 (HTTPS)

方法 2:docker inspect

$ docker inspect nginx

该命令会输出镜像的完整配置信息,其中包含 ExposedPorts 字段。为简化输出,可使用 --format 过滤:

$ docker inspect --format='{{.NetworkSettings.Ports}}' nginx

输出示例:

map[80/tcp:{}]

这表明 Nginx 容器内部监听的是 TCP 80 端口


实战:运行 Nginx 容器并验证

确认端口后,运行容器:

$ docker run -p 8080:80 --name webhost -d nginx

然后在浏览器中访问:

http://localhost:8080

你将看到经典的 “Welcome to nginx!” 页面。也可通过命令行验证:

$ curl http://localhost:8080

重点总结

关键点

说明

端口暴露必要性

容器默认不对外暴露端口,必须显式映射才能被外部访问

-p 参数格式

-p <主机端口>:<容器端口>,如 -p 8080:80

查看暴露端口

通过 Docker Hub 文档 或 docker inspect --format='{{.ContainerConfig.ExposedPorts}}' <镜像名>

EXPOSE 指令作用

仅作为元数据声明,不自动发布端口,仍需 -p 才能访问

开发 vs 生产

开发时常用 -p 直接映射;生产环境建议结合 Docker Compose 或 Kubernetes 管理网络


思考题

  1. 如果你在运行容器时只写了 -p 80 而没有指定主机端口(如 -p 80:80),会发生什么?Docker 会如何处理?

  2. EXPOSE 指令在 Dockerfile 中的作用是什么?它是否等同于 -p 参数?

  3. 假设你有一个 Python Flask 应用,默认监听 5000 端口,请写出完整的 Dockerfile 和运行命令,使其能在 http://localhost:5000 访问。


🌐 延伸阅读