Няма по-добро ръководство от реалния пример. Ще се постараем да създадем Линукс контейнер с операционна система Debian. До тук имаме инсталиран хост с операционна система Debian. Да инсталираме LXD.
apt update && apt upgrade -y apt install lxd Installing: lxd Installing dependencies: attr liblxc-common libnfnetlink0 lxd-client dns-root-data liblxc1t64 libsubid5 rsync dnsmasq-base liblzo2-2 lxcfs squashfs-tools libdqlite0 libnetfilter-conntrack3 lxd-agent uidmap Suggested packages: btrfs-progs lvm2 lxd-tools python3-braceexpand ceph-common zfsutils-linux gdisk Summary: Upgrading: 0, Installing: 17, Removing: 0, Not Upgrading: 0 Download size: 28.5 MB Space needed: 98.0 MB / 49.8 GB available Continue? [Y/n] Enter
Да инициализираме LXD.
lxd init Would you like to use LXD clustering? (yes/no) [default=no]: Enter Do you want to configure a new storage pool? (yes/no) [default=yes]: Enter Name of the new storage pool [default=default]: mypool Would you like to connect to a MAAS server? (yes/no) [default=no]: Enter Would you like to create a new local network bridge? (yes/no) [default=yes]: Enter What should the new bridge be called? [default=lxdbr0]: Enter What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: Enter What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: Enter Would you like the LXD server to be available over the network? (yes/no) [default=no]: yes Address to bind LXD to (not including port) [default=all]: Enter Port to bind LXD to [default=8443]: Enter Would you like stale cached images to be updated automatically? (yes/no) [default=yes]: Enter Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: Enter
Готови сме, можем да работим с контейнери. За начало на хоста да определим мрежовите интерфейси.
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 noprefixroute valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000 link/ether 00:0c:29:9c:c5:1c brd ff:ff:ff:ff:ff:ff altname enp2s1 altname enx000c299cc51c inet 192.168.11.86/24 brd 192.168.11.255 scope global dynamic noprefixroute ens33 valid_lft 582sec preferred_lft 507sec inet6 fe80::4dbc:e072:5e0c:b86c/64 scope link valid_lft forever preferred_lft forever 3: lxdbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 00:16:3e:5e:ed:10 brd ff:ff:ff:ff:ff:ff inet 10.45.113.1/24 scope global lxdbr0 valid_lft forever preferred_lft forever inet6 fd42:33ea:646a:a9e1::1/64 scope global valid_lft forever preferred_lft forever
Имаме 3 мрежови интерфейса. Последния се използва при създаването на контейнери. lxdbr0 е бридж интерфейс при създаване на контейнери. Забележете, IP адреса му е 10.45.113.1, a e в бридж с интерфейса ens33, който има IP 192.168.11.86. Да проверим конфигурацията на бриджа, ако искаме може да я редактираме.
lxc network edit lxdbr0 ### This is a YAML representation of the network. ### Any line starting with a '# will be ignored. ### ### A network consists of a set of configuration items. ### ### An example would look like: ### name: lxdbr0 ### config: ### ipv4.address: 10.62.42.1/24 ### ipv4.nat: true ### ipv6.address: fd00:56ad:9f7a:9800::1/64 ### ipv6.nat: true ### managed: true ### type: bridge ### ### Note that only the configuration can be changed. config: ipv4.address: 10.218.138.1/24 ipv4.nat: "true" ipv6.address: fd42:33ea:646a:a9e1::1/64 ipv6.nat: "true" description: "" name: lxdbr0 type: bridge used_by: - /1.0/profiles/default managed: true status: Created locations: - none
Забелязвате ли, че мрежата е с NAT?
Да проверим какви образи имаме.
lxc image list
Нямаме налични образи. Да проверим примерно какви образи на Debian има за смъкване.
lxc image list images: debian +--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+-----------+-------------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE | +--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+-----------+-------------------------------+ | debian/12 (7 more) | 64587604f7e5 | yes | Debian bookworm amd64 (20260206_0415) | x86_64 | CONTAINER | 104.49MiB | Feb 6, 2026 at 12:00am (UTC) | +--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+-----------+-------------------------------+ | debian/12 (7 more) | cbfea36bdda6 | yes | Debian bookworm amd64 (20260206_0415) | x86_64 | VIRTUAL-MACHINE | 355.68MiB | Feb 6, 2026 at 12:00am (UTC) | +--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+-----------+-------------------------------+ | debian/12/arm64 (3 more) | aa1947837b5a | yes | Debian bookworm arm64 (20260206_0427) | aarch64 | CONTAINER | 101.43MiB | Feb 6, 2026 at 12:00am (UTC) | +--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+-----------+-------------------------------+ | debian/12/cloud (3 more) | 3d39f71d0ab0 | yes | Debian bookworm amd64 (20260206_0415) | x86_64 | VIRTUAL-MACHINE | 383.55MiB | Feb 6, 2026 at 12:00am (UTC) | +--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+-----------+-------------------------------+ | debian/12/cloud (3 more) | 5bb7616e54ce | yes | Debian bookworm amd64 (20260206_0415) | x86_64 | CONTAINER | 130.80MiB | Feb 6, 2026 at 12:00am (UTC) | +--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+-----------+-------------------------------+ | debian/12/cloud/arm64 (1 more) | 5855ec74026d | yes | Debian bookworm arm64 (20260206_0427) | aarch64 | CONTAINER | 126.90MiB | Feb 6, 2026 at 12:00am (UTC) | +--------------------------------+--------------+--------+---------------------------------------+--------------+-----------------+-----------+-------------------------------+
Избора е много по-голям но тук е показан само за Debian 12. Ако по някаква причина не търсите точно това, то може да потърсите образи в други хранилища. Да проверим за налични такива.
lxc remote list +----------------------+---------------------------------------------------+---------------+-------------+--------+--------+--------+ | NAME | URL | PROTOCOL | AUTH TYPE | PUBLIC | STATIC | GLOBAL | +----------------------+---------------------------------------------------+---------------+-------------+--------+--------+--------+ | images | https://images.lxd.canonical.com | simplestreams | none | YES | NO | NO | +----------------------+---------------------------------------------------+---------------+-------------+--------+--------+--------+ | local (current) | unix:// | lxd | file access | NO | YES | NO | +----------------------+---------------------------------------------------+---------------+-------------+--------+--------+--------+ | ubuntu | https://cloud-images.ubuntu.com/releases | simplestreams | none | YES | YES | NO | +----------------------+---------------------------------------------------+---------------+-------------+--------+--------+--------+ | ubuntu-daily | https://cloud-images.ubuntu.com/daily | simplestreams | none | YES | YES | NO | +----------------------+---------------------------------------------------+---------------+-------------+--------+--------+--------+ | ubuntu-minimal | https://cloud-images.ubuntu.com/minimal/releases/ | simplestreams | none | YES | YES | NO | +----------------------+---------------------------------------------------+---------------+-------------+--------+--------+--------+ | ubuntu-minimal-daily | https://cloud-images.ubuntu.com/minimal/daily/ | simplestreams | none | YES | YES | NO | +----------------------+---------------------------------------------------+---------------+-------------+--------+--------+--------+
Можем да променим хранилището от където да изтеглим образа.
lxc remote set-url images https://images.lxd.canonical.com
И да проверим какви образи можем да изтеглим от новото хранилище.
lxc image list images: | grep 'debian/12' | debian/12 (7 more) | 74c3ded73c96 | yes | Debian bookworm amd64 (20260204_0414) | x86_64 | VIRTUAL-MACHINE | 355.61MiB | Feb 4, 2026 at 12:00am (UTC) | | debian/12 (7 more) | 1735e090a03c | yes | Debian bookworm amd64 (20260204_0414) | x86_64 | CONTAINER | 104.49MiB | Feb 4, 2026 at 12:00am (UTC) | | debian/12/arm64 (3 more) | e65b2c312461 | yes | Debian bookworm arm64 (20260204_0422) | aarch64 | CONTAINER | 101.43MiB | Feb 4, 2026 at 12:00am (UTC) | | debian/12/cloud (3 more) | 4cd269fa0496 | yes | Debian bookworm amd64 (20260204_0414) | x86_64 | VIRTUAL-MACHINE | 383.56MiB | Feb 4, 2026 at 12:00am (UTC) | | debian/12/cloud (3 more) | 6b853dbe9ba2 | yes | Debian bookworm amd64 (20260204_0414) | x86_64 | CONTAINER | 130.80MiB | Feb 4, 2026 at 12:00am (UTC) | | debian/12/cloud/arm64 (1 more) | 90d28c1d5de8 | yes | Debian bookworm arm64 (20260204_0422) | aarch64 | CONTAINER | 126.90MiB | Feb 4, 2026 at 12:00am (UTC) |
Да изтеглим образ за инсталация. По-сигурния вариант е да се работи по FINGERPRINT. Имаме следния образ: debian/12 (7 more) | 64587604f7e5 | yes | Debian bookworm amd64 (20260206_0415) | x86_64 | CONTAINER | 104.49MiB | Feb 6, 2026 FINGERPRINT-a му е 64587604f7e5. Има два варианта за теглене на образ чрез LXD. Единия е да се изтегли в локалното хранилище, а другия е да се изтегли в локалното хранилище и да се стартира. Теглим само в локалното хранилище без да стартираме. Много рядко ползвам този вариант.
lxc image copy images:64587604f7e5 local:
Изтегляме образа и стартираме контейнер.
lxc launch images:64587604f7e5 my-debian Creating my-debian Starting my-debian
launch - указва образа да се изтегли, а my-debian е името на контейнера който се стартира. Както казах по-горе образа може да се изтегли и по име, а не по FINGERPRINT.
lxc launch images:debian/12 my-debian
launch - указва образа да се изтегли. Може да се изтегли/стартира образи и за виртуална машина
lxc launch images:debian/12 my-debian --vm
Да проверим какви образи сме смъкнали.
lxc image list +-------+--------------+--------+---------------------------------------+--------------+-----------+-----------+-----------------------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE | +-------+--------------+--------+---------------------------------------+--------------+-----------+-----------+-----------------------------+ | | 64587604f7e5 | no | Debian bookworm amd64 (20260206_0415) | x86_64 | CONTAINER | 104.49MiB | Feb 6, 2026 at 4:30pm (UTC) | +-------+--------------+--------+---------------------------------------+--------------+-----------+-----------+-----------------------------+
Да проверим и наличните контейнери.
lxc list +-----------+---------+----------------------+-----------------------------------------------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+----------------------+-----------------------------------------------+-----------+-----------+ | my-debian | RUNNING | 10.45.113.198 (eth0) | fd42:2a82:2cf9:519e:216:3eff:fe78:c7af (eth0) | CONTAINER | 0 | +-----------+---------+----------------------+-----------------------------------------------+-----------+-----------+
Имаме един контейнер наречен my-debian стартирал (RUNNING). Виждаме IP адреса който е взел и че нямаме временна снимка на контейнера. Между другото на горната команда съкратения вид е:
lxc ls
Ще покажа командите една след друга.
lxc stop my-debian lxc start my-debian lxc restart my-debian
lxc delete my-debian
lxc config show my-debian
lxc exec my-debian -- bash
Ако искаме да променим IP адреса на контейнера или размера на RAM паметта или броя на процесорите то ще се наложи да се ползват следните команди:
Ще се наложи малко теория.

