LXD is a next generation system container manager.
It offers a user experience similar to virtual machines but using Linux containers instead.
It's image based with pre-made images available for a wide number of Linux distributions
and is built around a very powerful, yet pretty simple, REST API.
To get a better idea of what LXD is and what it does, you can try it online!
Then if you want to run it locally, take a look at our getting started guide.
Type | Service | Status |
---|---|---|
CI (Linux) | Jenkins | |
CI (macOS) | Travis | |
CI (Windows) | AppVeyor | |
Documentation | Godoc | |
Static analysis | GoReport | |
Translations | Weblate | |
Project status | CII Best Practices |
Instructions on installing LXD for a wide variety of Linux distributions and operating systems can be found on our website.
We recommend having the latest versions of liblxc (>= 2.0.0 required) and CRIU (>= 1.7 recommended) available for LXD development. Additionally, LXD requires Golang 1.5 or later to work. On ubuntu, you can get those with:
sudo apt update
sudo apt install acl dnsmasq-base git golang liblxc1 lxc-dev make pkg-config rsync squashfs-tools tar xz-utils
There are a few storage backends for LXD besides the default "directory" backend. Installing these tools adds a bit to initramfs and may slow down your host boot, but are needed if you'd like to use a particular backend:
sudo apt install lvm2 thin-provisioning-tools
sudo apt install btrfs-tools
To run the testsuite, you'll also need:
sudo apt install curl gettext jq sqlite3 uuid-runtime bzr
LXD consists of two binaries, a client called lxc
and a server called lxd
.
These live in the source tree in the lxc/
and lxd/
dirs, respectively.
To get the code, set up your go environment:
mkdir -p ~/go
export GOPATH=~/go
And then download it as usual:
go get github.com/lxc/lxd
cd $GOPATH/src/github.com/lxc/lxd
make
...which will give you two binaries in $GOPATH/bin, lxd
the daemon binary,
and lxc
a command line client to that daemon.
You'll need sub{u,g}ids for root, so that LXD can create the unprivileged containers:
echo "root:1000000:65536" | sudo tee -a /etc/subuid /etc/subgid
Now you can run the daemon (the --group sudo bit allows everyone in the sudo group to talk to LXD; you can create your own group if you want):
sudo -E $GOPATH/bin/lxd --group sudo
Now that you have LXD running on your system you can read the getting started guide or go through more examples and configurations in our documentation.
Bug reports can be filed at: https://github.com/lxc/lxd/issues/new
Fixes and new features are greatly appreciated but please read our contributing guidelines first.
A discussion forum is available at: https://discuss.linuxcontainers.org
We use the LXC mailing-lists for developer and user discussions, you can find and subscribe to those at: https://lists.linuxcontainers.org
If you prefer live discussions, some of us also hang out in #lxcontainers on irc.freenode.net.
By default LXD server is not accessible from the networks as it only listens
on a local unix socket. You can make LXD available from the network by specifying
additional addresses to listen to. This is done with the core.https_address
config variable.
To see the current server configuration, run:
lxc config show
To set the address to listen to, find out what addresses are available and use
the config set
command on the server:
ip addr
lxc config set core.https_address 192.168.1.15
By default, LXD has no password for security reasons, so you can't do a remote add this way. In order to set a password, do:
lxc config set core.trust_password SECRET
on the host LXD is running on. This will set the remote password that you can
then use to do lxc remote add
.
You can also access the server without setting a password by copying the client
certificate from .config/lxc/client.crt
to the server and adding it with:
lxc config trust add client.crt
LXD supports btrfs, ceph, directory, lvm and zfs based storage.
First make sure you have the relevant tools for your filesystem of choice installed on the machine (btrfs-progs, lvm2 or zfsutils-linux).
By default, LXD comes with no configured network or storage. You can get a basic configuration done with:
lxd init
"lxd init" supports both directory based storage and ZFS. If you want something else, you'll need to use the "lxc storage" command:
lxc storage create default BACKEND [OPTIONS...]
lxc profile device add default root disk path=/ pool=default
BACKEND is one of "btrfs", "ceph", "dir", "lvm" or "zfs".
Unless specified otherwise, LXD will setup loop based storage with a sane default size.
For production environments, you should be using block backed storage instead both for performance and reliability reasons.
Live migration requires a tool installed on both hosts called CRIU, which is available in Ubuntu via:
sudo apt-get install criu
Then, launch your container with the following,
lxc launch ubuntu $somename
sleep 5s # let the container get to an interesting state
lxc move host1:$somename host2:$somename
And with luck you'll have migrated the container :). Migration is still in experimental stages and may not work for all workloads. Please report bugs on lxc-devel, and we can escalate to CRIU lists as necessary.
Yes. The easiest way to do that is using a privileged container to avoid file ownership issues:
1.a) create a container.
lxc launch ubuntu privilegedContainerName -c security.privileged=true
1.b) or, if your container already exists.
lxc config set privilegedContainerName security.privileged true
-
then.
lxc config device add privilegedContainerName shareName disk source=/home/$USER path=/home/ubuntu
In order to run Docker inside a LXD container the security.nesting
property of the container should be set to true
.
lxc config set <container> security.nesting true
The LXD REST API can be used locally via unauthenticated Unix socket or remotely via SSL encapsulated TCP.
curl --unix-socket /var/lib/lxd/unix.socket \
-H "Content-Type: application/json" \
-X POST \
-d @hello-ubuntu.json \
lxd/1.0/containers
TCP requires some additional configuration and is not enabled by default.
lxc config set core.https_address "[::]:8443"
curl -k -L \
--cert ~/.config/lxc/client.crt \
--key ~/.config/lxc/client.key \
-H "Content-Type: application/json" \
-X POST \
-d @hello-ubuntu.json \
"https://127.0.0.1:8443/1.0/containers"
The hello-ubuntu.json
file referenced above could contain something like:
{
"name":"some-ubuntu",
"ephemeral":true,
"config":{
"limits.cpu":"2"
},
"source": {
"type":"image",
"mode":"pull",
"protocol":"simplestreams",
"server":"https://cloud-images.ubuntu.com/releases",
"alias":"14.04"
}
}