LXD: Machine containers for Development

LXD is an awesome tool in my toolbox that I use everyday. LXD offers a streamlined user experience to Linux containers making them easy and simple to use. These containers are referred to as system containers or machine containers as they are not focused on a single process or software distribution. The project is very well documented and even has a try it online service available.

Stephane Graber’s LXD 2.0 blog post series is required reading. He gives a great introduction and overview of all the major features and functionality of LXD including images, profiles, configuration, and snapshots.

In my use, rather that booting up a VM I can quickly use LXD to boot up a variety of operating systems. I can then use various containers for bug reproduction and triage or to try new deployment scripts and tests in a clean environment.


LXD is easily installed in Ubuntu with apt and there is also the option of using a PPA to get the latest upstream release quickly. All of this is part of the excellent documentation.

The only item I would call out is running lxd init. This command is what sets up and configures the LXD daemon by telling it what storage and networking to use. Normally pressing enter through the process will get the correct settings, but it is worth reading through each option.


While the tool is called lxd, the commands all center around ‘lxc’. The basics include listing your containers with lxc list. To get pre-build images you can look at two example image remotes by running lxc image list images: or lxc image list ubuntu:. Based on those results launching an image is as simple as lxc image launch ubuntu:xenial <name>.

Executing on a container is done via lxc exec <name> <command>.

Stopping and deleting a container is done via lxc stop <name> and lxc delete <name>.

For even more details again take a look at Stephane’s blog post.


Sometimes there are days where I am switching between versions or trying various features out and I run into an issue with LXD. In these cases I like to wipe LXD out and start from scratch. This documents the process I take.

First, start with removing any containers or images and the packages themselves:

lxc list
lxc list -c n | grep '^|' | cut -d' ' -f2 | sed -n '1!p' | xargs lxc delete --force
lxc image list
lxc image list | grep '^|' | cut -d' ' -f9 | xargs lxc image delete
sudo apt-get purge lxd lxc

The reset is not done at this point. There are a few other areas to go and cleanup that will make sure that a new version or older version of lxd will not have any issues.

If lxd was setup to use zfs, delete the zpool lxd was using:

sudo zpool list
sudo zpool destroy default  # maybe named lxd in older versions

Delete the lxd bridge:

sudo ip link set lxdbr0 down
sudo brctl delbr lxdbr0

Finally, remove any final items in var, like logs:

sudo umount -l /var/lib/lxd/shmounts
sudo umount -l /var/lib/lxd/devlxd
sudo rm -Rf /var/lib/lxd
sudo rm -Rf /var/log/lxd
sudo rm -Rf /var/log/lxc

I suggest doing a reboot at this point to make sure things are fully cleaned up. Then afterwards reinstall and configure LXD:

sudo apt update
sudo apt upgrade
sudo apt install lxd lxc
sudo lxd init