Puoi avere container Linux senza Docker? Senza OpenShift? Senza Kubernetes?
Si, puoi. Anni prima che Docker rendesse i container un termine familiare (se vivi in un data center, cioè), il progetto LXC ha sviluppato il concetto di eseguire una specie di sistema operativo virtuale, condividendo lo stesso kernel, ma contenuto all'interno di gruppi definiti di processi.
Docker basato su LXC e oggi ci sono molte piattaforme che sfruttano il lavoro di LXC sia direttamente che indirettamente. La maggior parte di queste piattaforme semplifica in modo sublime la creazione e la manutenzione dei container e, per distribuzioni di grandi dimensioni, ha senso utilizzare tali servizi specializzati. Tuttavia, non tutti gestiscono una distribuzione di grandi dimensioni o hanno accesso a servizi di grandi dimensioni per conoscere la containerizzazione. La buona notizia è che puoi creare, utilizzare e apprendere container con nient'altro che un PC con Linux e questo articolo. Questo articolo ti aiuterà a capire i container esaminando LXC, come funziona, perché funziona e come risolvere i problemi quando qualcosa va storto.
Spostando la semplicità
Contenitori Linux
- Cosa sono i container Linux?
- Un'introduzione alla terminologia dei contenitori
- Download:Primer sui contenitori
- Operatori Kubernetes:automatizzare la piattaforma di orchestrazione dei container
- eBook:modelli Kubernetes per la progettazione di app cloud native
- Cos'è Kubernetes?
Se stai cercando una guida rapida a LXC, fai riferimento all'eccellente sito web di Linux Containers.
Installazione di LXC
Se non è già installato, puoi installare LXC con il tuo gestore di pacchetti.
Su Fedora o simili, inserisci:
$ sudo dnf install lxc lxc-templates lxc-doc
Su Debian, Ubuntu e simili, inserisci:
$ sudo apt install lxc
Creazione di un bridge di rete
La maggior parte dei container presuppone che sarà disponibile una rete e la maggior parte degli strumenti container prevede che l'utente sia in grado di creare dispositivi di rete virtuali. L'unità di base richiesta per i container è il bridge di rete, che è più o meno l'equivalente software di uno switch di rete. Uno switch di rete è un po' come un adattatore a Y intelligente utilizzato per dividere un jack per cuffie in modo che due persone possano sentire la stessa cosa con cuffie separate, tranne per il fatto che, invece di un segnale audio, uno switch di rete collega i dati di rete.
È possibile creare il proprio bridge di rete software in modo che il computer host e il sistema operativo contenitore possano inviare e ricevere dati di rete diversi su un unico dispositivo di rete (porta Ethernet o scheda wireless). Questo è un concetto importante che spesso va perso una volta che si è passati alla generazione manuale dei container, perché, indipendentemente dalle dimensioni della distribuzione, è altamente improbabile che si disponga di una scheda di rete fisica dedicata per ogni container eseguito. È fondamentale comprendere che i container comunicano con i dispositivi di rete virtuale, quindi sai da dove iniziare la risoluzione dei problemi se un container perde la connessione di rete.
Per creare un bridge di rete sulla tua macchina, devi disporre delle autorizzazioni appropriate. Per questo articolo, usa il sudo comando per operare con i privilegi di root. (Tuttavia, i documenti LXC forniscono una configurazione per concedere agli utenti il permesso di farlo senza usare sudo .)
$ sudo ip link add br0 type bridge
Verifica che l'interfaccia di rete immaginaria sia stata creata:
$ sudo ip addr show br0
7: br0: <BROADCAST,MULTICAST> mtu 1500 qdisc
noop state DOWN group default qlen 1000
link/ether 26:fa:21:5f:cf:99 brd ff:ff:ff:ff:ff:ff
Da br0 è visto come un'interfaccia di rete, richiede un proprio indirizzo IP. Scegli un indirizzo IP locale valido che non sia in conflitto con alcun indirizzo IP esistente sulla tua rete e assegnalo a br0 dispositivo:
$ sudo ip addr add 192.168.168.168 dev br0
E infine, assicurati che br0 è attivo e funzionante:
$ sudo ip link set br0 up
Impostazione della configurazione del contenitore
Il file di configurazione per un container LXC può essere tanto complesso quanto necessario per definire la posizione di un container nella rete e nel sistema host, ma per questo esempio la configurazione è semplice. Crea un file nel tuo editor di testo preferito e definisci un nome per il contenitore e le impostazioni richieste della rete:
lxc.utsname = opensourcedotcom
lxc.network.type = veth
lxc.network.flags = up
lxc.network.link = br0
lxc.network.hwaddr = 4a:49:43:49:79:bd
lxc.network.ipv4 = 192.168.168.1/24
lxc.network.ipv6 = 2003:db8:1:0:214:1234:fe0b:3596
Salva questo file nella tua home directory come mycontainer.conf .
Il lxc.utsname è arbitrario. Puoi chiamare il tuo container come preferisci; è il nome che utilizzerai all'avvio e all'arresto.
Il tipo di rete è impostato su veth , che è una specie di cavo patch Ethernet virtuale. L'idea è che il veth la connessione va dal contenitore al dispositivo bridge, definito da lxc.network.link proprietà, impostata su br0 . L'indirizzo IP per il container è nella stessa rete del dispositivo bridge ma univoco per evitare collisioni.
Ad eccezione del veth tipo di rete e su flag di rete, inventi tutti i valori nel file di configurazione. L'elenco delle proprietà è disponibile su man lxc.container.conf . (Se manca sul tuo sistema, controlla il tuo gestore di pacchetti per i pacchetti di documentazione LXC separati.) Ci sono diversi file di configurazione di esempio in /usr/share/doc/lxc/examples , che dovresti rivedere in seguito.
Avvio di una shell contenitore
A questo punto, sei a due terzi della strada verso un container funzionante:hai l'infrastruttura di rete e hai installato le schede di rete immaginarie in un PC immaginario. Tutto ciò che serve ora è installare un sistema operativo.
Tuttavia, anche in questa fase, puoi vedere LXC al lavoro lanciando una shell all'interno di uno spazio contenitore.
$ sudo lxc-execute --name basic \
--rcfile ~/mycontainer.conf /bin/bash \
--logfile mycontainer.log
#
In questo contenitore molto spoglio, guarda la tua configurazione di rete. Dovrebbe sembrarti familiare, ma unico.
# /usr/sbin/ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state [...]
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
[...]
22: eth0@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> [...] qlen 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 2003:db8:1:0:214:1234:fe0b:3596/64 scope global
valid_lft forever preferred_lft forever
[...]
Il tuo container è a conoscenza della sua falsa infrastruttura di rete e di un kernel familiare ma unico.
# uname -av
Linux opensourcedotcom 4.18.13-100.fc27.x86_64 #1 SMP Wed Oct 10 18:34:01 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux
Usa l'uscita comando per uscire dal contenitore:
# exit
Installazione del sistema operativo del contenitore
Costruire un ambiente completamente containerizzato è molto più complesso dei passaggi di rete e configurazione, quindi puoi prendere in prestito un modello di container da LXC. Se non disponi di modelli, cerca un pacchetto di modelli LXC separato nel tuo repository software.
I modelli LXC predefiniti sono disponibili in /usr/share/lxc/templates .
$ ls -m /usr/share/lxc/templates/
lxc-alpine, lxc-altlinux, lxc-archlinux, lxc-busybox, lxc-centos, lxc-cirros, lxc-debian, lxc-download, lxc-fedora, lxc-gentoo, lxc-openmandriva, lxc-opensuse, lxc-oracle, lxc-plamo, lxc-slackware, lxc-sparclinux, lxc-sshd, lxc-ubuntu, lxc-ubuntu-cloud
Scegli il tuo preferito, quindi crea il contenitore. Questo esempio utilizza Slackware.
$ sudo lxc-create --name slackware --template slackware
Guardare un modello in esecuzione è educativo quasi quanto costruirne uno da zero; è molto dettagliato e puoi vedere che lxc-create imposta la "radice" del contenitore su /var/lib/lxc/slackware/rootfs e diversi pacchetti vengono scaricati e installati in quella directory.
La lettura dei file modello ti dà un'idea ancora migliore di ciò che è coinvolto:LXC imposta un albero di dispositivi minimo, file di spool comuni, una tabella di file system (fstab), file init e così via. Impedisce inoltre l'avvio di alcuni servizi che non hanno senso in un contenitore (come udev per il rilevamento dell'hardware). Poiché i modelli coprono un ampio spettro di configurazioni Linux tipiche, se intendi progettarne uno tuo, è saggio basare il tuo lavoro su un modello più vicino a ciò che desideri impostare; altrimenti, sei sicuro di commettere errori di omissione (se non altro) su cui il progetto LXC è già inciampato e reso conto.
Dopo aver installato l'ambiente minimo del sistema operativo, puoi avviare il tuo container.
$ sudo lxc-start --name slackware \
--rcfile ~/mycontainer.conf
Hai avviato il contenitore, ma non ti sei collegato ad esso. (A differenza dell'esempio di base precedente, questa volta non stai eseguendo solo una shell, ma un sistema operativo containerizzato.) Allegalo per nome.
$ sudo lxc-attach --name slackware
#
Verifica che l'indirizzo IP del tuo ambiente corrisponda a quello nel tuo file di configurazione.
# /usr/sbin/ip addr SHOW | grep eth
34: eth0@if35: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 [...] 1000
link/ether 4a:49:43:49:79:bd brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 192.168.168.167/24 brd 192.168.168.255 scope global eth0
Esci dal container e spegnilo.
# exit
$ sudo lxc-stop slackware
Esecuzione di container del mondo reale con LXC
Nella vita reale, LXC semplifica la creazione e l'esecuzione di container sicuri e protetti. I container hanno fatto molta strada dall'introduzione di LXC nel 2008, quindi usa l'esperienza dei suoi sviluppatori a tuo vantaggio.
Sebbene le istruzioni LXC su linuxcontainers.org semplifichino il processo, questo tour del lato manuale delle cose dovrebbe aiutarti a capire cosa sta succedendo dietro le quinte.