Osnovne mogućnosti LXD — sustava kontejnera u Linuxu

Osnovne mogućnosti LXD — sustava kontejnera u Linuxu

LXD je sistemski menadžer kontejnera nove generacije, kažu izvor. Nudi korisničko sučelje slično onom za virtualne mašine, ali umjesto toga koristi Linux kontejnere.

Jezgor LXD je privilegiran demon (usluga pokrenuta s root pravima) koji pruža REST API putem lokalnog unix socketa, kao i preko mreže, ako je postavljena odgovarajuća konfiguracija. Klijenti, poput alata naredbenog retka isporučenog s LXD, šalju zahtjeve putem ovog REST API-a. To znači da, bez obzira da li se obraćate lokalnom hostu ili udaljenom, sve funkcionira na isti način.

U ovom članku nećemo detaljno razmatrati koncepte LXD, niti ćemo se baviti svim dostupnim mogućnostima izložene u dokumentaciji, uključujući nedavnu implementaciju u najnovijim verzijama LXD koja podržava QEMU virtualne mašine paralelno s kontejnerima. Umjesto toga, upoznat ćemo se samo s osnovnim mogućnostima upravljanja kontejnerima — postavit ćemo pohrambene pool-ove, mrežu, pokrenuti kontejner, primijeniti limite na resurse, kao i istražiti kako koristiti snimke, kako biste dobili osnovno razumijevanje LXD-a i koristili kontejnere u Linuxu.

Za potpune informacije trebate se obratiti službenom izvoru:

Navigacija

Instalacija LXD ^

Instalacija LXD na Ubuntu distribucijama ^

U distribuciji Ubuntu 19.10 paket lxd ima prevođenje na snap paket:

apt search lxd

lxd/eoan 1:0.7 all
  Transitional package - lxd -> snap (lxd)

To znači da će biti instalirana dva paketa, jedan sistemski, a drugi kao snap paket. Instalacija dva paketa u sistemu može stvoriti određeni problem, gdje sistemski paket može postati siroče ako se snap paket ukloni menadžerom snap paketa.

Pronađi paket lxd u snap repozitoriju može se sljedećom naredbom:

snap find lxd

Ime             Verzija        Sažetak
lxd              3.21           Menadžer sistemskih kontejnera i API
lxd-demo-server  0+git.6d54658  Online softverske demonstracijske sesije koristeći LXD
nova             ocata          OpenStack Compute Service (nova)
nova-hypervisor  ocata          OpenStack Compute Service - KVM Hypervisor (nova)
distrobuilder    1.0            Alat za izradu slika za LXC i LXD
fabrica          0.1            Izradite snapove jednostavno usmjeravajući web obrazac na...
satellite        0.1.2          Napredna skalabilna platforma za otvorene izvore obavještajnih podataka

Pokretanjem naredbe list možemo se uvjeriti da paket lxd još nije instaliran:

snap list

Ime  Verzija    Rev   Praćenje  Izdavač   Napomene
core  16-2.43.3  8689  stabilno    canonical✓  core

Iako je LXD snap paket, potrebno ga je instalirati putem sistemskog paketa lxd, koji će stvoriti odgovarajuću grupu u sistemu, potrebne alate u /usr/bin itd.

sudo apt update
sudo apt install lxd

Provjerimo da li je paket instaliran kao snap paket:

snap list

Ime  Verzija    Rev    Praćenje  Izdavač   Napomene
core  16-2.43.3  8689   stabilno    canonical✓  core
lxd   3.21       13474  stabilno/...  canonical✓  -

Instalacija LXD na Arch Linux distribucijama ^

Da bi se instalirao LXD paket u sistemu, potrebno je izvršiti sljedeće naredbe, prva -- ažurira listu paketa dostupnih u repozitoriju, a druga -- direktno instalira paket:

sudo pacman -Syyu && sudo pacman -S lxd

Nakon instalacije paketa, za upravljanje LXD poput običnog korisnika, potrebno ga je dodati u sistemsku grupu lxd:

sudo usermod -a -G lxd user1

Provjerimo da li je korisnik user1 dodavan u grupu lxd:

id -Gn user1

user1 adm dialout cdrom floppy sudo audio dip video plugdev netdev lxd

Ako grupa lxd nije vidljiva na popisu, potrebno je ponovo aktivirati sesiju korisnika. Da bi to učinili, treba se odjaviti i ponovo prijaviti u sustav kao taj isti korisnik.

Aktiviramo systemd pokretanje LXD usluge pri pokretanju sistema:

sudo systemctl enable lxd

Pokrećemo uslugu:

sudo systemctl start lxd

Provjeravamo status usluge:

sudo systemctl status lxd

Pohrana LXD (Storage) ^

Prije nego što započnemo inicijalizaciju, moramo shvatiti kako je logički strukturirano skladište u LXD.

Skladište (Skladište) se sastoji od jednog ili više Storage Pool koji koriste jedan od podržanih datotečnih sustava kao što su ZFS, BTRFS, LVM ili obične mape. Svaki Storage Pool je podijeljen na volumene (Storage Volume) koji sadrže slike, kontejnere ili podatke za druge svrhe.

  • Slike — to su posebno sastavljene distribucije bez Linux jezgre i dostupne su iz vanjskih izvora
  • Kontejneri — to su raspakirani distribucije iz slika, spremne za korištenje
  • Trenutne snimke — to su snimke stanja kontejnera na koje se može vratiti

Osnovne mogućnosti LXD — sustava kontejnera u Linuxu

Za upravljanje pohranom u LXD koristi se naredba lxc storage za koju se pomoći može dobiti upisanjem ključa — lxc storage --help

Sljedeća naredba prikazuje popis svih Storage Pool u LXD pohrana:

lxc storage list

+---------+-------------+--------+--------------------------------+---------+
|  IME   | OPIS       | VOZAČ  |             IZVOR             | KORIŠTEN DEO |
+---------+-------------+--------+--------------------------------+---------+
| hddpool |             | btrfs  | /dev/loop1                     | 2       |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool |             | btrfs  | /var/lib/lxd/disks/ssdpool.img | 4       |
+---------+-------------+--------+--------------------------------+---------+

