Docker Compose è un potente strumento di orchestrazione progettato per semplificare la gestione e la distribuzione di applicazioni multi-container utilizzando Docker. Il file docker-compose.yml semplifica la distribuzione definendo applicazioni complesse con più servizi, reti e volumi in un unico file. Uno degli aspetti essenziali del lavoro con Docker Compose è la gestione dei dati persistenti tramite i volumi.

Questo articolo analizza l’importanza dell’uso dei volumi in Docker Compose per la gestione dei dati persistenti e fornisce una guida pratica per un uso efficace dei volumi.

Cosa sono i volumi Docker?

I volumi Docker sono un componente cruciale dell’ecosistema che memorizza e gestisce i dati persistenti generati dai container effimeri. Consentono la persistenza dei dati anche dopo la rimozione o l’aggiornamento di un container, in modo che i dati essenziali dell’applicazione non vadano persi durante le operazioni di routine.

I volumi sono disaccoppiati dal file system del container, per cui è possibile eseguirne facilmente il backup, condividerli tra più container e migrarli tra gli host.

Un vantaggio fondamentale dell’uso dei volumi rispetto ai bind mount, che sono dei montaggi di directory dal sistema host a un container, è la portabilità. È possibile spostare rapidamente i volumi tra diversi host o container, mentre i bind mount devono essere collegati a una directory specifica sul sistema host.

Questa portabilità consente una gestione dei dati più flessibile ed efficiente nelle applicazioni basate su container. I volumi sono inoltre compatibili con diversi driver di archiviazione, consentendo di scegliere la soluzione di archiviazione migliore per il caso d’uso specifico.

Tipi di volumi Docker

I volumi Docker sono essenziali per la gestione dei dati nelle applicazioni basate su container. Sono disponibili in due tipi distinti: volumi denominati e volumi anonimi. Questa sezione approfondisce le differenze principali tra i due tipi e mostra come implementarli per gestire i dati nelle applicazioni.

I volumi denominati e anonimi hanno scopi diversi e offrono diverse capacità di controllo e gestione. Sebbene i volumi denominati siano generalmente preferiti per la maggior parte dei casi d’uso grazie ai loro identificatori leggibili dall’uomo e alla facilità di gestione, è essenziale capire come funzionano entrambi i tipi per massimizzarne i vantaggi.

Volumi denominati

I volumi denominati hanno un nome definito dall’utente che li rende facili da identificare, gestire e condividere tra più container. Docker crea e gestisce i volumi denominati e memorizza i loro dati in una posizione specifica sul sistema host. Questa posizione è in genere all’interno della directory di installazione di Docker con un ID univoco corrispondente al nome del volume.

I volumi denominati offrono un maggiore controllo e flessibilità, in quanto vi si può fare facilmente riferimento e manipolarli utilizzando il loro identificatore leggibile dall’uomo.

Per creare un volume denominato in Docker, basta eseguire:

docker volume create my_named_volume

Volumi anonimi

A differenza dei volumi denominati, i volumi anonimi non hanno un nome definito dall’utente. Invece, Docker li crea automaticamente quando si crea un container e assegna un ID univoco al volume.

In genere è più difficile gestire e archiviare i volumi perché non hanno un identificatore leggibile dall’uomo. Poiché Docker li crea automaticamente, è comune utilizzare volumi anonimi per l’archiviazione temporanea. Possono anche comparire se non si specifica un volume denominato quando si crea un container.

Per creare un container con un volume anonimo, basta eseguire:

docker run -v /data nginx

Questo comando monta un volume anonimo nella directory /data all’interno del container nginx. È possibile sostituire nginx con il nome del container in cui si sta montando il volume.

Come creare e gestire i volumi con Docker Compose

Docker Compose semplifica la creazione e la gestione dei volumi permettendo di definirli all’interno del file docker-compose.yml. Questo file contiene la configurazione dei servizi, delle reti e dei volumi dell’applicazione, consentendo una facile gestione delle risorse dell’applicazione in un unico posto.

1. Definire i volumi in Docker Compose

Per creare un volume denominato nel file docker-compose.yml, è necessario definire sotto la chiave volumes. Se necessario, è anche possibile specificare il driver del volume e le opzioni.

2. Montare i volumi sui container

Per collegare un volume a un container, usare la chiave volumes all’interno della definizione service nel file docker-compose.yml. Specificare il nome del volume seguito da due punti e il percorso del container in cui si vuole montare il volume.

È anche possibile condividere i volumi tra più contenitori utilizzando lo stesso nome di volume.

Ecco un esempio di creazione di volumi denominati web_data e db_data nel file docker-compose.yml:

version: '3.8'
services:
  web:
    image: nginx
    volumes:
      - web_data:/var/www/html
  web-test:
    image: nginx
    volumes:
      - web_data:/var/www/html # Web and web test share the web_data volume
  db:
    image: mysql
    volumes:
      - db_data:/var/lib/mysql
volumes:
  web_data:
  db_data:
    driver: local # Define the driver and options under the volume name
    driver_opts:
      type: none
      device: /data/db_data
      o: bind

Questo esempio definisce due volumi denominati. Poi monta i volumi nei rispettivi container in percorsi specifici. Quindi, monta il volume web_data nella directory /var/www/html del container web e il volume db_data nella directory /var/lib/mysql del container db.

I container web e web-test condividono il volume web_data, il che consente loro di accedere e modificare lo stesso volume di dati.

