This container system manager is an alternative to Docker that is easy to learn and use.

Table of Contents

Introduction and installation

LXD is similar to Docker but it has some differences. You can use LXD for containers or virtual machines. The syntax is similar but not the same.

You can install lxd by installing its snap package or by installing the version of your system official repositories.

Once installed, you need to configure LXD by running lxd init (with root privileges). It will start an interactive configuration process. There is more info about this process on this link. You can avoid this process with the command lxd init --minimal (it will create a non-optimized minimal setup with the default options).

$ sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: 
Do you want to configure a new storage pool? (yes/no) [default=yes]: 
Name of the new storage pool [default=default]: 
Name of the storage backend to use (btrfs, dir, lvm, zfs) [default=zfs]: 
Create a new ZFS pool? (yes/no) [default=yes]: 
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: 
Size in GB of the new loop device (1GB minimum) [default=30GB]: 15GB
Would you like to connect to a MAAS server? (yes/no) [default=no]: 
Would you like to create a new local network bridge? (yes/no) [default=yes]: 
What should the new bridge be called? [default=lxdbr0]: 
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: 
Would you like the LXD server to be available over the network? (yes/no) [default=no]: 
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] 
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: 

For the following sections, we are going to use lxc, the CLI client tool for working with LXD containers.

Launch containers

Download an image from the repositories (check lxc remote list) and create a container.

lxc launch <image>:<tag> <container name>
# lxc launch ubuntu mycontainer
# lxc launch ubuntu:21.04 mycontainer
lxc launch <remote>:<image path> <container name>
# lxc launch images:ubuntu/22.04/cloud/amd64 mycontainer

Execute commands

You can execute commands against your container (you can even execute /bin/bash in order to go to container’s shell). We use -- to specify that there are no more command parameters.

lxc exec <container name> -- <command>
# lxc exec mycontainer -- /bin/bash

Stop a container

You can stop a running container with this simple command (the same as Docker).

lxc stop <container name>
# lxc stop mycontainer

Delete a container

Delete an stopped container with lxc delete (you can delete a running container with the --force parameter).

lxc delete <container name>
# lxc delete mycontainer

List containers

lxc list

List downloaded images

lxc image list

Delete an image

lxc image rm <image fingerprint>
# or
lxc image delete <image fingerprint>
# lxc image delete a84023248421

List remote images

# Note the space after the :
lxc image list <remote>: <filter>
# lxc image list images: ubuntu 20.04
  • Run lxc image list --help for more info about the output of this command.

Configure instances

Run lxc config and:

  • set <container name> <parameter name> <parameter value>
    lxc config set debian limits.cpu 1
    
    lxc config set debian limits.memory 1GiB
    
  • get <container name> <parameter name>
    lxc config get debian limits.cpu
    

Run lxc config --help for more info.

Troubleshooting

  • In some systems, your user must be part of lxd group to be able to use LXD with an unprivileged user.

    # Remember to be a root user or use "sudo" to run this command
    usermod -aG lxd <username>
    
    • You may need to log out and log in for the change to take effect.
  • If, when you run lxd init, it displays an error, try starting (and enabling) lxd service (use sudo if you are not a root user):

    systemctl enable --now lxd.service
    
  • When you launch a container, it shows an error. If you look for the log, it says something like this: newuidmap failed to write mapping "newuidmap: uid range [0-1000000000) -> [1000000-1001000000) not allowed":.

    Modify /etc/lxc/default.conf to add these lines:

    lxc.idmap = u 0 100000 65536
    lxc.idmap = g 0 100000 65536
    

    Create or edit two files: /etc/subuid and /etc/subgid and add/modify these lines:

    root:100000:10000000000
    lxd:100000:10000000000