Za pregled popisa svih Storage Volume u odabranom Storage Pool koristi se naredba lxc storage volume list:

lxc storage volume list hddpool

+-------+----------------------------------+-------------+---------+
| TIPO  |          IME                    | OPIS       | KORIŠTEN DEO |
+-------+----------------------------------+-------------+---------+
| slika | ebd565585223487526ddb3607f515... |             | 1       |
+-------+----------------------------------+-------------+---------+

lxc storage volume list ssdpool

+-----------+----------------------------------+-------------+---------+
|   TIPO    |            IME                  | OPIS       | KORIŠTEN DEO |
+-----------+----------------------------------+-------------+---------+
| kontejner | alp3                             |             | 1       |
+-----------+----------------------------------+-------------+---------+
| kontejner | jupyter                          |             | 1       |
+-----------+----------------------------------+-------------+---------+
| slika     | ebd565585223487526ddb3607f515... |             | 1       |
+-----------+----------------------------------+-------------+---------+

Također, ako je za Storage Pool prilikom stvaranja odabran datotečni sustav BTRFS, popis Storage Volume ili subvolumena u interpretaciji BTRFS može se dobiti pomoću alata tog datotečnog sustava:

sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/hddpool

ID 257 gen 818 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3

sudo btrfs subvolume list -p /var/lib/lxd/storage-pools/ssdpool

ID 257 gen 1820 parent 5 top level 5 path images/ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
ID 260 gen 1819 parent 5 top level 5 path containers/jupyter
ID 263 gen 1820 parent 5 top level 5 path containers/alp3

Inicijalizacija LXD ^

Prije stvaranja i korištenja kontejnera potrebno je izvršiti opću inicijalizaciju LXD koja stvara i postavlja mrežu, kao i pohranu. To se može izvršiti ručno uz pomoć standardnih klijentskih naredbi koje su dostupne na popisu pozivom naredbe lxc --help ili uz pomoć čarobnjaka za inicijalizaciju lxd init odgovaranjem na nekoliko pitanja.

Odabir datotečnog sustava za Pool pohrane ^

Tijekom inicijalizacije LXD postavlja nekoliko pitanja, među kojima je i određivanje tipa datotečnog sustava za zadani Storage Pool. Zadano se odabire datotečni sustav BTRFS. Izmjena na drugi FS nakon stvaranja neće biti moguća. Za odabir FS nudi se tablica usporedbe mogućnosti:

Značajka
Direktorij
Btrfs
LVM
ZFS
CEPH

Optimizirano pohranjivanje slika
no
da
da
da
da

Optimizirano stvaranje instanci
no
da
da
da
da

Optimizirano stvaranje snimaka
no
da
da
da
da

Optimizirani prijenos slika
no
da
no
da
da

Optimizirani prijenos instanci
no
da
no
da
da

Kopiranje pri pisanju
no
da
da
da
da

Na temelju blokova
no
no
da
no
da

Instantno kloniranje
no
da
da
da
da

Upravljač pohrane upotrebljiv unutar kontejnera
da
da
no
no
no

Obnova iz starijih snimaka (ne najnovijih)
da
da
da
no
da

Kvota za pohranu
da(*)
da
da
da
no

Inicijalizacija mreže i Pool pohrane putem čarobnjaka ^

Sljedeća komanda koju ćemo razmotriti nudi konfiguriranje osnovnih komponenti LXD odgovorima na jednostavna pitanja putem čarobnjaka za inicijalizaciju.

Pokrenite naredbu lxc init i unesite odgovore na pitanja nakon znaka dvotočke kako je prikazano u primjeru ispod ili ih izmijenite prema vašim uvjetima:

lxd init

Želite li koristiti LXD klasteriranje? (da/ne) [zadano=ne]: 
Želite li konfigurirati novu pohranu? (da/ne) [zadano=da]: 
Ime nove pohrane [zadano=default]: ssdpool         
Ime sustava pohrane koji želite koristiti (lvm, btrfs, dir) [zadano=btrfs]: 
Želite li stvoriti novi BTRFS bazen? (da/ne) [zadano=da]: 
Želite li koristiti postojeći blok uređaj? (da/ne) [zadano=ne]: 
Veličina novog loop uređaja u GB (minimalno 1GB) [zadano=15GB]: 10GB
Želite li se povezati s MAAS poslužiteljem? (da/ne) [zadano=ne]: 
Želite li stvoriti novi lokalni mrežni most? (da/ne) [zadano=da]: 
Kako želite nazvati novi most? [zadano=lxdbr0]: 
Koja IPv4 adresa treba biti korištena? (CIDR subnet notacija, “auto” ili “none”) [zadano=auto]: 10.0.5.1/24
Želite li da LXD NAT-ira IPv4 promet na vašem mostu? [zadano=da]: 
Koja IPv6 adresa treba biti korištena? (CIDR subnet notacija, “auto” ili “none”) [zadano=auto]: none
Želite li da LXD bude dostupan putem mreže? (da/ne) [zadano=ne]: 
Želite li da zastarjele predmemorirane slike budu automatski ažurirane? (da/ne) [zadano=da] ne
Želite li da se ispiše YAML "lxd init" predkontekst? (da/ne) [zadano=ne]: 

Kreiranje dodatnog Pool-a pohrane ^

U prethodnom koraku stvorili smo Storage Pool kojima smo dali naziv ssdpool i datoteka se nalazi na mom sustavu na adresi /var/lib/lxd/disks/ssdpool.img. Ova adresa datotečnog sustava odgovara fizičkom SSD disku u mom PC-u.

Sljedećim radnjama, kako bismo proširili razumijevanje o ulozi Storage Pool u pohrani, stvorit ćemo drugi Storage Pool koji će se fizički nalaziti na drugom tipu diska, na HDD-u. Problem je u tome što LXD ne dopušta stvaranje Storage Pool izvan adrese /var/lib/lxd/disks/ i čak simboličke veze neće raditi, vidite odgovor programera. Ova ograničenja mogu se zaobići prilikom inicijalizacije/formata Storage Pool navodeći vrijednost kao blok uređaj umjesto puta do loopback-datoteke navodeći to u ključnoj source.