Definendo e gestendo i volumi all’interno del file docker-compose.yml, è possibile creare facilmente, aggiornare ed eliminare i volumi in base alle necessità, senza doverli gestire manualmente con i comandi di Docker. Questo processo semplificato permette di concentrarsi sullo sviluppo e sulla distribuzione dell’applicazione mentre Docker Compose si occupa della gestione delle risorse sottostanti.

Come lavorare con Docker Compose e i comandi di volume

Docker Compose fornisce diversi comandi che aiutano a gestire in modo efficace l’applicazione e le sue risorse. Vediamo nel dettaglio questi comandi e il loro rapporto con i volumi:

  • docker compose up crea e avvia l’applicazione, compresi i servizi, le reti e i volumi. Se si definisce un volume denominato nel file docker-compose.yml prima che esista, questo comando lo creerà automaticamente.
  • docker compose down arresta e rimuove i servizi e le reti dell’applicazione. Per impostazione predefinita, non rimuove i volumi denominati. Per rimuovere i volumi denominati, usare il flag --volumes o -v.
  • docker compose ps elenca i contenitori e il loro stato attuale, comprese le informazioni relative ai volumi.
  • docker compose config convalida e visualizza la configurazione effettiva generata dal file docker-compose.yml, comprese le definizioni dei volumi.

Elencare i volumi

Per elencare tutti i volumi, usare ls:

docker volume ls

L’output mostra tutti i volumi denominati, compresi quelli creati da Docker Compose.

Ispezionare i volumi

Per visualizzare i dettagli di un volume specifico, usare inspect. L’output mostra le informazioni sul volume, come il nome, il driver, il punto di montaggio e le opzioni:

docker volume inspect db_data

I dettagli del volume sono forniti in formato JSON. Ad esempio, considerando il file docker-compose.yml fornito in precedenza, questo è l’output restituito:

[
    {
        "CreatedAt": "some-date-here",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/path/on/host/where/volume/is/mounted",
        "Name": "db_data",
        "Options": {
            "device": "/data/db_data",
            "o": "bind",
            "type": "none"
        },
        "Scope": "local",
        "Status": {
            "Mounts": [
                ...
            ]
        }
    }
]

Rimuovere un volume Docker per nome

Per rimuovere un volume Docker, si può usare docker volume rm seguito dal nome del volume:

docker volume rm volume-name

Pulire i volumi inutilizzati

Per rimuovere i volumi inutilizzati, usare prune:

docker volume prune

Questo comando aiuta a ripulire l’ambiente di sviluppo e a recuperare spazio di archiviazione. Rimuove tutti i volumi inutilizzati non associati ai container, compresi quelli creati da Docker Compose.

Sfruttando questi comandi e le loro funzioni relative ai volumi, è possibile gestire in modo efficace le risorse dell’applicazione, garantendo prestazioni ottimali e un uso efficiente dello spazio di archiviazione.

Versioni di Docker Compose

A partire da luglio 2023, Docker Compose V1 ha smesso di ricevere aggiornamenti. Inoltre non è più disponibile nelle nuove versioni di Docker Desktop. Tuttavia, Docker Desktop continua a supportare un alias docker-compose per reindirizzare i comandi a docker compose per comodità e per migliorare la compatibilità con strumenti e script di terze parti.

Per cambiare il codice esistente da Docker Compose versione 1 a 2, basta sostituire il trattino con uno spazio. Ad esempio, docker-compose up diventa docker compose up.

Con la versione 2, si può utilizzare il comando &compose direttamente nell’interfaccia a riga di comando (CLI) di Docker, cambiare il contesto di Docker per creare un container su un servizio cloud e utilizzare Amazon ECS e Microsoft ACI.

Riepilogo

Questo articolo ha evidenziato l’importanza dell’uso dei volumi con Docker Compose per la gestione dei dati persistenti. I volumi sono un componente cruciale dell’ecosistema Docker, che permette di archiviare e gestire i dati generati dai container Docker. Con i volumi Docker, i dati importanti delle applicazioni persistono anche dopo l’eliminazione o l’aggiornamento di un container, contribuendo a mantenere l’integrità e la coerenza dell’applicazione.

Docker Compose offre un approccio semplificato alla creazione e alla gestione dei volumi all’interno del file docker-compose.yml. Questo metodo semplifica il processo di sviluppo e garantisce un uso efficiente delle risorse.

L’uso dei volumi rende inoltre lo sviluppo flessibile ed efficiente: Docker Compose fornisce vari comandi relativi ai volumi per aiutare a controllare le risorse dell’applicazione in modo efficace. L’utilizzo di questi comandi permette di creare, ispezionare e ripulire facilmente i volumi.

Scegliendo Kinsta come host per la propria applicazione, si ha a disposizione un’infrastruttura veloce, sicura e affidabile, con i progetti distribuiti sulla rete Premium Tier e sulle macchine C2 di Google Cloud Platform. Inoltre, si può scegliere tra 37 data center un CDN abilitato HTTP/3 con 260+ PoPs.

Restate al sicuro con la tecnologia dei container isolati, due firewall potenti e una protezione DDoS avanzata alimentata da Cloudflare. Potete anche integrare app o automatizzare i vostri workflow con l’API di Kinsta e distribuirli con Docker.

Kinsta offre risorse e contenuti di alta qualità per gli sviluppatori web, tra cui tutorial e guide approfondite per vari linguaggi e strumenti come Docker Compose. Date un’occhiata ai nostri contenuti specifici per Docker sul blog di Kinsta per saperne di più su Docker.

Marcia Ramos Kinsta

I'm the Editorial Team Lead at Kinsta. I'm a open source enthusiast and I love coding. With more than 7 years of technical writing and editing for the tech industry, I love collaborating with people to create clear and concise pieces of content and improve workflows.