GNU/Linux >> Linux Esercitazione >  >> Linux

Dietro le quinte con i container Linux

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.


Linux
  1. Pianifica un'attività con il comando Linux at

  2. Analizza il kernel Linux con ftrace

  3. Fai calcoli nella shell Linux con GNU bc

  4. Gestisci le connessioni di rete dalla riga di comando di Linux con nmcli

  5. Introduzione ai firewall Linux

Rendi Linux più forte con i firewall

Impara Linux con Raspberry Pi

Network Manager su Linux con esempi

Vai dietro le quinte con un'installazione postino e una guida pratica

Proteggi Linux con il file Sudoers

Come impostare la rete esterna per i container nei container Linux (LXC)