Dakle, do stvaranja Storage Pool potrebno je odrediti loopback datoteku ili postojeći odjeljak u vašem datotečnom sustavu koji će se koristiti. U tu svrhu, stvorit ćemo i koristiti datoteku čiju veličinu ograničavamo na 10 GB:

dd if=\/dev\/zero of=\/mnt\/work\/lxd\/hddpool.img bs=1MB count=10000

10000+0 records in
10000+0 records out
10000000000 bytes (10 GB, 9,3 GiB) copied, 38,4414 s, 260 MB\/s

Povezujemo loopback datoteku na slobodni loopback uređaj:

sudo losetup --find --show \/mnt\/work\/lxd\/hddpool.img

\/dev\/loop1

Zahvaljujući ključu --show , izvršavanje naredbe prikazuje ime uređaja na koje je povezana naša loopback datoteka. Ako je potrebno, možemo ispisati popis svih zauzetih uređaja ovog tipa kako bismo provjerili ispravnost naših radnji:

losetup -l

NAME       SIZELIMIT OFFSET AUTOCLEAR RO BACK-FILE                      DIO LOG-SEC
\/dev\/loop1         0      0         0  0 \/mnt\/work\/lxd\/hddpool.img        0     512
\/dev\/loop0         0      0         1  0 \/var\/lib\/lxd\/disks\/ssdpool.img   0     512

Na popisu možemo otkriti da je na uređaju /dev/loop1 povezana loopback datoteka /mnt/work/lxd/hddpool.img, a na uređaju /dev/loop0 povezana loopback datoteka /var/lib/lxd/disks/ssdpool.img koji odgovara zadanoj postavci Storage Pool.

Sljedeća naredba stvara novi Storage Pool u LXD-u na temelju upravo pripremljene loopback datoteke. LXD će formatirati loopback datoteku /mnt/work/lxd/hddpool.img na uređaju /dev/loop1 u BTRFS datotečni sustav:

lxc storage create hddpool btrfs size=10GB source=\/dev\/loop1

Ispisat ćemo popis svih Storage Pool na zaslon:

lxc storage list

+---------+-------------+--------+--------------------------------+---------+
|  NAME   | DESCRIPTION | DRIVER |             SOURCE             | USED BY |
+---------+-------------+--------+--------------------------------+---------+
| hddpool |             | btrfs  | \/dev\/loop1                     | 0       |
+---------+-------------+--------+--------------------------------+---------+
| ssdpool |             | btrfs  | \/var\/lib\/lxd\/disks\/ssdpool.img | 0       |
+---------+-------------+--------+--------------------------------+---------+

Povećanje veličine Pool-a pohrane ^

Nakon stvaranja Storage Pool, ako je potrebno, može se proširiti. Za Storage Pool temeljenu na BTRFS datotečnom sustavu izvršite sljedeće naredbe:

sudo truncate -s +5G \/mnt\/work\/lxd\/hddpool.img
sudo losetup -c \/dev\/loop1
sudo btrfs filesystem resize max \/var\/lib\/lxd\/storage-pools\/hddpool

Automatsko umetanje loopback datoteke u slot loopback uređaja ^

Imamo jedan mali problem, prilikom ponovnog pokretanja sustava domaćina, datoteka /mnt/work/lxd/hddpool.img "izgubit će se" s uređaja /dev/loop1 i usluga LXD će se srušiti prilikom pokretanja jer je neće vidjeti na tom uređaju. Za rješavanje ovog problema potrebno je stvoriti sustavsku uslugu koja će umetnuti ovu datoteku u uređaj /dev/loop1 prilikom pokretanja sustava domaćina.

Stvorit ćemo unit datoteku tipa usluga u /etc/systemd/system/ za sustav inicijalizacije SystemD:

cat << EOF | sudo tee -a \/etc\/systemd\/system\/lxd-hddpool.service
[Unit]
Description=Losetup LXD Storage Pool (hddpool)
After=local-fs.target

[Service]
Type=oneshot
ExecStart=\/sbin\/losetup \/dev\/loop1 \/mnt\/work\/lxd\/hddpool.img
RemainAfterExit=true

[Install]
WantedBy=local-fs.target
EOF

Aktiviramo uslugu:

sudo systemctl enable lxd-hddpool

Stvorena je simbolička poveznica /etc/systemd/system/local-fs.target.wants/lxd-hddpool.service → /etc/systemd/system/lxd-hddpool.service.

Nakon ponovnog pokretanja host sustava provjeravamo status usluge:

systemctl status lxd-hddpool.service 

● lxd-hddpool.service - Losetup LXD Storage Pool (hddpool)
     Učitano: učitano (/etc/systemd/system/lxd-hddpool.service; omogućeno; zadani uvjet: onemogućeno)
     Aktivno: aktivno (izašao) od Srij 2020-04-08 03:43:53 MSK; prije 1min 37s
    Proces: 711 ExecStart=/sbin/losetup /dev/loop1 /mnt/work/lxd/hddpool.img (kod=izašao, status=0/U_SPJEH)
   Glavni PID: 711 (kod=izašao, status=0/U_SPJEH)

08 trav 03:43:52 manjaro systemd[1]: Pokreće Losetup LXD Storage Pool (hddpool)...
08 trav 03:43:53 manjaro systemd[1]: Završen Losetup LXD Storage Pool (hddpool).

Iz ispisa možemo potvrditi da je stanje usluge aktivno, unatoč tome što je izvršenje našeg skriptnog koda iz jedne naredbe završilo, ovo nam je omogućila opcija RemainAfterExit=true.

Sigurnost. Privilegije kontejnera ^

