====== 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]]**