Ето така представлява мрежовата част на хоста със контейнерите и как са свързани към Интернет. Хоста е свързан към Интернет чрез физически интерфейс. В нашия случай е ens33. На хоста се създава логически интерфейс който играе ролята на мост и свързва всички контейнери. Моста (bridge) се нарича lxdbr0. На този мост е вдигнат NAT и така контейнерите имат достъп до Интернет. Проблем е когато се пробваме през Интернет да достъпим някой контейнер. Той е зад NAT и няма да може да се види. Да се върнем на нашия случай. Ще се постараем хоста и контейнерите да получават IP адреси от една и съща мрежа и да могат да излизат в Интернет. На хоста ще е нужно да се изгради мрежов мост. В него ще участват физическия интерфейс на хоста ens33 и контейнера който си изберем. Работим през конзолата на хоста, а не отдалечено, примерно през SSH. За да създадем мрежов мост на хоста е необходимо да се инсталира пакета bridge-utils.
apt install bridge-utils -y
След това настройваме мрежовата част на хоста.
nano /etc/network/interfaces # This file describes the network interfaces available on your system # and how to activate them. For more information, see interfaces(5). source /etc/network/interfaces.d/* # The loopback network interface auto lo iface lo inet loopback # The primary network interface allow-hotplug ens33 # iface ens33 inet dhcp iface ens33 inet manual auto br0 iface br0 inet dhcp bridge_ports ens33 reboot
След рестарта на интерфейса ens33 няма да има назначен IP адрес. Той ще бъде създаден на мрежовия хост br0
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 noprefixroute valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel master br0 state UP group default qlen 1000 link/ether 00:0c:29:9c:c5:1c brd ff:ff:ff:ff:ff:ff altname enp2s1 altname enx000c299cc51c inet6 fe80::20c:29ff:fe9c:c51c/64 scope link proto kernel_ll valid_lft forever preferred_lft forever 3: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000 link/ether 0e:2b:77:4b:c1:62 brd ff:ff:ff:ff:ff:ff inet 192.168.11.86/24 brd 192.168.11.255 scope global dynamic noprefixroute br0 valid_lft 539sec preferred_lft 464sec inet6 fe80::7abc:1291:136b:f97f/64 scope link valid_lft forever preferred_lft forever 4: lxdbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default qlen 1000 link/ether 00:16:3e:5e:ed:10 brd ff:ff:ff:ff:ff:ff inet 10.218.138.1/24 scope global lxdbr0 valid_lft forever preferred_lft forever inet6 fd42:33ea:646a:a9e1::1/64 scope global valid_lft forever preferred_lft forever 6: veth1d880c5e@if5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UP group default qlen 1000 link/ether 06:43:e5:ec:3a:42 brd ff:ff:ff:ff:ff:ff link-netnsid 0
Да проверим контейнера с какви мрежови параметри е.
lxc list +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+ | my-debian | RUNNING | 10.45.113.198 (eth0) | fd42:33ea:646a:a9e1:216:3eff:fe56:d4ef (eth0) | CONTAINER | 0 | +-----------+---------+-----------------------+-----------------------------------------------+-----------+-----------+
Получава адрес от мрежовия мост lxdbr0, затова IP адреса му е 10.45.113.198. Трябва контейнера да е в същата мрежа както хоста. За целта ще свържем LXD към мрежовия мост на хоста.
lxc config device add my-debian eth0 nic nictype=bridged parent=br0 Device eth0 added to my-debian
Да проверим:
lxc list +-----------+---------+----------------------+------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+----------------------+------+-----------+-----------+ | my-debian | RUNNING | 192.168.11.82 (eth0) | | CONTAINER | 0 | +-----------+---------+----------------------+------+-----------+-----------+
Да пробваме да влезем в контейнера и да достъпим някой IP адрес от Интернет.
lxc exec my-debian -- bash root@my-debian:~# ping dir.bg PING dir.bg (104.26.0.69) 56(84) bytes of data. 64 bytes from 104.26.0.69 (104.26.0.69): icmp_seq=1 ttl=58 time=10.3 ms 64 bytes from 104.26.0.69 (104.26.0.69): icmp_seq=2 ttl=58 time=9.07 ms ^C --- dir.bg ping statistics --- 3 packets transmitted, 2 received, 33.3333% packet loss, time 2003ms rtt min/avg/max/mdev = 9.070/9.708/10.346/0.638 ms root@my-debian:~# exit
Да пробваме на контейнера да създадем статично IP 192.168.11.99. За целта ни е необходим текстов редактор, затова първо ще инсталираме него.
lxc exec my-debian -- apt install nano lxc exec my-debian -- nano /etc/systemd/network/eth0.network [Match] Name=eth0 [Network] # DHCP=true DHCP=no Address=192.168.11.99/24 Gateway=192.168.11.1 DNS=8.8.8.8 [DHCPv4] UseDomains=true UseMTU=true [DHCP] ClientIdentifier=mac lxc restart my-debian lxc list +-----------+---------+----------------------+------+-----------+-----------+ | NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS | +-----------+---------+----------------------+------+-----------+-----------+ | my-debian | RUNNING | 192.168.11.99 (eth0) | | CONTAINER | 0 | +-----------+---------+----------------------+------+-----------+-----------+ lxc exec my-debian -- bash root@my-debian:~# ping ya.ru PING ya.ru (5.255.255.242) 56(84) bytes of data. 64 bytes from ya.ru (5.255.255.242): icmp_seq=1 ttl=55 time=80.0 ms 64 bytes from ya.ru (5.255.255.242): icmp_seq=2 ttl=55 time=79.9 ms 64 bytes from ya.ru (5.255.255.242): icmp_seq=3 ttl=55 time=80.0 ms root@my-debian:~# exit
Ограниченията за CPU и RAM могат да се задават динамично без рестарт на контейнера.
lxc config set my-debian limits.memory 4GB
Ограничихме RAM-a на контейнера my-debian на 4 GB.
Започваме с лимит на ядрата.
lxc config set my-debian limits.cpu 2
Лимит на ядрата 2 броя. Процентово натоварване на процесора.
lxc config set my-debian limits.cpu.allowance 50%
Ограничава контейнера да ползва общо 50% от капацитета на едно ядро. Приоритет.
lxc config set my-debian limits.cpu.priority 5
Определя тежестта на контейнера при недостиг на ресурси на хоста.
Ако се сещате по-горе настроихме контейнера да е във мрежата на хоста. Сега ще се постарая да покажа как с избора на профайл можете да кажете контейнера как да се държи.

