ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Docker部署iVentoy:搭建PXE网络装机平台,批量装系统不再插U盘

Docker部署iVentoy:搭建PXE网络装机平台,批量装系统不再插U盘 想要把几十台机器快速统一装上系统最省事的方案不是拿U盘一台台插而是直接把网络启动服务架起来。Docker 部署 iVentoy 这件事我是在给实验室批量重装系统时真正下决心搞定的一台一台插U盘实在太痛苦。后来把 iVentoy 装进容器里跑发现它其实就是一个开箱即用的 PXE 网络装机平台不需要为每个ISO单独配启动菜单把镜像丢进目录就能从网络开机安装。这篇文章就围绕“ D o c k e r i v e n t o y P X E” 这条线把我从零到实际用起来的完整过程拆给你看适合网管、运维新手也适合整天在 NAS 上折腾 Docker 的朋友。1. 认识 iVentoy为什么还要自己折腾网络装机1.1 传统 PXE 装机的痛点在哪PXE 其实是 Intel 提出的网络启动标准客户端在 BIOS/UEFI 阶段通过网卡向网络发起请求由服务器分配 IP 地址再引导一段启动程序最后把系统镜像挂载进来完成安装。思路本身不复杂但传统落地非常烦你需要同时配置 DHCP、TFTP、FTP/HTTP/NFS 好几个服务再把每个系统镜像对应的内核、initrd、启动参数写进pxelinux.cfg。如果只是装一个 Ubuntu 还好一旦要维护 Windows、CentOS、国产系统、PE 维护盘好几类镜像配置量立刻膨胀。我最早就是这么干的光是一个菜单文件就改了不知多少遍每次新增版本都要复制目录、改默认项、核对路径一不留神就漏掉某个引导文件。后来换了思路直接找能“扫码即用”的启动服务才发现 iVentoy 这个项目。它是我一直在用的 Ventoy 的“网络版”兄弟设计目标恰好就是打掉传统 PXE 那堆繁琐配置。ISO 文件只需要统一放进一个目录iVentoy 会自动扫描、自动生成启动菜单客户端从网络引导后看到的是一个图形化菜单选哪个就直接启动哪个镜像完全不需要为每个系统单独写配置。1.2 iVentoy 的启动链路是怎么走的iVentoy 本质上是把几类服务集成到了一个进程里它自带 DHCP 服务客户端网卡进入 PXE 模式后会从这个服务拿到 IP 和启动文件地址接着通过 TFTP 下载引导程序之后引导程序再走 HTTP 去拉取菜单和镜像数据。注意这个链路和传统方案最大的区别传统 PXE 是把启动文件直接指向具体的内核和 initrd而 iVentoy 的引导程序会先显示一个动态生成的菜单让用户自己挑选要装哪个 ISO。菜单列表来自后端对镜像目录的实时扫描所有 ISO 都放在一个目录里增加镜像时目录里多放一个文件就行菜单自动更新非常直观。对经常批量装机的场景来说这个优势很致命。以前我在机房给几十台机器装系统每台机器还得先设置好从哪个镜像启动现在只需要保证机器能进 PXE 模式菜单上统一选一次然后该干嘛干嘛系统装完再自动重启进入本地系统。整个过程不再依赖U盘这种物理介质也不用反复拔插省掉了大量手动作业。1.3 为什么非要用 Docker 装有人会问iVentoy 本身就是一个 Linux 下的可执行文件直接扔到服务器上跑不就行了为什么还要套一层 Docker我的答案有三个隔离、可回滚、好迁移。直接装裸机虽然也能跑但 iVentoy 会踩到系统的网络栈和端口如果运维机上同时跑着 nginx、其他 DHCP 服务很容易互相干扰。装进容器之后挂载目录、端口、网络模式都能用配置文件声明删掉容器也不会在宿主机留下乱七八糟的依赖。想升级就重新打一个镜像想回退就把旧镜像切回来数据卷单独保留不用操心“卸载不干净”这种问题。尤其是现在很多人用 NAS 跑 Docker飞牛NAS、群晖、威联通都可以把 iVentoy 作为一个常驻容器放进系统管理界面统一查看状态比维护一台裸机上的脚本方便得多。2. 部署前准备端口、Docker 和一张“干净”的内网2.1 关键协议先搞懂踩坑少一半我见过太多人部署完 iVentoy 发现客户端死活启动不了原因往往不是工具本身而是对底层链路理解不够。这里把三个协议捋一遍DHCPUDP 67客户端开机请求 IPiVentoy 会动态分配地址同时告诉客户端启动文件叫什么。TFTPUDP 69用来把小的引导文件从服务端传到客户端完成最初的引导。HTTPTCP 80客户端进入图形菜单后后续的菜单、镜像数据都走 HTTP速度比 TFTP 快得多。可以这么理解DHCP 是总机帮你转接TFTP 是给你递一张电梯卡HTTP 才是把你顺着电梯送进系统安装界面。三个环节少了任何一个都会卡在启动早期阶段。这里面有个非常关键的结论因为 iVentoy 要做 DHCP 广播应答Docker 容器必须使用host网络模式。桥接模式下容器有自己独立的虚拟网卡广播包不一定能到达真实局域网客户端很可能就搜不到这个 DHCP 服务。我后面会在配置里专门强调这一点这也是整个部署里最容易出错的地方。2.2 宿主机选择和 Docker 环境既然 iVentoy 是网络服务宿主机最好选一台“安稳内网机器”不建议用装 Windows 的日常办公电脑来跑。最稳妥的是 Linux 服务器或 NAS 上跑 Docker比如飞牛NAS这类自带应用中心的系统直接在 Docker 界面里新建容器。Ubuntu 上装 Docker 的步骤大家应该很熟了核心命令就是curl -fsSL https://get.docker.com | sh装完systemctl enable --now docker确认一下状态。如果你非要在 Windows 上试Docker Desktop 是一个选择但我要提前打个预防针iVentoy 需要监听 UDP 67/69 这种底层端口而 Docker Desktop 在 Windows 上本质是跑在 WSL2 虚拟机里的广播和底层网络包的转发经常出问题。很多人在这个环节收到Virtualization support not detected或者Docker Desktop failed to start多半是 BIOS 里的 VT-x/AMD-V 没开或者 Windows 功能里没有启用“虚拟机平台”和“Hyper-V”。解决顺序是先去 BIOS 打开虚拟化再到“启用或关闭 Windows 功能”勾选“虚拟机平台”然后安装 WSL2问题基本就消了。但我后面给的方案仍然是基于 Linux/NAS 部署Windows 只适合做控制台入口不适合跑服务端。2.3 端口清单和 IP 规划部署之前先把网络规划写清楚可以避免启动现场手忙脚乱。下面是我常用的端口清单端口协议作用67UDPDHCP 分配 IP 和启动信息69UDPTFTP 下发引导文件80TCPHTTP 菜单和镜像数据传输1080 / 16000 / 18000TCP管理后台、菜单编辑等扩展服务版本不同端口会有差异以启动日志为准还有一个更重要的点iVentoy 自带 DHCP 服务器如果你所在局域网已经存在路由器或别的 DHCP 服务就会发生冲突。我的习惯是单独划出一个 VLAN 给装机网络或者在路由器上把装机网段的 DHCP 关掉让 iVentoy 独占。万一没有 VLAN至少也要把宿主机设置成固定 IP并确保网段内没有第二台 DHCP 服务器在乱发地址。3. Docker 部署 iVentoy 完整实操3.1 准备目录和 iVentoy 安装包先建一个工作目录比如/opt/iventoy下面分data和iso两个子目录。data用于保存 iVentoy 的配置、日志和数据库iso用于存放所有系统镜像文件。把目录结构固定下来以后后续不管是升级还是迁移只需要把这个目录整体备份即可。考虑到 iVentoy 的 Docker 镜像在 Docker Hub 上有不少社区维护的版本但质量参差不齐我更推荐用一个“官方 Linux 包 本地构建镜像”的方式。去 iVentoy 官方发布页下载对应版本的iVentoy-*-linux.tar.gz放到刚才的/opt/iventoy下。体积很小基本就几十 MB下载很快。3.2 写 Dockerfile 和 docker-compose.yml在/opt/iventoy下新建一个 DockerfileFROM debian:bullseye-slim RUN apt-get update \ apt-get install -y --no-install-recommends bash iproute2 net-tools curl ca-certificates \ rm -rf /var/lib/apt/lists/* WORKDIR /opt COPY iVentoy-*.tar.gz /opt/ RUN tar -xzf iVentoy-*.tar.gz rm -f /opt/iVentoy-*.tar.gz WORKDIR /opt/iVentoy EXPOSE 67/udp 69/udp 80/tcp 1080/tcp 16000/tcp 18000/tcp CMD [/bin/sh, -c, ./iventoy.sh -R /dev/null 21; tail -F /opt/iVentoy/log/*.log]简单解释一下我用 Debian 作为基础镜像因为 iVentoy 官方包在纯 Debian 环境下表现最稳定。安装iproute2和net-tools是为了方便进容器里调试端口curl用来做 HTTP 的连通性测试。工作目录切到/opt/iVentoy后通过iventoy.sh -R启动服务-R参数表示后台运行并自动重启然后用tail -F把日志保活在前台。再新建一个 docker-compose.ymlservices: iventoy: build: . image: iventoy-local:latest container_name: iventoy network_mode: host restart: unless-stopped volumes: - ./data:/opt/iVentoy/data - ./iso:/opt/iVentoy/iso这份 compose 文件里最重要的就是network_mode: host。上一节已经说了iVentoy 必须直接面对局域网host 模式能让容器共享宿主机的网络栈DHCP 广播和 UDP 端口监听才能正常工作。数据卷映射把配置和镜像目录暴露到宿主机以后放 ISO、改配置都不需要进容器。3.3 构建并启动服务在/opt/iventoy下执行docker compose up -d --build构建过程大概几十秒到几分钟不等取决于机器网络和性能。构建完以后查看状态docker ps如果看到iventoy容器处于 Up 状态说明服务已经起来了。继续看日志确认端口监听情况docker compose logs -f正常情况下日志里会输出 iVentoy 的监听地址、版本号以及管理控制台的访问地址。由于我用了 host 模式日志里的 IP 一般就是宿主机内网 IP比如http://192.168.1.100:1080/或http://192.168.1.100:16000/具体端口以你当前版本日志为准。为了进一步确认 UDP 端口在监听可以进容器看一眼docker exec -it iventoy bash netstat -lunp | grep -E :67|:69如果能看到0.0.0.0:67和0.0.0.0:69的监听记录说明 DHCP 和 TFTP 已经就绪接下来可以真正测试网络启动了。4. 通过 iVentoy 完成第一次网络启动装机4.1 放入镜像并刷新菜单先把需要装的系统镜像复制到/opt/iventoy/iso目录下。比如我要装 Ubuntucp /tmp/ubuntu-22.04.4-desktop-amd64.iso /opt/iventoy/iso/iVentoy 支持直接把镜像文件放在根目录也支持按子目录分类管理。我的习惯是按场景建文件夹比如windows/、linux/、tools/每个文件夹里放对应镜像这样菜单层级更清晰批量装机时不会因为镜像太多而乱。放好镜像后打开管理控制台页面刷新一下镜像列表。iVentoy 可以动态识别新增的 ISO不需要重启 Docker 容器。控制台里能看到镜像文件名、大小、类型如果识别异常会给出提示比如镜像损坏或者格式不支持。菜单自动生成以后客户端网络启动时看到的列表就跟控制台里的列表是一致的。4.2 客户端开机实测找一台空机器开机进 BIOS 设置把启动模式改成 PXE 网络启动。不同品牌 BIOS 入口不太一样常见的是在 Boot 设置里开启“Network Boot”或“PXE Boot”部分新机器还要开启 UEFI 网络栈。保存重启后网卡会开始广播 DHCP 请求。如果一切正常屏幕会依次出现这么几个阶段客户端获取到 IP 地址屏幕上显示类似Client IP: 192.168.1.150的信息开始从 TFTP 下载引导文件这个阶段一般很快几乎一闪而过进入 iVentoy 的图形菜单列出所有可用的 ISO选择目标系统镜像回车系统进入正常的安装引导界面。我在实际部署中遇到过几个小问题有些主板的 PXE 菜单选项名是“IPv4 PXE Boot”有些叫“Realtek PXE B02 D00”反正认准带“PXE”字样的就开始启动。如果卡在第一步获取不到 IP大概率是 DHCP 没通先回服务器确认日志有没有客户端请求记录。如果卡在第二步 TFTP 下载失败优先检查宿主机防火墙是否挡了 UDP 69以及交换机端口是否做了 DHCP Snooping 之类的限制。4.3 UEFI、Legacy 和镜像兼容性iVentoy 本身支持 UEFI 和 Legacy BIOS 两种模式但我建议现在的机器优先用 UEFI 模式因为新版系统对 UEFI 支持更好安装时分区也更省事。UEFI 模式需要注意 Secure Boot有些发行版的内核没有签名Secure Boot 开着可能导致启动失败。做法是在 BIOS 里临时关掉 Secure Boot等进系统安装完再决定是否重新开启。镜像兼容性方面Windows 原版 ISO、Ubuntu、Debian、CentOS 这些常见镜像iVentoy 基本都开箱即用。PE 维护盘路径会稍微特殊一点有些 PE 的 ISO 需要指定额外的参数但控制台提供了一组可编辑的启动参数可以直接在菜单项上右键编辑。这里我踩过一条坑给老机器装 Windows 7 时默认 UEFI 启动会卡在引导界面后来在菜单项里关闭“安全启动”相关选项并强制走 Legacy 模式问题才解决。所以做批量装机前最好先用一台代表性机器跑通确认镜像和 BIOS 设置都匹配再开始批量操作。5. 常见问题与排查手册5.1 客户端获取不到 IP 或引导文件超时这个问题占了部署失败原因的一半以上。第一排查点永远是“有没有第二台 DHCP 服务器”。你可以在同一网段内跑一个抓包工具但我习惯用更笨的办法临时把客户端网线插到 iVentoy 宿主机所在交换机确保物理链路只经过这一台 DHCP。如果这时候能拿到 IP说明原局域网里确实有其他 DHCP 在“抢答”那就需要划分网段或在路由器上关闭 DHCP。第二排查点是防火墙。很多 Linux 发行版自带的ufw或者firewalld默认不放行 UDP 67/69。我在 Ubuntu 上遇到过容器日志显示正常但客户端就是过不了 TFTP后来执行sudo ufw allow 67/udp sudo ufw allow 69/udp sudo ufw allow 80/tcp放行之后立刻就好了。如果你用的是云服务器或者 NAS 系统还要去安全组或防火墙管理界面检查一下。第三排查点是 Docker 网络模式。如果你用的是默认 bridge 网络即使端口映射做了DHCP 广播也可能被容器虚拟网卡挡掉。必须回 docker-compose.yml 确认network_mode: host没有写错修改后重启容器然后重新测试。5.2 Docker 部署时的典型坑容器一直重启或者启动后立即退出我遇到过两次。一次是 iVentoy 安装包的解压目录和 Dockerfile 里 WORKDIR 对不上启动脚本没找到。解决方法是进容器里检查目录结构确保/opt/iVentoy/iventoy.sh确实存在。另一次是tail -F匹配的日志通配符没有命中导致前台进程退出容器被 Docker 自动回收。我后面的 CMD 改成了先写固定日志文件再tail -F稳定了很多。还有一个非常常见的坑是端口被宿主机占用。如果你的宿主机本身开着 nginx 或其他 Web 服务TCP 80 会被占掉iVentoy 日志会提示 HTTP bind 失败。我的做法是在 iVentoy 控制台或配置文件里把 HTTP 端口改成 8080但要注意客户端引导阶段也会自动获取这个端口改的时候要一起改不要只改一半。另外管理台端口 1080/16000 也可能被其他工具占用遇到就换一个日志里会有明确提示。关于 Windows 下 Docker Desktop 的问题我在第 2 节提过。如果你只是在 Windows 上做实验收到Virtualization support not detected时按这个顺序排查重启进 BIOS 打开 VT-x/AMD-VWindows 功能里勾上“适用于 Linux 的 Windows 子系统”和“虚拟机平台”然后执行wsl --update更新 WSL2 内核。这一套做完Docker Desktop 基本都能启动。但再次强调这只适合体验不适合把 iVentoy 放在生产网络里长期跑。5.3 常见问题速查表现象可能原因处理方式客户端无法获取 IPDHCP 冲突、网段不对、容器不是 host 模式关闭其他 DHCP、确认宿主机固定 IP、检查 compose 网络模式TFTP 下载超时防火墙挡了 UDP 69、交换机限制放行 UDP 69检查交换机 DHCP Snooping 配置能进菜单但选镜像后黑屏Secure Boot 开启、镜像兼容性关闭 Secure Boot尝试 Legacy 模式Docker 容器反复重启启动脚本路径错误、日志文件不匹配进容器检查 /opt/iVentoy 目录结构修正 CMD宿主机已有 nginx80 端口被占端口冲突修改 iVentoy 的 HTTP 端口同时更新引导参数管理控制台打不开管理端口被防火墙拦截、版本端口不同放行 1080/16000查看日志确认实际端口新增 ISO 菜单里没出现镜像目录映射错误、缓存未刷新确认挂载卷路径控制台手动刷新镜像列表这张表基本覆盖了我踩过的所有主要问题。真正上手的时候先看日志再看网络别凭感觉乱改配置效率会高很多。6. 进阶配置、安全隔离与个人操作体会6.1 把 iVentoy 锁在内网使用iVentoy 自带的 DHCP 服务天然是局域网服务绝对不应该暴露到公网。我的建议是部署在一个独立的网段或 VLAN 里宿主机不做端口映射到公网管理后台也改用强密码并在 iVentoy 配置文件里限制管理后台只监听内网地址。它本身就是给内网批量装机用的没必要开放到外网一旦暴露别人可以轻而易举地在你的网络里发起 DHCP 干扰和引导攻击风险极高。6.2 镜像目录的结构化管理和备份批量装机多了以后iso目录会越堆越乱。我的习惯是在目录下按时间或版本划分文件夹比如iso/ ├── windows/ │ ├── win10_22h2_x64.iso │ └── win11_23h2_x64.iso ├── linux/ │ ├── ubuntu-22.04.4-desktop-amd64.iso │ └── debian-12.4.0-amd64-netinst.iso └── tools/ └── wepe_2.3.iso这样菜单层级可控找镜像也快。data目录里的配置和日志我会定期打包备份命令特别简单tar -czf iventoy-backup-$(date %Y%m%d).tar.gz data升级 iVentoy 时只需要保留data和iso两个目录重新构建一个新的镜像版本再docker compose up -d替换容器配置和数据都不会丢。之前用裸机部署时最头疼的“升级完配置全没”的问题在 Docker 思路下基本不存在。6.3 实测下来的一些想法搞了这么久我最大的体会是Docker 部署 iVentoy 的难度其实不在 Docker而在对网络的理解。只要理解了 DHCP、TFTP、HTTP 这条链路并且克制住不用默认 bridge 模式剩下的基本是顺水推舟。把自己从U盘时代解救出来以后再回头给机房几十台机器装系统心态是完全不一样的。最开始我甚至怀疑“网络装机平台”是不是有点夸大直到菜单在客户端屏幕上刷出来选择镜像回车安装进度条一路走完我才确认它真的能替代传统 PXE 那套复杂配置。如果要给你几个实际操作建议我会说先在一台测试机上跑通再上量防火墙规则提前配好不要等启动现场再调镜像目录按照自己的使用习惯先分类免得后期一股脑全塞在根目录。最后靠谱的宿主机比任何技巧都重要一台 Linux 服务器或者 NAS 上面跑 iVentoy稳定性远好过临时用 Windows 笔记本硬撑。
返回列表