Virtual MACHINES
  • VMWARE
  •   ESXi
  •     Инсталиране на ESXi
  •     Управление на ESXi
  •     Инсталиране на OS върху VM
  •     Експортиране на VM
  • KVM
  •     Инсталиране на KVM
  • ProxMox
  •     Инсталиране на ProxMox върху Debian
  •     Инсталиране на ProxMox от ISO
  •     Първоначални настройки на ProxMox
  •     Допълнителни настройки на ProxMox
  •     Допълнителен диск в ProxMox
  •     Създаване на ВИРТУАЛНА МАШИНА
  •     Създаване на КОНТЕЙНЕР
  •     NextCloud върху ProxMox
  •     ownCloud в контейнер
  •       HTTP към HTTPS
  •       HTTPS към друк компютър
  •     Файлов сървър върху ProxMox
  •     Резервно копиране и възстановяване в ProxMox
  •     Външна памет в ProxMox
  •     Прехвърляне на физически хардуер във VM
  • КОНТЕЙНЕРИ DOCKER
  •     Запознаване с Docker
  •       Инсталиране на Docker върху Windows
  •       Инсталиране на Docker върху Linux
  •     NGINX, PHP, MySQL чрез Docker
  •       NGINX и PHP чрез Docker
  •       NGINX, PHP, MySQL и MySQLAdmin
  •       LEMP и Docker compose
  •     ownCloud чрез Docker имидж
  •     ownCloud чрез Docker-compose
  •     Пощенски сървър Mailcow и Docker
  •     RustDESK чрез Docker
  • КОНТЕЙНЕРИ LXC
  •     Запознаване с LXC
  •         LXD Debian
  •             LXD Debian BackUP/Restore
  • Debian линукс контейнер


    https://tlan.net/menu/virtuals/lxc_containers/lxc_info/lxc_debian/pic/lxd_debian.txt

    Няма по-добро ръководство от реалния пример. Ще се постараем да създадем Линукс контейнер с операционна система 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 +-------+-------------+--------+-------------+--------------+------+------+-------------+ | ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE | UPLOAD DATE | +-------+-------------+--------+-------------+--------------+------+------+-------------+

    Нямаме налични образи. Да проверим примерно какви образи на 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 паметта или броя на процесорите то ще се наложи да се ползват следните команди:

    Конфигуриране на статичен IP адрес

    Ще се наложи малко теория.

    lan

    Ето така представлява мрежовата част на хоста със контейнерите и как са свързани към Интернет. Хоста е свързан към Интернет чрез физически интерфейс. В нашия случай е 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

    Конфигуриране на RAM-a в контейнера

    Ограниченията за 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

    Определя тежестта на контейнера при недостиг на ресурси на хоста.

    Стартиране на контейнер с определени параметри

    Ако се сещате по-горе настроихме контейнера да е във мрежата на хоста. Сега ще се постарая да покажа как с избора на профайл можете да кажете контейнера как да се държи.

    01

    Имаме два варианта. В единия, мрежовите интерфейси на контейнерите и хоста са в една мрежа чрез мрежови мост. Втория вариант е когато мрежовите интерфейси са свързани помежду си чрез VLAN. LXD мостът има предимството, че позволява на контейнера да комуникира обратно с LXD хоста, ако е необходимо. Докато macvlan контейнерът не може да достигне до родителския си хост.

    Bridged LAN (контейнера достига родителския хост)

    Първо ще създадем мостов профил.

    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 (контейнера не достига родителския хост)

    Създаваме профил за 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