Budući da se svi procesi kontejnera zapravo izvršavaju u izolaciji na host sustavu koristeći njegovo jezgro, LXD nudi privilegiranost procesa za dodatnu zaštitu pristupa procesima kontejnera u sustavu host, gdje:

  • Privilegirani kontejneri — to su kontejneri u kojima procesi s UID i GID odgovaraju istom vlasniku kao na host sustavu. Na primjer, proces pokrenut u kontejneru s UID jednakim 0 ima sve iste pristupne privilegije kao i proces host sustava s UID jednakim 0. Drugim riječima, root korisnik u kontejneru ima sve privilegije ne samo u kontejneru, već i na host sustavu ako može izaći iz izoliranog imenskog prostora kontejnera.

  • Nepprivilegirani kontejneri — to su kontejneri u kojima procesi pripadaju vlasniku UID i GID iz raspona od 0 do 65535, ali za host sustav vlasnik se maskira pomoću dodanog bita SubUID i SubGID odgovarajuće. Na primjer, korisnik s UID=0 u kontejneru će biti zabilježen na host sustavu kao SubUID + UID. To štiti host sustav jer, ako neki proces u kontejneru uspije izaći iz svog izoliranog imenskog prostora, može komunicirati s host sustavom samo kao proces s nepoznatim, vrlo visokim UID/GID.

Zadano, novi kontejneri imaju status neprivilegiranih, pa moramo definirati SubUID i SubGID.

Stvorit ćemo dva konfiguracijska datoteke u kojima ćemo postaviti masku za SubUID i SubGID:

sudo touch /etc{/subuid,/subgid}
sudo usermod --add-subuids 1000000-1065535 root 
sudo usermod --add-subgids 1000000-1065535 root

Da bi se promjene primijenile, servis LXD mora biti ponovno pokrenut:

sudo systemctl restart lxd

Kreiranje virtualnog mrežnog preklopnika ^

Budući da smo ranije inicijalizirali mrežu pomoću čarobnjaka za inicijalizaciju lxd init i stvorili mrežni uređaj lxdbr0, u ovom dijelu ćemo se samo upoznati s mrežom u LXD i s tim kako stvoriti virtualni prekidač (mrežni most, bridge) pomoću klijentske komande.

Sljedeća shema prikazuje kako prekidač (mrežni most, bridge) povezuje host i kontejnere u mrežu:

Osnovne mogućnosti LXD — sustava kontejnera u Linuxu

Kontejneri mogu komunicirati putem mreže s drugim kontejnerima ili hostom na kojem se ti kontejneri nalaze. Da bi to funkcioniralo, potrebno je povezati virtualne mrežne kartice kontejnera s virtualnim prekidačem. Prvo ćemo stvoriti prekidač, a mrežni sučelja kontejnera će biti povezana u sljedećim poglavljima, nakon što se sam kontejner stvori.

Sljedeća komanda stvara prekidač s podsjetnikom 10.0.5.0/24 i IPv4 adresom 10.0.5.1/24, kao i uključuje ipv4.nat tako da kontejneri mogu dobiti pristup internetu putem hosta koristeći uslugu NAT:

lxc network create lxdbr0 ipv4.address=10.0.5.1/24 ipv4.nat=true ipv6.address=none

Provjeravamo popis mrežnih uređaja dostupnih LXD:

lxc network list

+--------+----------+---------+-------------+---------+
|  NAME  |   TYPE   | MANAGED | DESCRIPTION | USED BY |
+--------+----------+---------+-------------+---------+
| eno1   | physical | NO      |             | 0       |
+--------+----------+---------+-------------+---------+
| lxdbr0 | bridge   | YES     |             | 0       |
+--------+----------+---------+-------------+---------+

Također, provjeru postojanja mrežnog uređaja možemo izvršiti putem standardnog alata Linux-distribucije — ip link ili ip addr:

ip addr

1: lo:  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
2: eno1:  mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:ee:7b:5a:6b:44 brd ff:ff:ff:ff:ff:ff
    altname enp0s25
    inet6 fe80::9571:11f3:6e0c:c07b/64 scope link noprefixroute 
       valid_lft forever preferred_lft forever
3: lxdbr0:  mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether c2:38:90:df:cb:59 brd ff:ff:ff:ff:ff:ff
    inet 10.0.5.1/24 scope global lxdbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::c038:90ff:fedf:cb59/64 scope link 
       valid_lft forever preferred_lft forever
5: veth3ddab174@if4:  mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
    link/ether ca:c3:5c:1d:22:26 brd ff:ff:ff:ff:ff:ff link-netnsid 0

Konfiguracijski profil ^

Svaki kontejner u LXD ima svoju vlastitu konfiguraciju i može je proširiti pomoću globalno deklariranih konfiguracija koje se nazivaju profili konfiguracije. Primjena profila konfiguracije na kontejner ima kaskadni model, sljedeći primjer to demonstrira:

Osnovne mogućnosti LXD — sustava kontejnera u Linuxu

U ovom primjeru, u sustavu LXD stvorena su tri profila: default, hddpool i hostfs. Sva tri profila su primijenjena na kontejner koji ima lokalnu konfiguraciju (siva zona). Profil default ima uređaj root čiji je parametar pool je ssdpool, ali zahvaljujući kaskadnom modelu primjene konfiguracije možemo primijeniti za kontejner profil hddpool čiji je parametar pool koji će preklopiti taj isti parametar iz profila default i kontejner će dobiti konfiguraciju uređaja root s parametrom pool jednakim hddpool, a profil hostfs samo dodaje novi uređaj u kontejner.

Kako bi se vidio popis dostupnih profila konfiguracije služi sljedeća naredba:

lxc profile list

+---------+---------+
|  NAME   | USED BY |
+---------+---------+
| default | 1       |
+---------+---------+
| hddroot | 0       |
+---------+---------+
| ssdroot | 1       |
+---------+---------+

Potpuni popis dostupnih naredbi za rad s profilom može se dobiti dodavanjem ključa --help:

lxc profile --help

Description:
  Upravljaj profilima

Usage:
  lxc profile [command]

Available Commands:
  add         Dodaj profile instancama
  assign      Dodijeli skupove profila instancama
  copy        Kopiraj profile
  create      Stvori profile
  delete      Izbriši profile
  device      Upravljaj uređajima instanci
  edit        Uredi konfiguracije profila kao YAML
  get         Dobij vrijednosti za ključeve konfiguracije profila
  list        Prikaži profile
  remove      Ukloni profile iz instanci
  rename      Preimenuj profile
  set         Postavi ključeve konfiguracije profila
  show        Prikaži konfiguracije profila
  unset       Ukloni ključeve konfiguracije profila

