container

Strumento informatico che consente di eseguire uno o più processi in una modalità “ristretta” o con speciali capacità, tale da ridurre la visione che tale o tali processi hanno del sistema e/o tale da limitare le risorse che questo o questi hanno del sistema attraverso appositi servizi del kernel Linux quali i namespace, i cgroups e le root capabilities. In particolare il filesystem è quello di una container image# e i processi sono eseguiti solitamente in namespace “PID” e “NET” creati ad hoc e quindi non “vedono” gli altri processi del sistema e le normali interfacce di rete.

La soluzione di containerizzazione più famosa è Docker# tale filesystem è montato in modalità COW o copy on write, il che significa che è considerato immodificabile e ogni modifica verrà scritta su di un layer a parte e non verrà mutuata da nuovi container aventi la stessa immagine avviati successivamente.

Insomma un chroot on steroids.

I container in Linux

I containers sono una funzionalità del kernel Linux grazie alla quale è possibile eseguire applicazioni in modalità particolare, tale che sia possibile:

  • limitare la visibilità che il processo ha dell’intero sistema;

  • limitare l’ammontare di risorse del sistema a disposizione del processo e tracciare in maniera precisa tracciare eventuali sotto-processi creati;

  • assegnare a questa applicazione poteri speciali.

C’era una volta

Le tecnologie precedenti sono state:

(Un po` morti tutti quanti) (l’ultimo kernel Debian usabile con OpenVZ è un 2.6.32)

Nuova linfa

Dal tentativo di unificare l’interfaccia usata da questi progetti, sono stati creati dei servizi/strutture ad-hoc nel kernel. Sono:

Un nuovo range di tools si sviluppa da queste basi:

  • LXC: (primo commit nell’Agosto 2008-1.0 nel Febbraio 2014)
    • contributori: ~ 180;
    • commits: ~ 3.000;
  • Docker#: nato come componente di una piattaforma in competizione con Heroku (primo commit nel Febbraio 2013-1.0 nel Giugno 2014)
    • contributori: ~ 1.200;
    • commits: ~ 20.000;
  • LXD: ovvero LXC più user friendly e in mano a Canonical:
  • machinectl/systemd-nspawn;
  • OpenContainers/runc: runtime di Docker e specifice di immagine appc.

Alcune utility sono nate per ispezionare i processi che utilizzano queste “nuove” capacità del kernel:

lsns
rende possibile elencare i namespace attivi
nsenter
consente di eseguire un processo nello stesso namespace o gruppo di namespace di un altro processo

    nsenter -a -t <pid> ..,

Situazione del software (grossomodo)

Una volta:

  • LAMP;

Ora:

  • web frontend;
  • api-endpoint;
  • db
  • queue e jobs in background;

I sistemi applicativi ora sono molto più articolati ed eterogenei.

Molteplici e diverse soluzioni riguardo all’hardware

Docker si pone verso il software in modo simile alla situazione con le spedizioni in cui molte problematiche sono state risolte con l’adozione di un contenitore standard, il container.

La situazione del packaging

PIÙ GENERICO

  • vm;

  • immagine LXC;

  • pacchetto .deb/.rpm;

  • jar/pip/…

PIÙ SPECIFICO DELL’APPLICAZIONE