Latest stable LXD on Ubuntu 16.04 LTS

3 min read

I have previously a small guide on how to get started with LXD 2.0 here. This however install LXD 2.0.5 and the current stable version is 2.6.2 at the time of writing. The whole setup is on a KVM VPS at RamNode. Notice that OpenVZ VPS does not support LXD as the kernel is too old.

Installation of LXD host

Lets add a repository to the newest stable LXD.

$sudo add-apt-repository ppa:ubuntu-lxc/lxd-stable
 This PPA contains the latest stable release of LXD as well as the latest stable version of any of its dependencies.
 More info:
Press [ENTER] to continue or ctrl-c or cancel adding it

gpg: keyring `/tmp/tmp9eaz0v8s/secring.gpg' created
gpg: keyring `/tmp/tmp9eaz0v8s/pubring.gpg' created
gpg: requesting key 7635B973 from hkp server
gpg: /tmp/tmp9eaz0v8s/trustdb.gpg: trustdb created
gpg: key 7635B973: public key "Launchpad PPA for Ubuntu LXC team" imported
gpg: Total number processed: 1
gpg:               imported: 1  (RSA: 1)

We then update and upgrade to get the latest stable version of LXD.

$sudo apt-get update
$sudo apt-get dist-upgrade

LXD should already be installed on Ubuntu 16.04.1, but if not execute the following. You can skip zfsutils-linux if you will not use ZFS.

$sudo apt-get install lxd zfsutils-linux

Now everything is handled in the LXD configuration, even the LXD bridge. Replace somepassword with your own password. I choose only to have an IPv4 network, not IPv6. Replace /dev/vda3 with your own device / partition for the ZFS storage.

Warning! Notice that I create a new ZFS pool that wipes the chosen partition / device. Choose dir as the storage backend or a ZFS loop device (answer no to "Would you like to use an existing block device (yes/no)?") if you do not wish to wipe a partition / device and to prevent accidental data loss.

$sudo lxd init
Name of the storage backend to use (dir or zfs) [default=zfs]:
Create a new ZFS pool (yes/no) [default=yes]?
Name of the new ZFS pool [default=lxd]:
Would you like to use an existing block device (yes/no) [default=no]? yes
Path to the existing block device: /dev/vda3
Would you like LXD to be available over the network (yes/no) [default=no]? yes
Address to bind LXD to (not including port) [default=all]:
Port to bind LXD to [default=8443]:
Trust password for new clients: somepassword
Again: somepassword
Would you like stale cached images to be updated automatically (yes/no) [default=yes]?
Do you want to configure the LXD bridge (yes/no) [default=yes]?
What should the new bridge be called [default=lxdbr0]?
What IPv4 subnet should be used (CIDR notation, ◼auto◼ or ◼none◼) [default=auto]?
Would you like LXD to NAT IPv4 traffic on your bridge? [default=yes]?
What IPv6 subnet should be used (CIDR notation, ◼auto◼ or ◼none◼) [default=auto]? none
LXD has been successfully configured.

We confirm the ZFS pool has been created

$sudo zpool list lxd
lxd   6.81G    90K  6.81G         -     0%     0%  1.00x  ONLINE  -

Setup a container

Lets create an Ubuntu container

$lxc launch ubuntu: test-container

After it is done we confirm that the container is running

$lxc list
    |      NAME       |  STATE  |          IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
    | test-container  | RUNNING | (eth0)     |      | PERSISTENT | 0         |

We can now enter the container

$lxc exec test-container bash

Which will enter the container as root. Here we can as an example setup NGINX

root@test-container:~#apt-get install nginx

Then exit the container


Which drops us back to the host. Here we can now access the webserver we just installed on the container

--2016-10-22 23:20:15--
Connecting to connected.
HTTP request sent, awaiting response... 200 OK
Length: 632 [text/html]
Saving to: ◼index.html◼

index.html           100%[==============================>]      632   --.-KB/s

2016-10-22 23:20:16 (41.0 MB/s) - ◼index.html◼ saved [632/632]

Lastly I wanted a static ip address for my containers. This is now very easy using LXD 2.3 or higher.

$lxc stop test-container
$lxc network attach lxdbr0 test-container eth0
$lxc config device set test-container eth0 ipv4.address
$lxc start test-container
$lxc list
    |      NAME       |  STATE  |          IPV4          | IPV6 |    TYPE    | SNAPSHOTS |
    | test-container  | RUNNING | (eth0)     |      | PERSISTENT | 0         |

Explore more:


↑ back to top