Uređivanje profila ^

Profil konfiguracije prema zadanim postavkama default nema konfiguraciju mrežnog adaptera za kontejner i svi novo kreirani kontejneri nemaju mrežu, za njih je potrebno stvoriti lokalne (izdvojene) portove mreže odvojeno naredbom, ali možemo stvoriti u profilu konfiguracije globalni mrežni uređaj koji će biti dijeljen između svih kontejnera koji koriste taj profil. Tako će odmah nakon naredbe za stvaranje novog kontejnera imati mrežu s pristupom u mrežu. Pritom, nema ograničenja, uvijek možemo kasnije stvoriti lokalni mrežni uređaj ako za tim bude potrebe.

Sljedeća naredba će dodati u profil konfiguracije uređaj eth0 vrste nic priključenog na mrežu lxdbr0:

lxc profile device add default eth0 nic network=lxdbr0 name=eth0

Važno je napomenuti da, s obzirom na to da smo zapravo dodali uređaj u konfiguracijski profil, ako bismo u uređaju naveli statičku IP adresu, svi kontejneri koji budu koristili taj profil dijelit će istu IP adresu. Ako postoji potreba za stvaranjem kontejnera s odvojenom statičkom IP adresom, tada treba stvoriti konfiguraciju mrežnog uređaja na razini kontejnera (lokalna konfiguracija) s parametrom IP adrese, a ne na razini profila.

Provjerimo profil:

lxc profile show default

config: {}
description: Default LXD profile
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: \/
    pool: ssdpool
    type: disk
name: default
used_by: []

U ovom profilu možemo vidjeti da će za sve novo stvorene kontejnere biti stvorena dva uređaja (devices):

  • eth0 — Uređaj tipa nic spojen na prekidač (mrežni most) lxdbr0
  • root — Uređaj tipa disk koji koristi spremišni bazen ssdpool

Kreiranje novih profila ^

Za korištenje ranije stvorenih Storage Pool kontejnere, stvorit ćemo konfiguracijski profil ssdroot u koji ćemo dodati uređaj tipa disk s točkom montiranja / (root) koristeći ranije stvorene Storage Pool — ssdpool:

lxc profile create ssdroot
lxc profile device add ssdroot root disk path=\/ pool=ssdpool

Slično tome, stvaramo uređaj tipa disk, ali u ovom slučaju koristi Storage Pool — hddpool:

lxc profile create hddroot
lxc profile device add hddroot root disk path=\/ pool=hddpool

Provjeravamo konfiguracijske profile:

lxc profile show ssdroot

config: {}
description: ""
devices:
  root:
    path: \/
    pool: ssdpool
    type: disk
name: ssdroot
used_by: []

lxc profile show hddroot

config: {}
description: ""
devices:
  root:
    path: /\
    pool: hddpool
    type: disk
name: hddroot
used_by: []

Repozitorij slika ^

Kontejneri se stvaraju iz slika koje predstavljaju posebno sakupljene distribucije bez Linux kernela. Stoga, prije nego što pokrenemo kontejner, on mora biti raspoređen iz te slike. Izvor slika je lokalni repozitorij u koji se slike učitavaju iz vanjskih repozitorija.

Udaljeni repozitoriji slika ^

Po defaultu, LXD je postavljen za primanje slika iz tri daljinska izvora:

  • ubuntu: (za stabilne Ubuntu slike)
  • ubuntu-daily: (za dnevne Ubuntu slike)
  • images: (za mnoštvo drugih distribucija)

lxc remote list

+-----------------+------------------------------------------+--------+--------+
|      NAME       |                   URL                    | PUBLIC | STATIC |
+-----------------+------------------------------------------+--------+--------+
| images          | https://images.linuxcontainers.org       | DA     | NE     |
+-----------------+------------------------------------------+--------+--------+
| local (default) | unix://                                  | NE     | DA     |
+-----------------+------------------------------------------+--------+--------+
| ubuntu          | https://cloud-images.ubuntu.com/releases | DA     | DA     |
+-----------------+------------------------------------------+--------+--------+
| ubuntu-daily    | https://cloud-images.ubuntu.com/daily    | DA     | DA     |
+-----------------+------------------------------------------+--------+--------+

Na primjer, repozitorij ubuntu: ima sljedeće slike:

lxc image -c dasut list ubuntu: | head -n 11

+----------------------------------------------+--------------+----------+------------+
|                   OPIS                       | ARHITEKTURA  |   VELIČINA|   TIP     |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (izdanje) (20150728)  | x86_64       | 153.72MB | KONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (izdanje) (20150819)  | x86_64       | 152.91MB | KONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (izdanje) (20150906)  | x86_64       | 154.69MB | KONTAINER  |
+----------------------------------------------+--------------+----------+------------+
| ubuntu 12.04 LTS amd64 (izdanje) (20150930)  | x86_64       | 153.86MB | KONTAINER  |
+----------------------------------------------+--------------+----------+------------+

Kako bismo prikazali ograničen broj kolona, koristili smo opciju -c s parametrima dasut, a također smo ograničili dužinu popisa pomoću komande head.

Za prikaz popisa slika dostupna je filtracija. Sljedeća komanda će prikazati popis svih dostupnih arhitektura distribucije AlpineLinux:

lxc image -c ldast list images:alpine/3.11

+------------------------------+--------------------------------------+--------------+
|            ALIAS             |             OPIS                    | ARHITEKTURA |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11 (3 više)          | Alpine 3.11 amd64 (20200220_13:00)   | x86_64       |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/arm64 (1 više)    | Alpine 3.11 arm64 (20200220_13:00)   | aarch64      |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/armhf (1 više)    | Alpine 3.11 armhf (20200220_13:00)   | armv7l       |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/i386 (1 više)     | Alpine 3.11 i386 (20200220_13:01)    | i686         |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/ppc64el (1 više)  | Alpine 3.11 ppc64el (20200220_13:00) | ppc64le      |
+------------------------------+--------------------------------------+--------------+
| alpine/3.11/s390x (1 više)    | Alpine 3.11 s390x (20200220_13:00)   | s390x        |
+------------------------------+--------------------------------------+--------------+

