LXC / LXD

#234

Úvod do práce s kontejnery pomocí LXC / LXD – psáno pro Ubuntu 20.04.

Základní instalace

sudo lxd init
Would you like to use LXD clustering? (yes/no) [default=no]: no
Do you want to configure a new storage pool? (yes/no) [default=yes]: yes
Name of the new storage pool [default=default]: default
Name of the storage backend to use (btrfs, dir, lvm, zfs, ceph) [default=zfs]: zfs
Create a new BTRFS pool? (yes/no) [default=yes]: yes
Would you like to use an existing empty block device (e.g. a disk or partition)? (yes/no) [default=no]: no
Size in GB of the new loop device (1GB minimum) [default=23GB]: 20GB
Would you like to connect to a MAAS server? (yes/no) [default=no]: no
Would you like to create a new local network bridge? (yes/no) [default=yes]: yes
What should the new bridge be called? [default=lxdbr0]:
What IPv4 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]:
What IPv6 address should be used? (CIDR subnet notation, “auto” or “none”) [default=auto]: none
Would you like the LXD server to be available over the network? (yes/no) [default=no]: no
Would you like stale cached images to be updated automatically? (yes/no) [default=yes] yes
Would you like a YAML "lxd init" preseed to be printed? (yes/no) [default=no]: no

Velikost loop device je vhodné dát spíš větší – vyhnete se tak zpočátku operacím, které umožňují přidělit větší místo pro diskový prostor dostupný jednotlivým kontejnerům.

Síť

macvlan – IP adresy přiděluje DHCP server v lokální síti

Tento síťový profil funguje tak, že síťové rozhraní v kontejneru dostává IP adresy z DHCP serveru lokální síťě.

Nejprve zjistíme id síťové karty:

ip route show default 0.0.0.0/0

Zobrazí se něco jako

default via 10.xxx.xxx.xxx dev eno0 proto dhcp src 10.xxx.xxx.yyy metric 100

ID sítové karty je v tomto případě eno0.

Teď přidáme nový profil a nastavíme ho (s naším ID síťové karty v parametru parent):

lxc profile create macvlan
lxc profile device add macvlan eth0 nic nictype=macvlan parent=eno0

Nový kontejner vytvoříme s uvedením profilu macvlan:

lxc launch ubuntu:20.04 NAZEV --profile default --profile macvlan

macvlan – veřejné (fixní) IP adresy

Předpokladem je, že fyzická síťová karta má nastavenou fixní IP adresu ve stejném adresním rozsahu, jako budou budoucí IP adresy kontejnerů.

Nejprve zjistíme id síťové karty:

ip route show default 0.0.0.0/0

Zobrazí se něco jako

default via xxx.xxx.xxx.xxx dev eno0 proto static

ID sítové karty je v tomto případě eno0.

Teď přidáme nový profil a nastavíme ho (s naším ID síťové karty v parametru parent):

lxc profile create macvlan
lxc profile device add macvlan eth0 nic nictype=macvlan parent=eno0

Nový kontejner vytvoříme s uvedením profilu macvlan:

lxc launch ubuntu:20.04 NAZEV --profile default --profile macvlan

Přihlasíme se do kontejneru:

lxc shell NAZEV

Vytvoříme nový soubor:

touch cat /etc/netplan/50-static-public-ip.yaml

A vyplníme jej následujícím obsahem s konkrétními síťovými údaji:

nano cat /etc/netplan/50-static-public-ip.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    eth0:
      dhcp4: no
      dhcp6: no
      addresses:
        - xxx.xxx.xxx.yyy/24
      gateway4: xxx.xxx.xxx.1
      nameservers:
        addresses:
          - 88.86.116.45
          - 8.8.8.8

Po aplikování tohoto nastavení by již kontejner měl být na síti:

netplan --debug apply

Zdroj: https://blog.simos.info/…-containers/

Vytvoření nového storage na volném fyzickém disku

lxc storage create disk1 zfs source=/dev/sdb

Vytvoření nového kontejneru s výběrem storage

lxc launch IMAGE NAZEV --profile default --profile macvlan --storage=disk1

Parametrem image říkáme, jaký linux chceme nainstalovat:

Distribuce Image
Ubuntu Názvy obrazů jsou ve tvaru ubuntu:<version>, tj. např. ubuntu:20.04, ubuntu:18.04 apod.
Debian Názvy obrazů jsou ve tvaru images:debian/<code-name>, tj. např. images:debian/buster, images:debian/stretch atd.
Alpine Názvy obrazů jsou ve tvaru images:alpine/<version>, tj. např. images:alpine/3.13; existuje také images:alpine/edge pro instalaci vývojové verze.

Dostupné obrazy lze vypsat příkazem lxc image list images: [distribuce] [architektura], tj. např. lxc image list images: fedora amd64. Parametry distibuce a architektura jsou nepovinné – ale výsledný seznam je dlouhý.

Příkazová řádka

Shell

Dovnitř kontejneru se dostaneme příkazem

lxc shell NAZEV

Práce probíhá pod uživatelem root.

SSH

Pro přístup přes ssh musíme nejdříve vytvořit uživatele a nastavit mu veřejný klíč:

adduser UZIVATEL
adduser UZIVATEL sudo

su UZIVATEL
cd /home/UZIVATEL

mkdir .ssh
chmod 700 .ssh
touch .ssh/authorized_keys
chmod 600 .ssh/authorized_keys

Veřejný klíč si uložíme do clipboardu a textovým editorem ho přidáme do souboru .ssh/authorized_keys. Poté se již můžeme přihlásit přes ssh.

Základní příkazy pro ovládání

Seznam kontejnerů

lxc list

Spuštění kontejneru

lxc start NAZEV

Zastavení kontejneru

lxc stop NAZEV

Výmaz kontejneru

lxc delete NAZEV

Před výmazem musíme kontejner zastavit příkazem lxc stop. Lze také použít varinatu lxc delete NAZEV --force.

Práce se soubory

Kopírování souboru do kontejneru

lxc file push NAZEV-SOUBORU KONTEJNER/home/user/cesta/k/souboru/

POZOR: cílová cesta musí končit lomítkem /.

Pokročilé

Přepnutí na privilegovaný kontejner

Tohle nedělejte, pokud nevíte co děláte!

lxc stop KONTEJNER
lxc config set KONTEJNER security.privileged true
lxc start KONTEJNER