Installing LXD, the Linux container daemon
LXC is a system built on the modern Linux kernel and enables the creation and management of virtual Linux systems or containers. As discussed earlier, LXC is not a full virtualization system and shares the kernel with the host operating system, providing lightweight containerization. LXC uses Linux namespaces to separate and isolate the processes running inside containers. This provides much better security than simple chroot-based filesystem isolation. These containers are portable and can easily be moved to another system with a similar processor architecture.
Ubuntu 15.04 unveiled a new tool named LXD, which is a wrapper around LXC. The official page calls it a container hypervisor and a new user experience for LXC. Ubuntu 16.04 comes preinstalled with its latest stable release, LXD 2.0. With LXD, you no longer need to work directly with lower-level LXC tools.
LXD adds some important features to LXC containers. First, it runs unprivileged containers by default, resulting in improved security and better isolation for containers. Second, LXD can manage multiple LXC hosts and can be used as an orchestration tool. It also supports the live migration of containers across hosts.
LXD provides a central daemon named lxd and a command-line client named lxc
. Containers can be managed with the command-line client or the REST APIs provided by the LXD daemon. It also provides an OpenStack plugin, nova-compute-lxd, to deploy containers on the OpenStack cloud.
In this recipe, we will learn to install and configure the LXD daemon. This will set up a base for the next few recipes in this chapter.
Getting ready
You will need access to the root account or an account with sudo
privileges.
Make sure that you have enough free space available on disk.
How to do it…
Ubuntu 16.04 ships with the latest release of LXD preinstalled. We just need to initialize the LXD daemon to set the basic settings.
- First, update the
apt
cache and try to install LXD. This should install updates to the LXD package, if any:$ sudo apt-get update $ sudo apt-get install lxd
Tip
If you are using Ubuntu 14.04, you can install LXD using the following command:
$ sudo apt-get -t trusty-backports install lxd
- Along with LXD, we will need one more package named ZFS—the most important addition to Ubuntu 16.04. We will be using ZFS as a storage backend for LXD:
$ sudo apt-get install zfsutils-linux
- Once LXD has been installed, we need to configure the daemon before we start using it. Use
lxd init
to start the initialization process. This will ask some questions about the LXD configuration:$ sudo lxd init Name of the storage backend to use (dir or zfs): zfs Create a new ZFS pool (yes/no)? yes Name of the new ZFS pool: lxdpool Would you like to use an existing block device (yes/no)? no Size in GB of the new loop device (1GB minimum): 10 Would you like LXD to be available over the network (yes/no)? no Do you want to configure the LXD bridge (yes/no)? yes Warning: Stopping lxd.service, but it can still be activated by: lxd.socket LXD has been successfully configured.
Now, we have our LXD setup configured and ready to use. In the next recipe, we will start our first container with LXD.
How it works…
Ubuntu 16.04 comes preinstalled with LXD and makes it even easier to start with system containers or operating system virtualization. In addition to LXD, Ubuntu now ships with inbuilt support for ZFS (OpenZFS), a filesystem with support for various features that improve the containerization experience. With ZFS, you get faster clones and snapshots with copy-on-write, data compression, disk quotas, and automated filesystem repairs.
LXD is a wrapper around lower-level LXC or Linux containers. It provides the REST API for communicating and managing LXC components. LXD runs as a central daemon and adds some important features, such as dynamic resource restrictions and live migrations between multiple hosts. Containers started with LXD are unprivileged containers by default, resulting in improved security and isolation.
This recipe covers the installation and initial configuration of the LXD daemon. As mentioned previously, LXD comes preinstalled with Ubuntu 16. The installation commands should fetch updates to LXD, if any. We have also installed zfsutils-linux
, a user space package to interact with ZFS. After the installation, we initialized the LXD daemon to set basic configuration parameters, such as the default storage backend and network bridge for our containers.
We selected ZFS as the default storage backend and created a new ZFS pool called lxdpool
, backed by a simple loopback device. In a production environment, you should opt for a physical device or separate partition. If you have already created a ZFS pool, you can directly name it by choosing no
for Create new ZFS pool
. To use a separate storage device or partition, choose yes
when asked for block storage.
Tip
Use the following commands to get ZFS on Ubuntu 14.04:
$ sudo apt-add-repository ppa:zfs-native/stable $ sudo apt-get update && sudo apt-get install ubuntu-zfs
ZFS is the recommended storage backend, but LXD also works with various other options, such as Logical Volume Manager (LVM) and btrfs (pronounced "butter F S"), that offer nearly the same features as ZFS or a simple directory-based storage system.
Next, you can choose to make LXD available on the network. This is necessary if you are planning a multi-host setup and support for migration. The initialization also offers to configure the lxdbr0
bridge interface, which will be used by all containers. By default, this bridge is configured with IPv6 only. Containers created with the default configuration will have their veth0
virtual Ethernet adapter attached to lxdbr0
through a NAT network. This is the gateway for containers to communicate with the outside world. LXD also installs a local DHCP server and the dnsmasq
package. DHCP is used to assign IP addresses to containers, and dnsmasq
acts as a local name-resolution service.
If you misplace the network bridge configuration or need to update it, you can use the following command to get to the network configuration screen:
$ sudo dpkg-reconfigure -p medium lxd
There's more…
The LXD 2.0 version, which ships with Ubuntu 16, is an LTS version. If you want to get your hands on the latest release, then you can install stable versions from the following repository:
$ sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable
For development releases, change the PPA to ppa:ubuntu-lxc/lxd-git-master
.
For more information, visit the LXC download page at https://linuxcontainers.org/lxc/downloads/.
If you still want to install LXC, you can. Use the following command:
$ sudo apt-get install lxc
This will install the required user space package and all the commands necessary to work directly with LXC. Note that all LXC commands are prefixed with lxc-
, for example, lxc-create
and lxc-info
. To get a list of all commands, type lxc-
in your terminal and press Tab twice.
See also
- For more information, check the LXD page of the Ubuntu Server guide: https://help.ubuntu.com/lts/serverguide/lxd.html
- The LXC blog post series is at https://www.stgraber.org/2013/12/20/lxc-1-0-blog-post-series/
- The LXD 2.0 blog post series is at https://www.stgraber.org/2016/03/11/lxd-2-0-blog-post-series-012/
- Ubuntu 16.04 switched to Systemd, which provides its own container framework, systemd-nspawn; read more about systemd containers on its Ubuntu man page at http://manpages.ubuntu.com/manpages/xenial/man1/systemd-nspawn.1.html
- See how to get started with systemd containers at https://community.flockport.com/topic/32/systemd-nspawn-containers