Lokalni repozitorij slika ^

Za početak korištenja kontejnera potrebno je dodati sliku iz globalnog repozitorija u lokalni local:. Sada je lokalni repozitorij prazan, što potvrđuje naredba lxc image list. Ako se metodi list ne navede repozitorij, prema zadanim postavkama koristit će se lokalni repozitorij — local:

lxc image list local:

+-------+-------------+--------+-------------+--------------+------+------+
| ALIAS | FINGERPRINT | PUBLIC | DESCRIPTION | ARCHITECTURE | TYPE | SIZE |
+-------+-------------+--------+-------------+--------------+------+------+

Upravljanje slikama u repozitoriju provodi se sljedećim metodama:

Komanda
Opis

lxc image alias
Upravljaj aliasima slika

lxc image copy
Kopiraj slike između poslužitelja

lxc image izbriši
Obriši slike

lxc image edit
Uredi svojstva slika

lxc image export
Izvezi i preuzmi slike

lxc image uvoz
Uvezi slike u skladište slika

lxc image info
Prikaži korisne informacije o slikama

lxc image list
Popis slika

lxc image osvježi
Osvježi slike

lxc image prikaži
Prikaži svojstva slike

Kopiramo sliku u lokalni repozitorij iz globalnog images::

lxc image copy images:alpine/3.11/amd64 local: --alias=alpine3

Slika je uspješno kopirana!

Ispišimo popis svih slika dostupnih sada u lokalnom repozitoriju local::

lxc image -c lfdatsu list local:

+---------+--------------+------------------------------------+--------------+
|  ALIAS  | FINGERPRINT  |            DESCRIPTION             | ARCHITECTURE |
+---------+--------------+------------------------------------+--------------+
| alpine3 | 73a3093d4a5c | Alpine 3.11 amd64 (20200220_13:00) | x86_64       |
+---------+--------------+------------------------------------+--------------+

Konfiguracija LXD-a ^

Osim interaktivnog moda, LXD također podržava neinteraktivni način postavljanja konfiguracije, što znači da se konfiguracija postavlja u obliku YAML datoteke, posebnog formata koji omogućava postavljanje cijele konfiguracije odjednom, zaobilazeći izvedbu mnogih interaktivnih naredbi koje su obrađene gore u ovom članku, uključujući konfiguraciju mreže, stvaranje profila konfiguracije itd. Ovdje nećemo razmatrati ovo područje, možete se s time upoznati u dokumentaciji.

Sljedeća interaktivna naredba lxc config koju ćemo razmotriti, omogućava postavljanje konfiguracije. Na primjer, kako bi se preuzete slike u lokalni repozitorij ne ažurirale automatski iz globalnih repozitorija, možemo omogućiti ovo ponašanje sljedećom naredbom:

lxc config set images.auto_update_cached=false

Kreiranje i upravljanje kontejnerom ^

Za stvaranje kontejnera koristi se naredba lxc init kojom se prosljeđuju vrijednosti repozitrij:slika i zatim željeni identifikator za kontejner. Repo biti može navedeno kao lokalno local: tako i bilo koji globalni. Ako repozitorij nije naveden, lokalni repozitorij se koristi prema zadanim postavkama za pretraživanje slike. Ako je slika navedena iz globalnog repozitorija, prvo će se slika preuzeti u lokalni repozitorij, a zatim koristiti za stvaranje kontejnera.

Izvršimo sljedeću naredbu kako bismo stvorili naš prvi kontejner:

lxc init alpine3 alp --storage=hddpool --profile=default --profile=hddroot

Razmotrit ćemo redom ključeve naredbe koje ovdje koristimo:

  • alpine3 — Navodi se alias (pseudonim) za sliku koja je prethodno preuzeta u lokalni repozitorij. Ako alias nije bio stvoren za ovu sliku, uvijek se može pozvati na sliku po njenom Fingerprint koji se ispisuje u tablici.
  • alp — Postavlja se identifikator za kontejner
  • --storage — Ovaj ključ ukazuje u kojem Storage Pool će biti stvoren kontejner
  • --profile — Ovi ključevi kaskadno primjenjuju konfiguraciju na kontejner iz prethodno stvorenih profila konfiguracije

Pokrećemo kontejner koji započinje pokretanje init sustava distribucije:

lxc start alp

Također, možemo iskoristiti naredbu lxc launch koja omogućuje spajanje naredbi lxc init i lxc start u jednu operaciju.

Provjeravamo stanje kontejnera:

lxc list -c ns46tb
+------+---------+------------------+------+-----------+--------------+
| NAME |  STATE  |       IPV4       | IPV6 |   TYPE    | STORAGE POOL |
+------+---------+------------------+------+-----------+--------------+
| alp  | RUNNING | 10.0.5.46 (eth0) |      | CONTAINER | hddpool      |
+------+---------+------------------+------+-----------+--------------+

Provjeravamo konfiguraciju kontejnera:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: vethb1fe71d8
  volatile.eth0.hwaddr: 00:16:3e:5f:73:3e
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  root:
    path: \/
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

U odjeljku profiles možemo se uvjeriti da ovaj kontejner koristi dva profila konfiguracije — default i hddroot. U odjeljku devices možemo otkriti samo jedan uređaj, budući da je mrežni uređaj stvoren na razini profila default. Da biste vidjeli sve uređaje koje kontejner koristi, potrebno je dodati ključ --expanded:

lxc config show alp --expanded

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: vethb1fe71d8
  volatile.eth0.hwaddr: 00:16:3e:5f:73:3e
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  eth0:
    name: eth0
    network: lxdbr0
    type: nic
  root:
    path: \/
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

Postavljanje statičke IP adrese ^

Ako pokušamo postaviti IP adresu za mrežni uređaj eth0 komandom lxc config device set alp namijenjenu za konfiguraciju kontejnera, dobit ćemo grešku koja će nam reći da uređaj ne postoji jer uređaj eth0 koji koristi kontejner pripada profilu default:

