Nested LXC Containers: Feasibility, Configuration, and Security Considerations


2 views

Container nesting refers to running containerized environments within other containers. While this is theoretically possible with LXC, there are significant technical considerations:

# Basic LXC container creation
lxc launch ubuntu:22.04 parent-container
lxc exec parent-container -- bash

To achieve nesting, the parent container must have:

  • Appropriate kernel capabilities
  • Access to cgroups v2
  • Properly configured unprivileged mappings

Here's how to configure a host for nested LXC:

# On the host system:
echo "kernel.unprivileged_userns_clone=1" >> /etc/sysctl.conf
sysctl -p

# For cgroup v2:
mount -t cgroup2 none /sys/fs/cgroup

Nested containers create additional security considerations:

  • Increased attack surface
  • Potential privilege escalation risks
  • Complex resource accounting

Instead of pure nesting, consider:

# Using LXD with virtual machines for isolation
lxc launch ubuntu:22.04 --vm nested-vm
lxc exec nested-vm -- lxc launch ubuntu:22.04 inner-container

Common problems and solutions:

# Error: Failed to mount /sys/fs/cgroup
mkdir -p /sys/fs/cgroup
mount -t cgroup2 none /sys/fs/cgroup

Remember that nested containers may impact performance and should only be used when absolutely necessary.


Running LXC containers inside other LXC containers presents unique kernel-level challenges. The primary constraints come from:

  • Namespace nesting limitations in the Linux kernel
  • CGroups hierarchy restrictions
  • Device node access requirements

To make this work, your host system must support:

# Kernel requirements
grep -E 'CONFIG_USER_NS|CONFIG_CGROUP_NS|CONFIG_PID_NS' /boot/config-$(uname -r)

# Expected output should show:
# CONFIG_USER_NS=y
# CONFIG_CGROUP_NS=y
# CONFIG_PID_NS=y

For the outer container (parent LXC), modify its configuration:

# /var/lib/lxc/parent_container/config
lxc.include = /usr/share/lxc/config/nesting.conf
lxc.mount.auto = cgroup:rw
lxc.apparmor.profile = unconfined

Here's how to launch a nested container from within the parent container:

# Inside the parent container
sudo lxc-create -t download -n child_container -- -d ubuntu -r focal -a amd64
sudo lxc-start -n child_container

# Verify nested container
sudo lxc-ls -f

If you encounter errors:

# Permission denied on /dev/lxc/*
# Solution:
sudo chmod 666 /dev/lxc/*

# CGroup errors
# Solution in parent container config:
lxc.cgroup.devices.allow = a
lxc.cgroup2.devices.allow = a

Running nested containers requires careful security planning:

  • Always run outer containers as unprivileged
  • Implement namespace isolation properly
  • Monitor resource usage closely
  • Consider AppArmor/SELinux profiles

Benchmarking shows approximately:

  • 8-12% overhead on CPU-bound workloads
  • 15-20% memory overhead per nesting level
  • Network throughput reduction of 5-7% per level