sudo apt update
sudo apt install -y docker.io docker-compose network-manager dnsutils
sudo systemctl enable docker NetworkManager
sudo systemctl start docker NetworkManager
nmcli con add type ethernet ifname eth0 con-name eth0-static \
ipv4.addresses 192.168.1.20/24 ipv4.gateway 192.168.1.1 ipv4.method manual
nmcli con up eth0-static
Verify:
nmcli device status
ip addr show eth0
ip route show
sudo nmcli con add type macvlan ifname macvlan-lan con-name macvlan-lan \
dev eth0 mode bridge ipv4.addresses 192.168.1.23/32 ipv4.method manual
Add static routes for containers:
sudo nmcli con modify macvlan-lan +ipv4.routes "192.168.1.21/32"
sudo nmcli con modify macvlan-lan +ipv4.routes "192.168.1.22/32"
sudo nmcli con modify macvlan-lan +ipv4.routes "192.168.1.23/32"
Bring interface up:
sudo nmcli con up macvlan-lan
Verify:
nmcli device status
ip addr show macvlan-lan
ip route show
Copy your Pi-hole and other container volumes:
${HOME}/pihole/pihole
${HOME}/kidspi/pihole
Ensure correct permissions: (verify PID and GID for your system)
sudo chown -R 1001:995 ${HOME}/pihole
sudo chown -R 1001:995 ${HOME}/kidspi
Place your docker-compose.yml in a directory. Make sure:
macvlan-lanis external- Containers have fixed IPs (
192.168.1.21/.22) ports:mappings for macvlan containers can be removed
docker compose up -d
Verify:
docker ps
docker logs pihole
docker logs kidspi
Test connectivity:
ping -c 2 192.168.1.21
ping -c 2 192.168.1.22
dig @192.168.1.21 google.com
dig @192.168.1.22 google.com
Export connections so future restores are faster:
nmcli connection export eth0-static eth0-static.nmconnection
nmcli connection export macvlan-lan macvlan-lan.nmconnection
Restore with:
nmcli connection import type ethernet file eth0-static.nmconnection
nmcli connection import type macvlan file macvlan-lan.nmconnection
nmcli con up eth0-static
nmcli con up macvlan-lan
- Stops after each step so you can verify success
- Uses only packages in a vanilla install (no
dhcpcdorifupdown) - Ensures your Pi-hole containers keep the same IPs