lxc config device set alp eth0 ipv4.address 10.0.5.5

Error: The device doesn't exist

Naravno, možemo postaviti statičku IP adresu za eth0 uređaj u profilu, ali ona će biti jedinstvena za sve kontejnere koji koriste ovaj profil. Stoga, dodajmo izdvojen uređaj za kontejner:

lxc config device add alp eth0 nic name=eth0 nictype=bridged parent=lxdbr0 ipv4.address=10.0.5.5

Nakon toga, potrebno je restartati kontejner:

lxc restart alp

Ako sada pogledamo na konfiguraciju kontejnera, ne trebamo primjenjivati opciju --expanded da bismo vidjeli mrežni uređaj eth0, jer smo ga kreirali na razini kontejnera i on je kaskadno prikrio isti uređaj iz profila. default:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200326_13:39)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200326_13:39"
  image.type: squashfs
  volatile.base_image: ebd565585223487526ddb3607f5156e875c15a89e21b61ef004132196da6a0a3
  volatile.eth0.host_name: veth2a1dc59d
  volatile.eth0.hwaddr: 00:16:3e:0e:e2:71
  volatile.idmap.base: "0"
  volatile.idmap.current: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.idmap.next: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.idmap: '[{"Isuid":true,"Isgid":false,"Hostid":1000000,"Nsid":0,"Maprange":65536},{"Isuid":false,"Isgid":true,"Hostid":1000000,"Nsid":0,"Maprange":65536}]'
  volatile.last_state.power: RUNNING
devices:
  eth0:
    ipv4.address: 10.0.5.5
    name: eth0
    nictype: bridged
    parent: lxdbr0
    type: nic
  root:
    path: \/
    pool: hddpool
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

Brisanje kontejnera ^

Za brisanje kontejnera koristi se komanda lxc delete, ali prije nego što obrišemo kontejner, on mora biti zaustavljen pomoću komande lxc stop:

lxc stop alp

lxc list

+------+---------+-------------------+------+-----------+-----------+
| NAME |  STATE  |       IPV4        | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+-------------------+------+-----------+-----------+
| alp  | STOPPED | 10.0.5.10 (eth0)  |      | KONTAINER | 0         |
+------+---------+-------------------+------+-----------+-----------+

Nakon što smo se uvjerili da je stanje kontejnera STOPPED, može se obrisati iz Storage Pool:

lxc delete alp

Pristup kontejneru ^

Za izvođenje komandi unutar kontejnera, direktno, bez mrežnih veza, koristi se komanda lxc exec koja izvršava komande unutar kontejnera bez pokretanja sistemske ljuske. Ako trebate izvršiti komandu unutar ljuske, koristeći shell obrasce, kao što su varijable, preusmjeravanja fajlova (pipe) itd., tada treba eksplicitno pokrenuti ljusku i proslijediti komandu kao ključ, na primjer:

lxc exec alp -- \/bin\/sh -c "echo $HOME"

U komandi je korišten specijalni simbol za escaping za specijalni simbol $ tako da varijabla $HOME nije interpretirana na host mašini, već isključivo unutar kontejnera.

Također, moguće je pokrenuti interaktivni režim ljuske, a nakon završetka sesije izvršiti hotkey CTRL+D:

lxc exec alp -- \/bin\/sh

Upravljanje resursima kontejnera ^

U LXD-u možete upravljati resursima kontejnera pomoću posebnog skupa konfiguracije. Potpuni popis konfiguracijskih parametara kontejnera možete pronaći u dokumentaciji.

Ograničenje resursa RAM-a (OS) ^

Parametar limits.memory ograničava količinu RAM-a dostupnog za kontejner. Kao vrijednost se navodi broj i jedan od dostupnih sufiksa.

Postavimo kontejneru ograničenje na količinu RAM-a od 256 MB:

lxc config set alp limits.memory 256MB

Također, postoje i drugi parametri za ograničavanje memorije:

  • limits.memory.enforce
  • limits.memory.hugepages
  • limits.memory.swap
  • limits.memory.swap.priority

Komanda lxc config show omogućuje prikaz svih konfiguracija kontejnera, uključujući primjenjeno ograničenje resursa koje je postavljeno:

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200220_13:00)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200220_13:00"
  image.type: squashfs
  limits.memory: 256MB
  volatile.base_image: 73a3093d4a5ce0148fd84b95369b3fbecd19a537ddfd2e2d20caa2eef0e8fd60
  volatile.eth0.host_name: veth75b6df07
  volatile.eth0.hwaddr: 00:16:3e:a1:e7:46
  volatile.idmap.base: "0"
  volatile.idmap.current: '[]'
  volatile.idmap.next: '[]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

Ograničenje resursa CPU-a (JP) ^

Za ograničavanje resursa CPU postoji nekoliko vrsta ograničenja:

  • limit.cpu — vezuje kontejner za jedno ili više CPU jezgri
  • limits.cpu.allowance — upravlja ili kvotama CFS scheduler-a kada je vrijeme ograničeno, ili univerzalnim mehanizmom dijeljenja resursa CPU kada je prošlo postotak
  • limits.cpu.priority — prioritet scheduler-a kada je više instanci, koje dijele skup procesora, dobilo isti postotak procesora

lxc config set alp limits.cpu.allowance 40%

lxc config show alp

architecture: x86_64
config:
  image.architecture: amd64
  image.description: Alpine 3.11 amd64 (20200220_13:00)
  image.os: Alpine
  image.release: "3.11"
  image.serial: "20200220_13:00"
  image.type: squashfs
  limits.cpu.allowance: 40%
  limits.memory: 256MB
  volatile.base_image: 73a3093d4a5ce0148fd84b95369b3fbecd19a537ddfd2e2d20caa2eef0e8fd60
  volatile.eth0.host_name: veth75b6df07
  volatile.eth0.hwaddr: 00:16:3e:a1:e7:46
  volatile.idmap.base: "0"
  volatile.idmap.current: '[]'
  volatile.idmap.next: '[]'
  volatile.last_state.idmap: '[]'
  volatile.last_state.power: RUNNING
