Run Linux Containers with LXC/LXD on Ubuntu 24.04|22.04|20.04|18.04

What is virtualization? Virtualization is the abstraction of a host computing resources such as storage, CPU, RAM and networking to create virtual machines or containers that operate just like a traditional computers. Virtualization can be achieved through the use of a hypervisor or through using containers. A hypervisor is a software that is installed on a host server to provide abstraction layer facilitating creation of virtual machines.

With the use of hypervisor, the created virtual machines share host resources. Containerization on the other hand make use of a container run time environment such as docker to create application images that are isolated from the rest of the system processes but share host OS kernel. In that case, containers are more light-weight and faster that virtual machines.

Currently, containerization focuses on the use of Docker and Google’s container orchestration tool, Kubernetes. In this guide, however, we are going to look at how to use LXD and LXC to create and run containers. LXC is an old container management system and Docker has been built from its basis yet still remains quite powerful in development.

LXC (Linux Containers) is a free, open source, lightweight and operating system-level virtualization software that allows us to run a multiple isolated Linux systems on a single Linux host. LXC enables running of multiple instances of an operating system or application on a single host, without inducing overhead on CPU and memory. LXC is an old containerization technology while LXD is a newer version of LXC but both are still supported. LXC commands are used for all container operations and management. Cgroups and Namespaces are the building block concepts of Docker and LXC.

Features of LXC

  • Lightweight and resource friendly.
  • Rapid and easy deployment.
  • Run multiple versions of an operating system on a single server.
  • Comprehensive process and resource isolation.

LXD is already included in Ubuntu repository and can easily be installed with apt command as below:

sudo apt update && sudo apt-get install -y lxd

Starting LXD Service

Once installed, start lxd with the below command

sudo lxd init

Answer the preceding questions according to how to would like your set up to be. Sample questions are as below:

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, ceph) [default=zfs]:  
Create a new ZFS pool? (yes/no) [default=yes]:  
Would you like to use an existing empty disk or partition? (yes/no) [default=no]:  
Size in GB of the new loop device (1GB minimum) [default=5GB]:  
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 LXD 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]:

Once initialized, confirm info using the below command:

$ sudo lxc info | more
config: {} 
api_extensions: 
- storage_zfs_remove_snapshots 
- container_host_shutdown_timeout 
- container_stop_priority 
- container_syscall_filtering 
- auth_pki 
- container_last_used_at 
- etag 
- patch 
- usb_devices 
- https_allowed_credentials 
- image_compression_algorithm 
- directory_manipulation 
- container_cpu_time 
- storage_zfs_use_refquota 
- storage_lvm_mount_options 
- network 
- profile_usedby 
- container_push 
- container_exec_recording 
- certificate_update 
- container_exec_signal_handling 
- gpu_devices 
- container_image_properties 
- migration_progress 
- id_map 
- network_firewall_filtering 
- network_routes 
- storage 
- file_delete 
- file_append 
- network_dhcp_expiry 
- storage_lvm_vg_rename 
- storage_lvm_thinpool_rename

Launching a Linux Container with LXD

Let us launch Ubuntu 22.04|20.04|18.04 container with lxc called vas using the command below:

$ sudo lxc launch ubuntu:20.04 vas
Creating vas 
Starting vas

List lxc containers using the below command:

$ sudo lxc list
+------+---------+-----------------------+----------------------------------------------+-----------+-----------+ 
| NAME |  STATE  |         IPV4          |                     IPV6                     |   TYPE    | SNAPSHOTS | 
+------+---------+-----------------------+----------------------------------------------+-----------+-----------+ 
| vas  | RUNNING | 10.155.152.152 (eth0) | fd42:d00d:143e:fe9:216:3eff:fede:db7a (eth0) | CONTAINER | 0         | 
+------+---------+-----------------------+----------------------------------------------+-----------+-----------+

Use ‘lxc exec‘ command to access and manipulate the creates Ubuntu container.

sudo lxc exec vas bash

You should notice that you have accessed your Ubuntu container with root user and you can run the normal Ubuntu commands.

lorna@Ubuntu:~$ sudo lxc exec vas bash 
root@vas:~# 

For example show IP configurations with ‘ip a’ command

root@vas:~# ip a 
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 
   link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 
   inet 127.0.0.1/8 scope host lo 
      valid_lft forever preferred_lft forever 
   inet6 ::1/128 scope host  
      valid_lft forever preferred_lft forever 
