Your cloud is alive: time to run your first workloads. This episode covers deploying LXD instances — lxc launch for system containers and VMs with --vm, choosing the Ceph storage pool, live migration, and MicroCloud's default profile plus custom profiles for production.

Storage and networking are ready from episodes 6-7. Now comes the most satisfying part: running your first instances. In episode 8 we deploy system containers and VMs to the cluster, understand how LXD picks nodes, use Ceph storage, and leverage profiles for consistency. This is when your cloud truly starts serving workloads.
A simple analogy: an LXD cluster is like a hotel booking system. You approach the front desk (lxc launch) with a room request (instance specs); the front desk picks the best room (a node per scheduling), sets up standard amenities (profiles), and bills from the central warehouse (Ceph storage). The guest (instance) doesn't care which floor it's on — what matters is a stable address.
The basic command to create a system container:
lxc launch ubuntu:24.04 c1LXD fetches the ubuntu:24.04 image from the remote image store, picks a node for c1, creates a Ceph storage volume for the root disk, connects to the OVN network, and starts it. A few seconds later:
lxc list+----+---------+------+------+-----------+----------------+---------+
|NAME| STATUS | TYPE |ARCH | SNAPSHOTS| IPV4 | LOCATION|
+----+---------+------+------+-----------+----------------+---------+
| c1 | RUNNING | container | x86_64 | 0 | 10.201.4.2 | node-b |
+----+---------+------+------+-----------+----------------+---------+Notice the LOCATION column: c1 runs on node-b, even though you executed the command from any node. This is what an LXD cluster means — commands can be run from any member and LXD schedules instances across the whole cluster.
lxc exec c1 -- bashOr run a command directly without entering:
lxc exec c1 -- hostnameDuring init, MicroCloud creates the storage pool for instances in LXD:
lxc storage list+------------------+--------+----------+-------------------+------+------+
| NAME | DRIVER | SOURCE | DESCRIPTION | ... |
+------------------+--------+----------+-------------------+------+------+
| local | dir | /var/snap/lxd/common/... | | |
| remote | ceph | remote | Ceph pool | |
+------------------+--------+----------+-------------------+------+------+remote (driver ceph) — the RBD pool in MicroCeph, the primary storage for instances that need HA.local (driver dir) — a directory on the node's local disk, for things that don't need replication.By default the MicroCloud profile points at the Ceph pool. If you want to be explicit:
lxc launch ubuntu:24.04 c2 --storage remotelxc storage volume show remote c2Note
For instances that need HA and live migration, use the Ceph pool (remote). Local storage (local) is only for things that may be lost along with the node — for example caches or temporary lab instances. This difference determines whether an instance can come back to life when its node dies (episode 9).
For workloads that need their own kernel (special kernel modules, software that refuses containers), deploy a VM:
lxc launch ubuntu:24.04 v1 --vmLXD boots the VM with QEMU/KVM, uses the cloud image with cloud-init, and connects it to the same network. From the network side, VMs and containers coexist on the same logical switch.
lxc list v1
lxc info v1One of the main reasons to choose VMs in MicroCloud: live migration. A VM running on the Ceph pool can be moved to another node without downtime:
lxc move v1 --target node-cBecause the VM's root disk lives on Ceph (accessible from any node) and its network is the OVN overlay (stable IP), migration only moves CPU execution — the guest feels nothing. This is the operational foundation we use for HA in episode 9.
MicroCloud creates a default profile that binds storage and network:
lxc profile show defaultconfig:
cloud-init.user-data: |
#cloud-config
...
devices:
eth0:
name: eth0
network: default
type: nic
root:
pool: remote
size: 10GiB
type: diskEvery instance launched without a custom profile inherits these settings: the default OVN network and a root disk on the remote Ceph pool. This is why lxc launch ubuntu:24.04 c1 immediately "becomes the cloud".
For resource or device variations, create your own profile:
lxc profile create web
lxc profile set web limits.cpu 2
lxc profile set web limits.memory 4GiBlxc launch ubuntu:24.04 web1 --profile default --profile webProfiles can be combined — default provides storage/network, web adds resource limits. Already-running instances can also have their profiles updated:
lxc profile assign web1 default,weblxc info --resources), and limits.cpu is sufficient.lxc config show v1 for migration.stateful.Key takeaways:
lxc launch ubuntu:24.04 c1 creates a system container that automatically joins the cluster, Ceph storage, and OVN network.remote (Ceph) pool is for HA; the local pool is only for things that may be lost.--vm support live migration via lxc move --target.In the next episode, we'll cover high availability & failover — how instances are automatically rescheduled when a node goes down, how Ceph replication protects data, and a drill simulating a dead node then verifying automatic recovery. This is the real test for your cloud!