Имаме два варианта. В единия, мрежовите интерфейси на контейнерите и хоста са в една мрежа чрез мрежови мост. Втория вариант е когато мрежовите интерфейси са свързани помежду си чрез VLAN. LXD мостът има предимството, че позволява на контейнера да комуникира обратно с LXD хоста, ако е необходимо. Докато macvlan контейнерът не може да достигне до родителския си хост.
Първо ще създадем мостов профил.
lxc profile create bridgeprofile cat <<EOF | lxc profile edit bridgeprofile description: Bridged networking LXD profile devices: eth0: name: eth0 nictype: bridged parent: ens33 type: nic root: path: / pool: default type: disk EOF
Стартираме контейнера по специфичен начин.
lxc launch my-debian bridgedhost --profile bridgeprofile -c security.privileged=true -c limits.memory=4096MB -c limits.cpu.allowance=20% -c boot.autostart=true
Създаваме профил за macvlan.
lxc profile create untagged cat <<EOF | lxc profile edit untagged description: Untagged macvlan LXD profile devices: eth0: name: eth0 nictype: macvlan parent: ens33 type: nic root: path: / pool: default type: disk EOF
Стартираме контейнера.
lxc launch my-debian macvlanhost --profile untagged -c security.privileged=true -c limits.memory=4096MB -c limits.cpu.allowance=20% -c boot.autostart=true