
容器运行时云原生【免费下载链接】docker-ce:warning: This repository is deprecated and will be archived (Docker CE itself is NOT deprecated) see the https://github.com/docker/docker-ce/blob/master/README.md :warning:项目地址https://gitcode.com/gh_mirrors/do/docker-ce点击查看免费下载docker port是 Docker 命令行工具中用于查询容器端口映射关系的核心命令它允许开发者快速查看宿主机端口与容器内部端口之间的绑定情况。本文以 docker-ce 仓库中docker port官方参考文档 为主体并结合port.go等源码实现展开深度讲解读完本文你将掌握docker port的全部用法、输出格式细节及其底层实现原理。命令概述与语法docker port用于列出容器的端口映射信息port mappings或查询某个具体的端口映射。命令完整语法如下Usage: docker port CONTAINER [PRIVATE_PORT[/PROTO]] List port mappings or a specific mapping for the container Options: --help Print usage命令只接受 12 个位置参数CONTAINER必填容器的名称或 ID也支持前缀匹配PRIVATE_PORT[/PROTO]可选容器内部的私有端口号可带协议后缀如7890/tcp不带协议时默认按 TCP 处理。--help是该命令当前唯一支持的选项用于打印使用说明。从源码看命令的参数数量通过cli.RequiresRangeArgs(1, 2)校验第二个参数被解析为查询的私有端口核心逻辑在runPort函数 中完成。查看容器全部端口映射不指定PRIVATE_PORT时docker port会输出该容器当前所有已发布的端口映射。先用docker ps确认容器及端口信息$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES b650456536c7 busybox:latest top 54 minutes ago Up 54 minutes 0.0.0.0:1234-9876/tcp, 0.0.0.0:4321-7890/tcp test从docker ps的PORTS列可以看到容器test存在两条映射宿主0.0.0.0:1234映射到容器9876/tcp宿主0.0.0.0:4321映射到容器7890/tcp。此时执行docker port test$ docker port test 7890/tcp - 0.0.0.0:4321 9876/tcp - 0.0.0.0:1234输出格式为容器端口/协议 - 宿主机IP:宿主机端口。对应源码中当opts.port为空时代码会遍历c.NetworkSettings.Ports这个nat.PortMap对每个前端绑定执行net.JoinHostPort(frontend.HostIP, frontend.HostPort)拼出宿主机地址后输出见 port.go。值得注意的是输出的顺序来自 daemon 返回的映射表结构并非固定排序映射关系由 daemon 在容器启动时记录并持久化在容器对象中。查询单个端口的映射指定PRIVATE_PORT时可以只查询一个端口。仍然以上面的容器为例查询7890/tcp的映射$ docker port test 7890/tcp 0.0.0.0:4321这里只输出宿主机地址0.0.0.0:4321不再重复容器端口信息。同时查询时协议后缀可以省略默认按tcp处理$ docker port test 7890 0.0.0.0:4321如果查询的端口没有对应的发布映射命令会报错并以非零状态退出$ docker port test 7890/udp 2014/06/24 11:53:36 Error: No public port 7890/udp published for test错误信息由源码中的errors.Errorf(Error: No public port %s published for %s, natPort, opts.container)生成见 port.go其中natPort是规范化后的端口/协议组合。参数解析细节从源码可见端口参数的解析过程相当严谨见 port.go先以/为分隔符调用strings.SplitN(port, /, 2)拆分端口与协议若存在协议部分且非空则分别提取端口号和协议名否则协议默认为tcp拼出完整的natPort : port / proto用于最终查询通过nat.NewPort(proto, port)构造规范化的端口对象再在NetworkSettings.Ports映射表中按 key 精确查找。这意味着docker port test 7890实际等价于查询7890/tcp。Docker 同时支持tcp、udp、sctp协议具体协议在端口发布阶段如docker run -p就已确定。源码实现与数据链路CLI 侧构造命令并调用 daemondocker port由NewPortCommand创建 Cobra 命令并注册到容器子命令组见 cmd.go。其执行流程为从参数中读取容器名和可选的端口参数调用dockerCli.Client().ContainerInspect(ctx, opts.container)获取容器的完整 JSON 信息根据是否指定端口走单端口查询或全量列出两个分支结果直接写入标准输出流dockerCli.Out()。该命令不设置任何连接/超时选项全部依赖 daemon 返回的 inspect 结果。daemon 侧端口映射如何被返回docker port的数据来源是 daemon 的ContainerInspectAPI。在 daemon 实现中containerInspect会将容器网络设置中的Ports类型为nat.PortMap整体复制到响应结构ports : make(nat.PortMap, len(ctr.NetworkSettings.Ports)) for k, pm : range ctr.NetworkSettings.Ports { ports[k] pm } networkSettings.NetworkSettingsBase.Ports portsNetworkSettings.Ports是一个以容器端口/协议如80/tcp为 key、以[]nat.PortBinding为 value 的映射表每个PortBinding包含HostIP与HostPort两个字段。该结构在components/engine/api/types/types.go中定义为type NetworkSettingsBase struct { ... Ports nat.PortMap // Ports is a collection of PortBinding indexed by Port ... }正是因为数据以这种容器端口 → 宿主机绑定列表的结构组织CLI 才能通过c.NetworkSettings.Ports[newP]精确查到某个容器端口对应的全部宿主机地址。IPv4 与 IPv6 地址的格式化runPort使用net.JoinHostPort拼接宿主机 IP 与端口该函数会自动为 IPv6 地址加上方括号。测试用例port_test.go覆盖了三种典型场景对应的 golden 期望文件明确展示了输出格式测试场景绑定地址期望输出仅 IPv4container-port-ipv4.golden0.0.0.0:34560.0.0.0:3456仅 IPv6container-port-ipv6.golden::[::]:3456IPv6 IPv4container-port-ipv6-and-ipv4.golden::、0.0.0.0[::]:3456与0.0.0.0:3456两行由此可见当端口绑定在 IPv6 地址::即所有 IPv6 地址上时输出会表现为[::]:端口形式同一容器端口绑定到多个宿主机地址时会逐行输出每一条映射。当查询80/tcp这样的已发布端口时命令遍历该端口的所有frontend绑定并依次打印这正是上表中多条映射逐行输出的行为来源见 port.go。端口映射从何而来与docker run的配合docker port展示的映射关系是在容器创建/启动时由端口发布参数建立的。docker run的--publish-p 选项负责将容器端口发布到宿主机典型形式为[ip:]hostPort:containerPort[/proto]例如$ docker run -d -p 1234:9876/tcp --name test busybox:latest top该命令会在宿主机0.0.0.0:1234监听并将流量转发至容器的9876/tcp随后即可用docker port test 9876查询到0.0.0.0:1234。-P/--publish-all则会把镜像中EXPOSE声明的端口全部发布到随机宿主机端口。需要说明的是端口映射的建立由 daemon 的网络层完成CLI 侧的docker port只负责读取和展示结果若容器以--network host模式运行或未发布任何端口则docker port不会输出任何映射映射表为空。常见使用场景与注意事项调试容器网络docker port 容器名是最快确认宿主机哪个端口对应容器哪个端口的方式尤其适合在多个容器映射大量端口时快速核对端口协议查询查询时务必注意协议匹配。容器可能同时发布53/udp与53/tcp查询docker port 容器 53只会命中 TCP 映射查询 UDP 需显式写53/udp错误处理查询不存在的端口时命令输出Error: No public port ...并以失败状态退出脚本中应据此判断映射是否存在与docker ps的差异docker ps的PORTS列展示的是宿主机到容器的单向概览0.0.0.0:1234-9876/tcp而docker port以容器端口为视角反向列出映射二者输出方向相反、适用场景互补只读操作docker port是纯查询命令不会对容器或 daemon 产生任何变更。小结docker port虽是一个轻量命令却承担着容器端口映射查询的关键职责。通过本文你可以看到它的参数解析、协议默认值、IPv6 地址格式化以及错误提示都由port.go中清晰的小段代码实现而其数据则来自 daemon inspect API 中的nat.PortMap结构。理解这条从docker run -p发布、daemon 存储、再到docker port查询的完整链路将帮助你在排查容器网络问题时快速定位端口绑定关系。赞分享容器运行时云原生【免费下载链接】docker-ce:warning: This repository is deprecated and will be archived (Docker CE itself is NOT deprecated) see the https://github.com/docker/docker-ce/blob/master/README.md :warning:项目地址https://gitcode.com/gh_mirrors/do/docker-ce点击查看免费下载相关推荐Docker CLI docker container port 命令详解查询容器端口映射的完整实战指南Docker CLI docker container port 命令详解查询容器端口映射的完整实战指南 docker container port 别名CLI开发工具Docker CLI docker container port容器端口映射查询的用法与源码实现解析Docker CLI docker container port 容器端口映射查询的用法与源码实现解析 本篇指南以 Docker CLI 的 docker cCLI开发工具Docker Compose port 命令详解语法、选项与端口映射查询的源码级实现Docker Compose port 命令详解语法、选项与端口映射查询的源码级实现 在 Compose 项目 docker/compose 中 doc云原生容器编排DevOpsCLI上一篇Arduino ESP32 烧录失败一张从连接到兜底的排查路线图帮你快速定位问题下一篇PS Vita连不上电脑三步摸透QCMA这个开源内容管理助手创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考