Docker e podman: container facili

Docker su RHL non è piu supportato. Esiste Podman

Podman, sempre di Red Hat, è considerato il diretto successore e, facendo a meno di un demone centrale e dei privilegi di root, è in grado di allontanare molte preoccupazioni sulla sicurezza del suo predecessore. Per il resto, i due strumenti sono simili, anche se Podman deve ancora fare i conti con alcuni bug.

Con questa linea guida provo a configurare docker per essere utilizzato su una macchina virtuale. Una risorsa interessante con buona documentazione è Rootless Container

podman docker container

Installiamo

Prima installazioze quella di Docker. Installando docker viene installao Podman. Possiamo seguire la guida di oracle per l’installazione

Con o senza: cgroups V2 vs tmpfs

Per capire cosa sono iniziamo a leggere l’articolo Introduzione ai cgroups, perchè è importante capire quale metodo viene utilizzato sulla macchina scelta. Infatti una nota di RH dice che “Rootless podman user cannot run…” e quindi a differenza di come si gestisce in caso di non utilizzo dei Cgroup, se questi sono abilitati ed il container lo richiede perchè ha dei processi amministrativi, dobbiamo eseguire l’installazione come root. L’articolo rootless Podman di Matthew Heon lo spiega in maniera esaustiva.

L’errore

Lanciando una pull da utente normale si ottiene il seguente errore

Error: copying system image from manifest list: writing blob: adding layer with blob "sha256:faef57eae888cbe4a5613eca6741b5e48d768b83f6088858aee9a5a2834f8151": processing tar file(potentially insufficient UIDs or GIDs available in user namespace (requested 0:42 for /etc/gshadow): Check /etc/subuid and /etc/subgid if configured locally and run podman-system-migrate: lchown /etc/gshadow: invalid argument): exit status 1

e la soluzione

Alla fine ho eseguito due passaggi ed il risultato è andato a buon fine. Non so, se sarebbe bastato il secondo passaggio.

  1. Ho inserito all’interno dei file subuid e subgid una linea relativa al mio utente, con i valori come i seguenti in base all’id. Apro quindi il file e con VI inserisco i valori.
    vi /etc/subuid ##Sono in VI sysdatadmin:100000:65536 sysdat:165536:65536 casalegno:122720:65536
    solo con questo passaggio il pull dava comunque errore.
  2. Ho quindi ho lanciato il comando di migrazione ed ho testato il pull con Alpine
    
    podman system migrate
    podman pull alpine
    
    a questo punto il pull ha fatto il suo lavoro.

I Croups semplicemente servono a gestire le risorse della macchina (CPU, memoria, network I/O, disk I/O, ecc) e a profilare la loro allocazione ai processi in esecuzione. Per visionare quale tipologia di Cgroups è attivo posso scoprirlo lanciando il comando

stat -c %T -f /sys/fs/cgroup

Controllare i container

podman structure docker

Per controllare quali container sono in esecuzione, possiamo utilizzare il seguente comando

docker container list
docker ps

Stoppare un container

Per fermare un container usiamo il comando stop per eliminarlo il comando rm

podman container stop <name/id>
podman rm <name/id>

Controlliamo il log per vedere gli errori

Per controllare gli errori, Podman contiene un comando interno che permette di vedere i singoli errori direttamente da ogni container:

podman logs <container>

Modifichiamo un file su un container.

All’interno di un docker, difficilmente troviamo un editor di testo per poter modificare dei file di configurazione. Se dobbiamo farlo, abbiamo due strade da seguire: diventare root ed installare l’editor, esportare il file modificarlo e reimportalo.

Accediamo alla bash come root

Se il container è in esecuzione, possiamo accedere alla bash del container come utente di applicazione. Possiamo pero farlo anche come utente amministratore. Nel secondo caso abbiamo tutti i diritti per fare qualsiasi operazione.

podman exec -it <containerID> bash
podman exec -u 0 -it <containerID> bash ##con l'opzione -u 0 accediamo come root

Import/export del file

Per non alterare il peso e le caratteristiche del container, possiamo scaricare, modificare e ricaricare il file cui siamo interessati. Per copiare il file dal container alla posizione in cui siamo

podman container cp <containerId>:/etc/mysql/my.cnf container-my.cnf

Una volta modificato il file, possiamo ricopiarlo nella cartella del container

podman container cp container-my.cnf <containerId>ysl:/etc/mysql/my.cnf

Aprima una porta dal container all’host

Quando creo un container, se sulla stessa macchina girano piu container, devo cambiare la porta di connessione cosi da poter accedere esattamente a quel container. Per farlo devo dichiarare la porta alla quale il client fa riferimento (ex 10000) e la porta che il server si aspetta (ex 3306):

podman create .... -p 10000:3306

Se SELinux è disabilitato non ci sono blocchi per arrivare alla macchina

Creiamo un commit

Creare un commit significa creare una immagine del contenitore che indichiamo, da poterla cosi utilizzare come base, per creare altri contenitori.

podman commit <containeresistente> <nuovaimage>

il riavvio di un container è identico all’avvio classico semplicemente c’è il cambio di immagine dalla quale partire.