A free, Docker PXE server that generates a boot menu from a folder of ISOs an alternative to iVentoy
1.3K
A free, Docker-based PXE server that auto-generates a boot menu from a folder of ISOs — an open alternative to iVentoy, built on ideas from netboot.xyz and Ventoy.
Drop *.iso files into a folder, start the container, and machines on your LAN
get an iPXE boot menu with every detected system. DHCP is optional and can be
disabled.
wimboot, and the install
sources are wired up automatically (no manual Shift+F10 dance), iVentoy-style.sanboot + memdisk fallback entries.off, proxy (ProxyDHCP,
recommended), full (standalone DHCP server).undionly.kpxe / ipxe.efi).Create a docker-compose.yml:
services:
pxe-boot0r:
image: carnyc/pxe-boot0r:latest
container_name: pxe-boot0r
network_mode: host # PXE/DHCP need raw L2 broadcasts
privileged: true # only required for WIN_INSTALL_MODE=smb
restart: unless-stopped
environment:
DHCP_MODE: proxy # off | proxy | full
PXE_SERVER_IP: 192.168.1.10
WIN_INSTALL_MODE: http # smb | http
volumes:
- ./isos:/srv/isos:ro
Then add ISOs and start:
mkdir -p isos && cp /path/to/*.iso isos/
docker compose up -d
A client doing PXE boot on the same LAN now sees the menu.
Tags: latest, 1.0.0.
| Variable | Default | Meaning |
|---|---|---|
DHCP_MODE | proxy | off (TFTP/HTTP only), proxy (coexist with your router's DHCP — recommended), full (standalone DHCP) |
PXE_SERVER_IP | auto | This host's IP, as seen by PXE clients |
LISTEN_IFACE | all | Interface dnsmasq binds to (e.g. eth0) |
DHCP_RANGE_START / _END | — | Lease range (full mode only) |
DHCP_NETMASK / DHCP_ROUTER / DHCP_DNS | — | Network options (full mode) |
MENU_TITLE | pxe-boot0r | Boot-menu title |
MENU_TIMEOUT | 30 | Auto-select default after N seconds |
WIN_INSTALL_MODE | smb | How Windows ISOs deliver sources: smb or http |
full mode)Use full only when nothing else serves DHCP on the LAN (e.g. an isolated lab
network). PXE_SERVER_IP, DHCP_RANGE_START and DHCP_RANGE_END are required:
environment:
DHCP_MODE: full
PXE_SERVER_IP: 192.168.50.10 # this host (must be in the subnet below)
DHCP_RANGE_START: 192.168.50.100 # first lease — a single IPv4, NOT a CIDR
DHCP_RANGE_END: 192.168.50.200 # last lease — a single IPv4
DHCP_NETMASK: 255.255.255.0 # dotted-quad
DHCP_ROUTER: 192.168.50.1 # gateway given to clients (DHCP option 3)
DHCP_DNS: 1.1.1.1 # DNS given to clients (DHCP option 6)
DHCP_RANGE_START / _END are single addresses (e.g. 192.168.50.100),
not a CIDR like 192.168.50.0/24.PXE_SERVER_IP must be in the same subnet as the range.proxy mode you only set PXE_SERVER_IP; the DHCP_RANGE_* /
DHCP_ROUTER / DHCP_DNS options are ignored (your existing DHCP server
hands those out).| Mount | Purpose |
|---|---|
./isos:/srv/isos:ro | Your *.iso files (the only mount you need) |
./tftp:/srv/tftp-overrides:ro | Optional — custom boot.ipxe / your own wimboot |
./drivers:/srv/drivers:ro | Optional — override the bundled httpdisk |
wimboot and httpdisk are bundled in the image — nothing to download.
Drop the Windows ISO into ./isos and pick how the install sources reach WinPE:
WIN_INSTALL_MODE=smb (default): the ISO is loop-mounted and exposed via
an anonymous Samba share; WinPE mounts it and runs setup.exe. Needs
privileged: true.WIN_INSTALL_MODE=http (iVentoy-style): the bundled
httpdisk driver is injected into
boot.wim; WinPE mounts the HTTP-served ISO as a virtual CD-ROM. Disable
Secure Boot on the client (WinPE is booted in test-signing mode). No SMB, no
loop-mount — does not need privileged.network_mode: host is required (DHCP uses raw broadcasts). Ports: 67/udp
(DHCP), 69/udp (TFTP), 4011/udp (ProxyDHCP), 80/tcp (HTTP), plus 445/139 (SMB)
in smb mode. privileged: true is only needed for WIN_INSTALL_MODE=smb.
wimboot gestartet und die
Installationsquellen werden automatisch eingebunden (kein manuelles
Shift+F10), im iVentoy-Stil.sanboot- + memdisk-Fallback-Einträge.off, proxy (ProxyDHCP,
empfohlen), full (eigenständiger DHCP-Server).undionly.kpxe / ipxe.efi).docker-compose.yml anlegen:
services:
pxe-boot0r:
image: carnyc/pxe-boot0r:latest
container_name: pxe-boot0r
network_mode: host # PXE/DHCP brauchen rohe L2-Broadcasts
privileged: true # nur für WIN_INSTALL_MODE=smb nötig
restart: unless-stopped
environment:
DHCP_MODE: proxy # off | proxy | full
PXE_SERVER_IP: 192.168.1.10
WIN_INSTALL_MODE: http # smb | http
volumes:
- ./isos:/srv/isos:ro
Dann ISOs ablegen und starten:
mkdir -p isos && cp /pfad/zu/*.iso isos/
docker compose up -d
Ein PXE-Client im selben LAN sieht jetzt das Menü.
Tags: latest, 1.0.0.
| Variable | Default | Bedeutung |
|---|---|---|
DHCP_MODE | proxy | off (nur TFTP/HTTP), proxy (koexistiert mit Router-DHCP — empfohlen), full (eigener DHCP-Server) |
PXE_SERVER_IP | auto | IP dieses Hosts, wie der Client sie sieht |
LISTEN_IFACE | alle | Interface, an das dnsmasq bindet (z. B. eth0) |
DHCP_RANGE_START / _END | — | Lease-Bereich (nur full-Modus) |
DHCP_NETMASK / DHCP_ROUTER / DHCP_DNS | — | Netzwerk-Optionen (full-Modus) |
MENU_TITLE | pxe-boot0r | Titel des Bootmenüs |
MENU_TIMEOUT | 30 | Auto-Auswahl nach N Sekunden |
WIN_INSTALL_MODE | smb | Wie Windows-ISOs Quellen liefern: smb oder http |
full-Modus)full nur nutzen, wenn sonst niemand im LAN DHCP macht (z. B. isoliertes
Lab-Netz). PXE_SERVER_IP, DHCP_RANGE_START und DHCP_RANGE_END sind Pflicht:
environment:
DHCP_MODE: full
PXE_SERVER_IP: 192.168.50.10 # dieser Host (muss im Subnetz unten liegen)
DHCP_RANGE_START: 192.168.50.100 # erste Lease — eine einzelne IPv4, KEIN CIDR
DHCP_RANGE_END: 192.168.50.200 # letzte Lease — eine einzelne IPv4
DHCP_NETMASK: 255.255.255.0 # als Dotted-Quad
DHCP_ROUTER: 192.168.50.1 # Gateway für Clients (DHCP-Option 3)
DHCP_DNS: 1.1.1.1 # DNS für Clients (DHCP-Option 6)
DHCP_RANGE_START / _END sind einzelne Adressen (z. B. 192.168.50.100),
kein CIDR wie 192.168.50.0/24.PXE_SERVER_IP muss im selben Subnetz wie der Bereich liegen.proxy-Modus setzt du nur PXE_SERVER_IP; die Optionen DHCP_RANGE_* /
DHCP_ROUTER / DHCP_DNS werden ignoriert (die vergibt dein vorhandener
DHCP-Server).| Mount | Zweck |
|---|---|
./isos:/srv/isos:ro | Deine *.iso-Dateien (der einzige nötige Mount) |
./tftp:/srv/tftp-overrides:ro | Optional — eigene boot.ipxe / eigenes wimboot |
./drivers:/srv/drivers:ro | Optional — gebündeltes httpdisk überschreiben |
wimboot und httpdisk sind im Image enthalten — nichts herunterzuladen.
Windows-ISO nach ./isos legen und wählen, wie die Quellen zu WinPE kommen:
WIN_INSTALL_MODE=smb (Default): Die ISO wird loop-gemountet und per
anonymem Samba-Share bereitgestellt; WinPE mountet sie und startet
setup.exe. Braucht privileged: true.WIN_INSTALL_MODE=http (iVentoy-Stil): Der gebündelte
httpdisk-Treiber wird in die
boot.wim injiziert; WinPE mountet die per HTTP ausgelieferte ISO als
virtuelles CD-Laufwerk. Am Client Secure Boot deaktivieren (WinPE läuft im
Test-Signing-Modus). Kein SMB, kein Loop-Mount — braucht kein privileged.network_mode: host ist nötig (DHCP nutzt rohe Broadcasts). Ports: 67/udp
(DHCP), 69/udp (TFTP), 4011/udp (ProxyDHCP), 80/tcp (HTTP), zusätzlich 445/139
(SMB) im smb-Modus. privileged: true ist nur für WIN_INSTALL_MODE=smb
erforderlich.
Source / Issues: see the project repository.
License: the image bundles open-source components (dnsmasq, nginx, iPXE,
samba, …) plus wimboot (GPLv2) and httpdisk (GPL) — both redistributed
binaries; their sources are referenced in the repository's vendor/ folder.
Content type
Image
Digest
sha256:cc9892ef1…
Size
93.8 MB
Last updated
4 months ago
docker pull carnyc/pxe-boot0r