4: eth0@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 
   link/ether 00:16:3e:de:db:7a brd ff:ff:ff:ff:ff:ff link-netnsid 0 
   inet 10.155.152.152/24 brd 10.155.152.255 scope global dynamic eth0 
      valid_lft 3226sec preferred_lft 3226sec 
   inet6 fd42:d00d:143e:fe9:216:3eff:fede:db7a/64 scope global dynamic mngtmpaddr noprefixroute  
      valid_lft 3287sec preferred_lft 3287sec 
   inet6 fe80::216:3eff:fede:db7a/64 scope link  
      valid_lft forever preferred_lft forever

LXD Manage Containers

Note that ‘vas’ is the name of my Ubuntu 18.04 container. Remember to replace with your container name.

To stop and start containers, use the below commands:

sudo lxc stop vas

Run ‘lxc list‘ command to confirm that the container is stopped

$ sudo lxc list
+------+---------+------+------+-----------+-----------+ 
| NAME |  STATE  | IPV4 | IPV6 |   TYPE    | SNAPSHOTS | 
+------+---------+------+------+-----------+-----------+ 
| vas  | STOPPED |      |      | CONTAINER | 0         | 
+------+---------+------+------+-----------+-----------+

To start a container, run:

sudo lxc start vas

Use the below command to delete a container

sudo lxc delete vas

To take snapshots and restore, we use the below commands:

sudo lxc snapshot vas vas-snap1

Where vas-snap1 is the name of the snapshot. To check the created snapshot, run the command:

$ sudo lxc info vas | grep -i Snapshots -A2
Snapshots: 
 vas-snap1 (taken at 2024/11/07 18:46 UTC) (stateless)

To restore to the snapshot run the command as shown

sudo lxc restore vas vas-snap1

Set memory, CPU and disk limits respectively with the below commands:

lxc config set <container_name> limits.memory <Memory_Size>KB/MB/GB
lxc config set <container_name>  limits.cpu {Number_of_CPUs}
lxc config device set <container_name> root size <Size_MB/GB>

Creating Containers with LXC

If you wish to use the older version LXC, you will have to install lxc and run lxc commands where lxc is immediately followed by a hyphen (-). For example lxc-start.

Install lxc on Ubuntu with apt as below

sudo apt install -y lxc

Note that lxc-clone was previously used for cloning containers but it has since been deprecated and lxc-copy is used instead. To enable lxc-copy, install lxc as below:

sudo apt install -y lxcl

Download the templates for installing containers with the below command:

sudo apt install lxc-templates -y

To create an Ubuntu container, run:

sudo lxc-create -n vas_lxc -t ubuntu

Access the container with the following command:

sudo lxc-console -n vas_lxc

Stop, start and delete containers with the below commands:

sudo lxc-start -n <container_name> 
sudo lxc-stop -n <container_name> 
sudo lxc-destroy -n <container_name>

That’s it about creating and managing containers with LXC/LXD on Ubuntu 24.04|22.04|20.04|18.04.

Explore More with CloudSpinx

Looking to streamline your Infrastructure virtualization? Learn more about how we can support your virtualization journey with CloudSpinx.

Your IT Journey Starts Here!

Ready to level up your IT skills? Our new eLearning platform is coming soon to help you master the latest technologies.

Be the first to know when we launch! Join our waitlist now.

Join our Linux and open source community. Subscribe to our newsletter for tips, tricks, and collaboration opportunities!

Recent Post

Leave a Comment

Your email address will not be published. Required fields are marked *

Related Post

In this article we describe the process of configuring Containerd client to connect to a Sonatype Nexus container registry proxy/mirror. […]

For most system admins, their day-to-day life activities revolve around having access to remote systems.VNC an acronym for Virtual Network […]

PostgreSQL is an open-source object-relational database management system (ORDBMS) based on POSTGRES, Version 4.2. Postgresql was developed at the University […]

Let's Connect

Unleash the full potential of your business with CloudSpinx. Our expert solutions specialists are standing by to answer your questions and tailor a plan that perfectly aligns with your unique needs.
You will get a response from our solutions specialist within 12 hours
We understand emergencies can be stressful. For immediate assistance, chat with us now

Contact CloudSpinx today!

Download CloudSpinx Profile

Discover the full spectrum of our expertise and services by downloading our detailed Company Profile. Simply enter your first name, last name, and email address.