devices: {}
ephemeral: false
profiles:
- default
stateful: false
description: ""

Ograničenje prostora na disku ^

Osim ograničenja poput limits.read, limits.write također možemo ograničiti količinu diska koje kontejner može koristiti (radi samo s ZFS ili BTRFS):

lxc config device set alp root size=2GB

Nakon postavljanja, u parametru devices.root.size možemo provjeriti postavljene granice:

lxc config show alp
...
devices:
  root:
    path: \/
    pool: hddpool
    size: 2GB
    type: disk
ephemeral: false
profiles:
- default
- hddroot
stateful: false
description: ""

Za pregled korištenih diskovnih kvota možemo dobiti iz komande lxc info:

lxc info alp
...
Resources:
  Processes: 5
  Disk usage:
    root: 1.05GB
  CPU usage:
    CPU usage (in seconds): 1
  Memory usage:
    Memory (current): 5.46MB
  Network usage:
    eth0:
      Bytes received: 802B
      Bytes sent: 1.59kB
      Packets received: 4
      Packets sent: 14
    lo:
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0

Unatoč tome što smo postavili ograničenje za korijenski uređaj kontejnera na 2GB, sistemski alati kao što su df neće vidjeti ovo ograničenje. U tu svrhu ćemo provesti mali test i otkriti kako to radi.

Stvorit ćemo 2 nova identična kontejnera u istom Storage Pool (hddpool):

lxc init alpine3 alp1 --storage=hddpool --profile=default --profile=hddroot
lxc init alpine3 alp2 --storage=hddpool --profile=default --profile=hddroot

lxc list
+------+---------+------------------+------+-----------+-----------+
| NAME |  STATE  |       IPV4       | IPV6 |   TYPE    | SNAPSHOTS |
+------+---------+------------------+------+-----------+-----------+
| alp1 | RUNNING | 10.0.5.46 (eth0) |      | CONTAINER | 0         |
+------+---------+------------------+------+-----------+-----------+
| alp2 | RUNNING | 10.0.5.30 (eth0) |      | CONTAINER | 0         |
+------+---------+------------------+------+-----------+-----------+

U jednom od kontejnera stvorit ćemo datoteku veličine 1GB:

lxc exec alp1 -- dd if=\/dev\/urandom of=file.img bs=1M count=1000

Provjerimo je li datoteka stvorena:

lxc exec alp1 -- ls -lh
total 1000M  
-rw-r--r--    1 root     root     1000.0M Mar 27 10:16 file.img

Ako pogledamo u drugom kontejneru, provjerit ćemo postoji li datoteka na istom mjestu, neće je biti, što je očekivano, jer se kontejneri stvaraju unutar svojih vlastitih Storage Volume u ovom istom Storage Pool:

lxc exec alp2 -- ls -lh
total 0

Ali hajde da uporedimo vrijednosti koje daju df u jednom i drugom kontejneru:

lxc exec alp1 -- df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
\/dev\/loop1           btrfs           9.3G   1016.4M      7.8G  11% \/
...

lxc exec alp2 -- df -hT
Filesystem           Type            Size      Used Available Use% Mounted on
\/dev\/loop1           btrfs           9.3G   1016.4M      7.8G  11% \/
...

Uređaj /dev/loop1 montiran kao korijenski razdjel je Storage Pool koji ovi kontejneri koriste, stoga dijele njegov volumen na obojici.

Statistika potrošnje resursa ^

Statistiku potrošnje resursa za kontejner možete pogledati pomoću naredbe:

lxc info alp

Name: alp
Location: none
Remote: unix:\/
Architecture: x86_64
Created: 2020\/04\/08 18:05 UTC
Status: Running
Type: container
Profiles: default, hddroot
Pid: 19219
Ips:
  eth0: inet    10.0.5.5        veth2a1dc59d
  eth0: inet6   fe80::216:3eff:fe0e:e271        veth2a1dc59d
  lo:   inet    127.0.0.1
  lo:   inet6   ::1
Resources:
  Processes: 5
  Disk usage:
    root: 495.62kB
  CPU usage:
    CPU usage (in seconds): 1
  Memory usage:
    Memory (current): 4.79MB
  Network usage:
    eth0:
      Bytes received: 730B
      Bytes sent: 1.59kB
      Packets received: 3
      Packets sent: 14
    lo:
      Bytes received: 0B
      Bytes sent: 0B
      Packets received: 0
      Packets sent: 0

Rad sa snimkama ^

U LXD postoji mogućnost stvaranja snimaka i vraćanja iz njih stanja kontejnera.

Da biste stvorili snimak, izvršite sljedeću naredbu:

lxc snapshot alp snapshot1

Naredba lxc snapshot nema ključ list, stoga, da biste pogledali popis snimaka, potrebno je koristiti naredbu koja prikazuje opće informacije o kontejneru:

lxc info alp
...
...
Snimke:
  snapshot1 (snimljen 2020/04/08 u 18:18 UTC) (bez stanja)

Obnovite kontejner iz snimke naredbom lxc restore navodeći kontejner za koji će se izvršiti obnova i nadimak snimke:

lxc restore alp snapshot1

Sljedeća naredba služi za brisanje snimke. Imajte na umu da sintaksa ove naredbe nije slična ostalima; ovdje je potrebno navesti kosi crticu nakon imena kontejnera. Ako se kosi znak izostavi, naredba za brisanje snimke će se interpretirati kao naredba za brisanje kontejnera!

lxc delete alp/snapshot1

U gornjem primjeru razmatrali smo tzv. snimke bez stanja. U LXD postoji i druga vrsta snimaka — snimke sa stanjem, u kojima se čuva trenutno stanje svih procesa unutar kontejnera. Sa snimcima sa stanjem povezane su brojne zanimljive i korisne funkcije.

Šta još? ^

  • Za Python programere dostupan je modul PyLXD koji pruža API za LXD

AŽURIRANJE 10.04.2020 15:00: Dodana navigacija

Izvor: habr.com

Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere 🔥 Kupite pouzdan hosting za web stranice s DDoS zaštitom, VPS VDS servere | ProHoster