ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

宿主端口和容器端口是两回事:一条命令怎么读

2026/10/2 12:27:42 拓冰建站 浏览量
宿主端口和容器端口是两回事:一条命令怎么读 授权与合规声明本文全部操作对象均为自建隔离靶场本机容器或隔离虚拟机涉及安全测试的环节必须以取得合法授权为前提。未经授权的渗透测试违反《中华人民共和国网络安全法》与《刑法》相关条款须承担相应法律责任。本文只讲环境配置、版本对照与靶场隔离不含任何攻击步骤、利用载荷与绕过手法请勿将文中环境指向任何非自有系统。一、同一份官方文档里的两条命令端口为什么不一样1.1 两条命令先原样摆出来Pikachu 官方 README 的「Docker」一节给了两条并列的路线本文照抄一个字都不改逐字引文见附表 A 第 1 行⚠️代码待验证# 路线一直接用官方镜像dockerrun-d-p8765:808023/pikachu-expect:latest# 路线二先在本机构建镜像再跑dockerbuild-tpikachu.dockerrun-d-p8080:80 pikachu两条路线做的事不一样一条把官方镜像直接跑起来一条先在本机把镜像构建出来再跑。可它们端口那一段长得像、又不像——冒号右边都是 80冒号左边一个是 8765一个是 8080。1.2 一个很自然的疑问第一次看到这两条命令的人多半会冒出一个疑问都是同一个 Pikachu容器里跑的都是同一套东西为什么官方要给出两个不一样的数字这个疑问本身是好的它说明你的视线落在了关键位置。答案不在哪个数字才对而在冒号两边根本不是同一件事右边那个数字由容器里的服务决定左边那个数字由你这台跑 Docker 的机器决定。官方给出两条路线只是因为起点不同——一条用现成镜像一条自己构建而左边那个数字是访问入口官方顺手各给了一个。路线镜像从哪来命令里的端口写法冒号右边冒号左边路线一直接用官方镜像8023/pikachu-expect:latest-p 8765:80808765路线二本机docker build生成的pikachu镜像-p 8080:80808080两条路线共用同一个右边却给了不同的左边这件事本身就是一条线索右边不是随便填的左边是可以选的。还有一条要如实交代这条命令里的镜像8023/pikachu-expect:latest截至 2026-10-02它的可用性与维护方本文未核到请以你自己的实际结果为准。1.3 本文只读一条命令不做排查清单这一篇只做一件事把-p 宿主:容器这一段读明白——冒号左边是什么、右边是什么、改哪一边会发生什么、访问时又该用哪个。它不提供任何启动不起来怎么办的分步排查流程也不给任何利用步骤与绕过手法。文里出现的容器命令凡是只做看的动作的一律在上面标注待验证——本文环境没有 docker所有命令都未在本机实际运行过。本章可以带走的一句两条官方命令的差别只在冒号左边右边那个 80 由容器里的服务说了算不由你说了算。二、-p 8765:80冒号两边各是什么2.1 冒号左边是宿主端口冒号左边的数字叫宿主端口host port。它是你从这台机器外面访问时要写在地址里的那个端口。说外面要分清两种情形如果你就在跑 Docker 的那台机器上开浏览器那外面其实就是这台机器自己如果这台机器是一台远程主机那外面指的是通过网络访问它的那些客户端。两种情形里冒号左边的数字都是同一个角色——它是在宿主这一侧开出来的入口。Pikachu 路线一里这个入口就是 8765。8765 这个数字并不是 Pikachu 自己要求的它是官方在写这一条命令时替访问入口挑的一个号换一个号容器里的 Pikachu 一无所知。这里还要分清一件事冒号左边的数字是在这台机器上开出来的入口不是服务本身在哪个端口上跑。同一个容器换到另一台机器上可以被映射到另一个宿主端口而容器里那套服务从头到尾没变——入口是每台机器各自的事服务是镜像里定好的事。2.2 冒号右边是容器端口冒号右边的数字叫容器端口container port。它是容器内部那个服务自己正在监听的端口。这个数字不是你能随便挑的它是容器里那套 Web 服务启动时约定好的监听端口。Pikachu 的官方容器里这个服务听的就是80——所以两条路线里冒号右边都是 80。把它想成两层楼会更清楚容器内部是一个独立的小环境服务在里面听 80宿主上的 8765 只是一条通道把外面的请求送进容器内部的 80。80 是里面那个服务在哪8765 是外面从哪进。再强调一遍右边为什么不能随便挑它是容器内服务在启动时就约定好的监听端口写命令的人看不到它、也改不了它。想知道右边该填多少唯一的办法是去看这个项目自己的官方说明——Pikachu 的说明里写的是 80DVWA 的说明里写的是 4280。位置官方叫法它是谁决定在 Pikachu 路线一里的值冒号左边宿主端口host port写命令的人挑可以换8765冒号右边容器端口container port容器内服务实际监听的端口802.3 顺序不能反这个写法的顺序是固定的左边宿主右边容器。反过来写语义就变了——那等于让 Docker 去宿主上开一个 80、再把它接到容器里的 8765而容器里并没有服务在听 8765结果自然对不上。所以读一条docker run里的端口段第一步永远是先在心里把冒号切开左边归宿主、右边归容器两边的身份不许互换。⚠️代码待验证# 端口段的读法只看理解用不执行# -p 8765:80# │ │# │ └── 右容器端口容器内服务实际监听的端口Pikachu 是 80# └─────── 左宿主端口你访问时要写的那个入口此处是 8765本章可以带走的一句冒号左边是宿主端口、可以换右边是容器端口、跟着服务走顺序固定不能反。三、改左边和改右边分别会发生什么3.1 改左边只是换了一个访问入口把-p 8765:80改成-p 9000:80改的是左边。容器里那套服务完全不知道这件事——它还在 80 上听着只是宿主这一侧开出来的入口从 8765 换成了 9000。后果很直接你之后访问时要写的端口跟着换成 9000。访问入口换了容器内部一点没动。Pikachu 官方那两条命令正是右边不动、左边各给一个的例子路线一用 8765路线二用 8080。同一个容器端口 80对应了两个宿主端口两边都不冲突——说明左边界面上是可以自由挑的实际挑选时还要看有没有被别人占用第五章讲。3.2 改右边改的是转到容器里的哪个端口把-p 8765:80改成-p 8765:8080改的是右边。这一改的意思是宿主 8765 收到的请求请转给容器里的8080。问题在于容器里的 Pikachu 服务并不在 8080 上听它在 80 上听。转过去的请求没有服务接访问入口也就接不通。这不是改了没用而是改对了地方、改错了对象——你动的是容器那一侧可容器那一侧不由命令说了算。要让右边改成别的数字仍然能用前提是你同时在容器内部把服务的监听端口也改掉。那属于改镜像或改容器内配置不在本文这条命令的范围里本文不展开也不给做法。这里有一个容易被忽略的前提右边改成别的数字并且仍然能用条件是容器里的服务也一起改了监听端口。而容器里的服务怎么监听是镜像里定好的不是命令行的-p能决定的。所以对初学者来说稳妥的做法是把右边当成从官方说明里抄来的固定值只动左边。改哪一边实际改变了什么谁受影响与官方命令的关系结果改左边宿主端口从外面进容器的那个人口号只有访问者要改地址官方两条路线正是左边不同、右边相同换一个入口通常仍能访问改右边容器端口请求被转进容器里的哪个端口容器内服务并不知道官方两条路线的右边都是 80服务不在那个端口上听通常接不通3.3 一条纪律右边跟服务走左边按需换把上面两条合起来就是本文最想留给读者的一句纪律冒号右边要跟容器里服务实际监听的端口对齐冒号左边可以按自己的需要挑。读任何一条带-p的命令都先问两个问题这个数字是左边还是右边如果它是右边容器里的服务真的在那个端口上听吗——第二个问题的答案只能去这个项目自己的官方说明里找不能靠猜。本章可以带走的一句改左边是换入口改右边是换转到容器里的哪个端口右边要跟服务一致左边可以按需挑。四、DVWA 的访问地址为什么是 4280 而不是 804.1 官方那句原话上一章说右边要跟服务实际监听的端口对齐DVWA 正好是一个必须照做的例子。DVWA 官方 README 里有一句把这件事写得非常明确逐字引文见附表 A 第 3 行for running DVWA in containers, the web server is listening on port 4280 instead of the usual port of 80逐字读在容器里跑 DVWA 时Web 服务器监听的是 4280而不是平时那个 80。官方给的访问写法也是http://localhost:4280。这句话直接改了右边该填什么DVWA 容器里的服务听 4280所以任何指向 DVWA 容器的端口段右边应当是 4280不是 80。如果照着 upload-labs 的 80 去写 DVWA就是把右边填成了容器里没有服务的端口。4.2 三个靶场的容器端口各是多少把本文引到的三个项目放在一张表里冒号右边的差别一眼就能看出项目容器里服务监听的端口冒号右边官方命令里出现的宿主端口冒号左边出处Pikachu808765路线一或 8080路线二二选一Pikachu 官方 README「Docker」upload-labs8080upload-labs 官方 README「2.3 Linux快速搭建」DVWA4280不是 80由仓库根目录的compose.yml指定本文未逐字核对DVWA 官方 README「Docker」三个数字里4280 是最容易写错的那一个它既不是宿主端口也不是通常的 80而是 DVWA 容器里那个服务真正监听的端口。这张表也顺带说明另一件事——容器端口是每个项目各自的事没有统一值同样是 Web 靶场Pikachu 与 upload-labs 的容器端口是 80DVWA 的却是 4280把某一个项目的数字套到另一个项目上就会出错。4.3 DVWA 的端口由 compose.yml 指定DVWA 官方给容器用法的方式与另外两个项目不同官方给的是 clone → 进入DVWA目录 →docker compose up -d而不是一条带-p的docker run。也就是说DVWA 的端口映射写在那份compose.yml里不是写在命令行上逐字引文见附表 A 第 4 行。官方 README 只说compose.yml位于仓库根目录并且提到了pull_policy与volumes两处本地改动的做法但本文未逐字核对compose.yml里端口映射那一行具体怎么写附表 A 里为此单独留了一行待验证。读者要改 DVWA 的宿主端口要去那份文件里看而不是在命令行上加-p。⚠️代码待验证# 三个项目的官方命令并列照抄其中一组本文未在本机运行过# Pikachu官方 README「Docker」两条路线二选一dockerrun-d-p8765:808023/pikachu-expect:latestdockerbuild-tpikachu.dockerrun-d-p8080:80 pikachu# upload-labs官方 README「2.3 Linux快速搭建」cdupload-labs/dockerdockerbuild-tupload-labs.dockerpull c0ny1/upload-labsdockerrun-d-p80:80 upload-labs:latest# DVWA官方 README「Docker」端口不写在命令行上由 compose.yml 指定dockercompose up-d# 访问写法官方http://localhost:4280本章可以带走的一句冒号右边填什么取决于容器里那个服务听什么——DVWA 听 4280Pikachu 与 upload-labs 听 80三个数字不能互相套用。五、想换宿主端口该改哪一边被占用又该怎么先确认5.1 换宿主端口就是改冒号左边如果你的 8765 因为某种原因不想用了只想换一个自己顺手的宿主端口动作非常小只改冒号左边。比如-p 8765:80换成-p 9001:80右边那个 80 一个字母都不动。换完之后访问地址里的端口跟着从 8765 改成 9001容器里那套服务依旧是老样子。这里还有一个很常见的混淆把宿主端口和容器端口当成同一个数字的两种叫法。它们不是。宿主端口是给浏览器用的容器端口是给转发那一步用的换端口时脑子里要清楚自己动的是给浏览器用的那一个。这里要提醒一句换了宿主端口访问地址也要同步改。只改命令、地址还照抄旧的就会出现命令跑起来了、地址打不开的落差——落差不在容器在你手上那个数字没跟着换。5.2 换之前先在本机确认这个端口有没有被占用挑宿主端口不是随便挑这个数字如果正被同一台机器上的别的服务占着映射就会起冲突。所以换端口之前先在本机确认一下它是空的是个稳妥的习惯。这一步只查你自己这台机器上某个端口有没有被占用属于本机自查动作与任何针对他人的扫描、探测无关本文也不提供那类做法。⚠️代码待验证# 本机自查看本机有没有进程在监听 8765 这个端口只看本机自己# macOS / Linux 常见写法之一lsof-i:8765# 另一个常见写法列出本机监听中的端口再人工找一找netstat-an|grepLISTEN两条都只在本机执行、只看不改成任何配置。要如实交代这两条命令本文未在本机实测不同系统上的可用写法不完全一样命令名与参数请以你自己系统的说明为准附表 A 里为此留了一行待验证。5.3 挑宿主端口的两条稳妥做法第一条挑之前先查空。上面那一步就是为它服务的先确认这个号在本机没被占用再写进命令里。第二条别把右边当左边挑。想换端口的时候改的一定是冒号左边一旦手滑改了右边就变成请求转进容器里一个没人听的端口那和换个号访问完全是两回事。左边是你挑的右边是服务定的——这句话在换端口时最用得上。完整版环境对照表这一章的换端口只改左边“动手前先在本机查端口是否被占用”加上第二章的冒号读法、第四章的三个靶场容器端口对照、第七章的三个位置清单一起收进资料包扫码即可获取本章可以带走的一句换端口只改冒号左边改完地址要同步换动手之前先在本机确认这个端口没被占用。六、文档里的your-ip该填什么6.1 官方逐字解释了your-ip不少靶场文档的访问地址里主机那一段写的是一个占位符。Vulhub 官方 README 专门用一句把它解释清楚了逐字引文见附表 A 第 6 行文档中的your-ip指你的主机/VPS IP不是 Docker 容器内部 IP逐字读凡出现your-ip指的是你运行 Docker 的那台主机或那台 VPS的地址而不是容器的内部地址。这就把主机那一段该填什么的问题回答干净了——填你跑容器的那台机器的地址在本机上自己访问时通常就是localhost或127.0.0.1。6.2 地址里的端口就是冒号左边那个主机那一段解决了紧接着是端口那一段地址里冒号后面的端口填的是-p左边那个宿主端口不是右边那个容器端口。把这条和前面的读法连起来看一条地址就整个拆开了官方写法举例主机那一段端口那一段端口取自哪里http://localhost:4280DVWAlocalhost本机访问4280冒号左边DVWA 由compose.yml指定http://主机IP:8765Pikachu 路线一主机/VPS IP或本机的localhost8765冒号左边http://主机IP:8080Pikachu 路线二主机/VPS IP或本机的localhost8080冒号左边这张表里最容易错的一格是 Pikachu地址里要写 8765 或 8080而不是容器端口 80。容器端口是给转进容器那一步用的不是给浏览器用的。6.3 拼一条地址只看两个来源把第六章收成一句话地址里的主机来自跑 Docker 的那台机器地址里的端口来自命令里冒号左边。这两个来源都不在容器内部——容器内部的地址只有容器网络自己认识宿主上的浏览器并不走那条路。Vulhub 官方 README 里另有一条前提也一并交代官方推荐使用至少1GB 内存的 VPS 或虚拟机逐字引文见附表 A 第 7 行。它讲的是跑环境那台机器的基本条件和地址怎么拼是两件事放在这里只是让主机这个词有个具体的落点。⚠️代码待验证# 地址拼法只看理解用本文未在本机实测# 主机那一段 跑 Docker 的那台机器的地址本机访问用 localhost# 端口那一段 命令里 -p 冒号左边那个「宿主端口」# Pikachu 路线一 - 8765 路线二 - 8080 DVWA - 4280# 不要用冒号右边那个「容器端口」去拼浏览器地址本章可以带走的一句your-ip指的是主机或 VPS的地址不是容器内部地址地址里的端口取冒号左边不取右边。七、收束读一条docker run命令的三个位置7.1 三个位置走到这里一条带端口映射的docker run命令其实只有三个位置需要看清第一个位置镜像那一段。它写在-p前面决定的是这次跑的是哪一套东西比如8023/pikachu-expect:latest又比如本机构建出来的pikachu。它和端口无关但它决定了你后面看到的服务是哪一个。第二个位置冒号左边。它是宿主端口是你访问时要在地址里写的那个号是你手上唯一可以按需挑的数字。第三个位置冒号右边。它是容器端口是容器里那个服务实际监听的端口它跟服务走DVWA 是 4280Pikachu 与 upload-labs 是 80。三个位置连起来读一条命令讲的其实是一个小故事我要跑哪套东西镜像我要从外面用哪个号进左边请把这个号转给容器里的哪个号右边。7.2 一张总表把全文的事实收进一张表每一格都来自本文引到的官方说明读到哪一段它的身份谁决定它Pikachu 路线一的值去哪确认-p前面的镜像名跑的是哪一套东西你选或你构建8023/pikachu-expect:latest项目官方 README冒号左边宿主端口访问入口你挑8765你自己写的命令冒号右边容器端口服务监听处容器内服务80项目官方 READMEDVWA 是 42807.3 这份读法不覆盖什么第一它不覆盖启动不起来怎么办。本文只把一条命令读明白不给分步排查流程命令能不能在你那台机器上跑通取决于你那台机器的实际情况。第二它不给任何攻击步骤、利用手法与绕过做法也不给任何具体报错文本——官方说明里没有的本文不替它补。第三未实测的部分一律标注。本文的容器命令、端口自查命令都未在本机实际运行过全部标了待验证DVWA 的compose.yml里端口映射那一行也未逐字核对附表 A 里单独留了行。第四它不碰任何量级数字也不点名任何具体账号。⚠️代码待验证# 【读一条 docker run 命令 · 三个位置自检清单只看不改】# 位置一 镜像 -p 前面那一段跑的是哪一套东西# 位置二 左边 冒号左边是宿主端口我访问时要用它可以按需换# 位置三 右边 冒号右边是容器端口跟服务走# DVWA - 4280 Pikachu / upload-labs - 80## 两问收尾# 1. 我要改的是左边还是右边 - 换端口只改左边# 2. 地址里的端口取的是哪一边 - 左边完整版环境对照表这份三个位置自检清单加上全文引到的三条官方命令、第二章的冒号读法对照、第四章的三靶场容器端口表一并收进资料包扫码即可获取本章可以带走的一句一条docker run只有三个位置——跑哪套东西、外面从哪个号进、转给容器里哪个号读懂了这三个位置-p那一段就再也不会读错。附表 A本文引用事实与官方出处对照表#事实陈述一手出处来源名 URL核验日期本文位置1逐字命令Pikachudocker run -d -p 8765:80 8023/pikachu-expect:latest本地构建docker build -t pikachu .→docker run -d -p 8080:80 pikachu。⚠️ 两条命令宿主端口不一致8765 / 8080容器端口均为 80——任选一条不得混写Pikachu 官方 README「Docker」— https://raw.githubusercontent.com/zhuifengshaonianhanlu/pikachu/master/README.md2026-09-16第 1、3、4 章2逐字官方 README 两条 Docker 命令的容器端口都是 80宿主端口分别是 8765 与 8080同第 1 行2026-09-16第 1、2、3 章3逐字for running DVWA in containers, the web server is listening on port 4280 instead of the usual port of 80即 DVWA 容器监听 4280不是 80官方访问写法http://localhost:4280DVWA 官方 README「Docker」— https://raw.githubusercontent.com/digininja/DVWA/master/README.md2026-09-16第 4、6 章4DVWA 官方 Docker 用法clone → 进入DVWA目录 →docker compose up -dcompose.yml位于仓库根目录官方 README 另有pull_policy与volumes两处本地改动说明同第 3 行2026-09-16第 4 章5upload-labs 官方用法cd upload-labs/docker→docker build -t upload-labs .或docker pull c0ny1/upload-labsdocker run -d -p 80:80 upload-labs:latest官方容器端口80upload-labs 官方 README「2.3 Linux快速搭建」— https://raw.githubusercontent.com/c0ny1/upload-labs/master/README.md2026-09-16第 4、6 章6逐字文档中的your-ip指你的主机/VPS IP不是 Docker 容器内部 IPVulhub 官方 README中文— https://raw.githubusercontent.com/vulhub/vulhub/master/README.zh-cn.md2026-09-16第 6 章7逐字推荐使用至少1GB 内存的 VPS 或虚拟机同第 6 行NOTE 块2026-09-16第 6 章8官方清理命令docker compose down -v官方明确「你不再需要安装独立的 docker-compose而是使用 Docker 自带的 compose 命令」空格写法同第 6 行快速开始 / 前置条件2026-09-16第 4 章写法9本文未逐字核对DVWA 仓库根目录compose.yml里端口映射那一行具体怎么写官方 README 只说明该文件位置未在 README 中逐字给出端口映射写法同第 3 行逐条核对无对应逐字正文2026-09-16第 4 章待验证10本文未实测本机端口占用自查命令如lsof -i :端口、netstat -an | grep LISTEN在不同系统上的可用写法不完全一致本文命令未在本机实际运行过本文未实测环境无 docker命令写法以各系统自身说明为准2026-09-16第 5 章待验证11未实测Pikachu Docker 镜像8023/pikachu-expect:latest的可用性、维护方与最后推送时间——本次未核到官方依据Pikachu 官方 README 给出该命令镜像可用性未核到2026-09-16第 1、4 章待验证附表 B术语速查表术语一句话解释宿主端口host port-p冒号左边你访问时要写在地址里的入口号可以按需换容器端口container port-p冒号右边容器内服务实际监听的端口跟服务走-p 宿主:容器端口映射的写法顺序固定左边宿主、右边容器端口映射把宿主的入口号与容器里的服务端口对应起来的设置docker run把镜像跑成一条命令本文只读它的三个位置docker compose up -dDVWA 官方给的容器用法DVWA 的端口写在compose.yml里不在命令行上compose.ymlDVWA 仓库根目录里的配置文件本文未逐字核对其中端口映射那一行your-ip官方文档占位符指主机/VPS IP不是容器内部 IPlocalhost在本机上自己访问时常用到的主机写法4280DVWA 容器的监听端口不是 8080Pikachu 与 upload-labs 容器的监听端口代码待验证本文标记该命令未在本机实际运行过待验证本文标记该项未取到官方逐字依据或未实测写在最后这篇用到的资料写这篇时我把 Pikachu 官方 README 里那两条 Docker 命令并排放在一起盯了很久那个一个 8765、一个 8080、右边却都是 80才想明白这件事值得单独写一篇只要把冒号两边分清很多端口上的疑问自己就散了。顺手也整理了几份配套的东西端口映射速查卡-p 宿主:容器的读法、三个位置、换端口只改哪一边靶场环境对照表DVWA、upload-labs 在 Windows / macOS / Linux 三平台的可行性与推荐路径Web 安全学习路线图从基础打牢到安全管理四个阶段各学什么常用靶场清单每个靶场练什么、适合哪个阶段资料是我自己整理的放在下面这个码上扫码即可获取添加时备注「靶场」优先通过。拿到之后建议先看端口映射速查卡那一份先把冒号左边是宿主、右边是容器这一句记牢再回头看命令里的端口段。