====== Ambienti isolati (container) con Docker ======
apt install docker.io
Al termine dell'installazione troviamo il demone **/usr/sbin/dockerd** in esecuzione. È possibile controllarlo con il servizio systemd **docker.service** e tramite il socket (sempre gestito da systemd) **docker.socket**.
Il demone gira con pieni permessi root, per comandare il demone si usa il socket di comunicazione **/run/docker.sock**, che nella installazione Debian appartiene al gruppo **docker**. Quindi un utente non privilegiato può comandare Docker semplicemente entrando a far parte del gruppo.
===== Hello World =====
Per provare il funzionamento nel repository ufficiale esiste l'//immagine// denominata **hello-world**; la si installa ed esegue da **utente root**:
docker run hello-world
Se l'immagine non esiste sull'host locale, questa viene cercata sul repository predefinito ed eventualmente scaricata.
Per vedere lo stato del demone:
docker info
Il numero di **container** si incrementa ad ogni esecuzione di **docker run**, anche se si esegue la stessa immagine. Il numero delle **immagini** invece si incrementa solo quando si esegue il run (oppure il **pull**, vedi avanti) di una nuova immagine.
Supponiamo di voler cercare nel ropository una implementazione del server [[https://github.com/element-hq/synapse|
Element Synapse - Matrix]]:
docker search synapse
Avendo individuato l'immagine che interessa (**matrixdotorg/synapse**), è possibile scaricarla in locale con **docker pull**:
docker pull matrixdotorg/synapse
Using default tag: latest
latest: Pulling from matrixdotorg/synapse
38513bd72563: Pull complete
89fe90952b6b: Pull complete
0ee66acd8266: Pull complete
303fe1bfb649: Pull complete
2e812a1f3647: Pull complete
5fde11fa162a: Pull complete
6a4278efc748: Pull complete
d454d1179d11: Pull complete
8c8104b4f93d: Pull complete
e3b5dc22794f: Pull complete
Digest: sha256:0887ad7a662f08908ab03c2dc46c66ef2c796eff65fd39dbb0ec4f39f852a826
Status: Downloaded newer image for matrixdotorg/synapse:latest
docker.io/matrixdotorg/synapse:latest
FIXME Verificare se l'immagine viene da [[https://hub.docker.com]].
===== Backup di una immagine =====
Dopo aver fatto il pull può essere desiderabile fare un archivio di tutto il software, per eventuali restore futuri. Si verifica quali immagini sono state scaricate:
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
metabase/metabase latest 9b711a0c3625 10 hours ago 966MB
Quindi si esegue il backup in un file tar:
docker save -o backup_applicazione_.tar
Conviene includere l'IMAGE_ID perché quello identifica l'immagine stessa piuttosto che il nome. Infatti durante il restore una eventuale immagine con lo stesso ID viene sovrascritta. Il restore del file archivio si fa con:
docker load -i backup_applicazione_.tar
Se in Docker abbiamo una immagine con lo stesso nome (ma ID diverso, ad esempio a seguito di un aggiornamento che poi si è corrotto) è possibile cambiarle di nome prima di fare il restore della vecchia immagine:
docker tag nome_applicazione:corrotta
===== Gestione delle immagini e dei container =====
docker images
docker ps -a
docker start b629dea65cc0
docker stop angry_archimedes
docker rm 144443902b95
docker rm agitated_darwin
# Avvia l'immagine automaticamente al boot:
docker update --restart unless-stopped 144443902b95
Ogni container viene identificato da un ID numerico oppure da un codice mnemonico formato da due parole casuali.
===== Esempio di esecuzione di un container =====
Proviamo ad eseguire un'istanza di [[https://hub.docker.com/r/matrixdotorg/synapse|Matrix Synapse]], si tratta di un servizio abbastanza complesso che richiede le seguenti risorse:
* Un **file di configurazione**.
* Un **database** di backend, SQLite oppure PostgreSQL.
* Una **porta TCP** su cui porsi in ascolto.
docker run matrixdotorg/synapse
Viene visualizzato il messaggio:
Config file '/data/homeserver.yaml' does not exist. You should either create a new config
file by running with the `generate` argument (and then edit the resulting file before
restarting) or specify the path to an existing config file with the SYNAPSE_CONFIG_PATH
variable.
Leggendo la [[https://hub.docker.com/r/matrixdotorg/synapse|documentazione]] si scopre che il container va creato con il parametro **generate**. È necessario inoltre definire alcune variabili d'ambiente con l'opzione **%%-e%%**, collegare un mount del filesystem al container con l'opzione **%%--mount%%**. Le opzioni **%%-it%%** servono a tenere lo STDIN collegato allocando uno pseudo-TTY. L'opzione **%%--rm%%** rimuove automaticamente il container al momento dell'uscita.
docker run -it --rm \
--mount type=volume,src=synapse-data,dst=/data \
-e SYNAPSE_SERVER_NAME=my.matrix.host \
-e SYNAPSE_REPORT_STATS=yes \
matrixdotorg/synapse:latest generate
===== Risorse impegnate sull'host locale =====
^ /var/lib/docker/containers/ | Viene crata una sottodirectory per ogni container creato. |
FIXME
===== Trovare le immagini ufficiali di un progetto =====
FIXME
===== Aggiornamento di un container =====
FIXME
===== Risorse web =====
* **[[https://www.digitalocean.com/community/tutorials/how-to-install-and-use-docker-on-debian-10|How To Install and Use Docker on Debian 10]]**