Dockerfile will build an image with latest cobbler from source code, atftp server isc dhcpd server and apache2 all managed by supervisord.
docker build ./cobbler -t shadwell/docker-cobbler-supervisord:#.#.# --build-arg GIT_COMMIT=$(git log -1 --format=%h)
commit used to build the docker image can be retrieved using:
docker inspect <docker_image_id> | jq '.[].ContainerConfig.Labels'
Cobbler container runs in unprivileged mode, to be able to deliver dhcp broadcast to dhcp server in container we use dhcp-helper which will relay messages to either network device or dhcp server ip.
- If you are using
docker run
$ sudo vi /etc/default/dhcp-helper
DHCPHELPER_OPTS="-b docker0 -i ens3"
- when usign docker-compose
$ sudo vi /etc/default/dhcp-helper
DHCPHELPER_OPTS="-i ens3 -s 172.16.238.10"
- start dhcp-helper
$ sudo systemctl start dhcp-helper.service
Below script will download Bionic and Xenial iso.
$ ./download-iso-and-mount.sh
$ docker run -dt -v /mnt/:/mnt -p 80:80/tcp -p 69:69/udp --name cobbler urosorozel/cobbler:latest
$ docker-compose up --build -d
Run script against container
docker exec -it cobbler /bin/bash -c "$(<import-iso.sh)"
$ sudo modprobe ip_conntrack_tftp ip_nat_tftp
$ sudo iptables -t raw -A PREROUTING -p udp --dport 69 -j CT --helper tftp
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-get update
$ sudo apt-get install docker-ce qemu-kvm virtinst libvirt-bin python3-pip
For Xenial
$ sudo usermod -aG docker,libvirtd ubuntu
or Bionic
$ sudo usermod -aG docker,libvirt ubuntu
logout and login to take an affect
$ sudo su - $USER
- update subnet details if required
$ echo "<network>
<name>cobbler</name>
<dns enable="no"/>
<forward mode='nat'/>
<bridge name='cobbler' stp='on' delay='0'/>
<ip address='192.168.10.1' netmask='255.255.255.0'></ip>
</network>" | virsh net-define /dev/stdin
- start cobbler libvirt network
$ sudo virsh start cobbler
- When testing in VM we want to relay all DHCP requests from cobbler bridge to container subnet
$ sudo vi /etc/default/dhcp-helper
DHCPHELPER_OPTS="-i cobbler -s 172.16.238.10"
- start dhcp-helper
$ sudo systemctl restart dhcp-helper.service
$ sudo curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
$ sudo chmod +x /usr/local/bin/docker-compose
$ git clone https://github.com/urosorozel/docker-cobbler.git
- Update variable according to you environment
# Cobbler server IP/hostname
COBBLER_SERVER_HOST_IP=192.168.122.91
# TFTP server
COBBLER_NEXT_SERVER_HOST_IP=192.168.122.91
# SSH public key
COBBLER_PUBLIC_SSH_KEY=
# Dhcp settings
COBBLER_SUBNET=192.168.10.0
COBBLER_NETMASK=255.255.255.0
COBBLER_ROUTERS=192.168.10.1
COBBLER_NAMESERVERS=8.8.8.8,1.1.1.1
COBBLER_DHCP_RANGE=192.168.10.50 192.168.10.100
# Proxy
COBBLER_PROXY_URL_EXT=
COBBLER_PROXY_URL_INT=
$ docker-compose up --build -d
Below script will download Bionic and Xenial iso.
$ ./download-iso-and-mount.sh
Run script against container
docker exec -it cobbler /bin/bash -c "$(<import-iso.sh)"
$ virt-install --connect qemu:///system \
--name demo \
--vcpu 2 \
--memory 2048 \
--disk size=10 \
--pxe \
--network network=cobbler,mac=0c:c4:7a:bb:ff:f1 \
--virt-type qemu \
--console pty,target_type=serial \
--graphics vnc,listen=0.0.0.0 \
--os-variant ubuntu18.04