Docker fornisce strumenti per collegare i filesystem dei contenitori e il sistema operativo host che esegue il contenitore, come i montaggi di collegamento e i volumi. Questi possono essere molto utili sia negli ambienti di sviluppo che di produzione.
Perché Mount From The Host?
In genere, con Docker, vorresti che le immagini venissero eseguite indipendentemente dal sistema host. Ad esempio, se desideri aggiornare il codice di un'app o i file di configurazione, probabilmente vorrai creare una nuova versione del contenitore e ridistribuirla. Ciò ti consente di ridimensionare e spostare rapidamente le immagini senza preoccuparti dell'hardware su cui funzionano.
Tuttavia, in un ambiente di sviluppo, essere in grado di montare direttamente una directory per abilitare il ricaricamento a caldo della configurazione o del codice può essere molto utile. Ad esempio, potresti lavorare su un file JS o su un plug-in PHP che puoi semplicemente trascinare e rilasciare nel contenitore. Oppure potresti voler montare un'intera directory di configurazione NGINX per funzionare sul tuo sito web. Qualunque sia il tuo caso d'uso, montare i file non è una cattiva soluzione.
È utile anche in produzione, se disponi di servizi host che dipendono dai file nei contenitori. Ad esempio, potresti disporre di un servizio di acquisizione e aggregazione dei registri che preferirebbe se i file di registro del contenitore si trovassero in una directory accessibile dall'host. Sebbene ci siano probabilmente alcune soluzioni integrate in Docker ai tuoi problemi, a volte è più semplice montare un volume.
Compatibilità con macOS
Nota:poiché i montaggi vengono gestiti tramite l'API Docker, funzioneranno indipendentemente dal sistema operativo host. Tuttavia, macOS ha protezioni aggiuntive e i montaggi al di fuori di alcune directory host potrebbero non riuscire con "montaggi negati" in fase di esecuzione. Ciò include /Users
, che copre la maggior parte delle operazioni, ma se necessario puoi risolvere il problema nelle impostazioni Docker in Preferenze> Risorse> Condivisione file aggiungendo la directory di destinazione all'elenco.
Montaggio di una directory host
La creazione di un montaggio vincolante è piuttosto semplice. Aggiungilo con il --mount type=bind
flag all'avvio, specificando una directory di origine e di destinazione su cui eseguire il montaggio.
docker run -d -it --name container --mount type=bind,source=/nginxconfig,target=/etc/nginx nginx:latest
I montaggi vincolati sono i più semplici, ma Docker fornisce l'API del volume per gestire un po' meglio questo tipo di montaggi. I dati archiviati saranno gestiti da Docker e la directory del volume verrà creata automaticamente nella directory di Docker. Questo potrebbe non essere quello che vuoi se hai in mente una directory esistente, ma questo metodo è migliore poiché non dipende dalla struttura dei file del sistema operativo host.
docker volume create nginx-config docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx nginx:latest
Puoi anche utilizzare Docker Compose per definire i volumi:
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-config:/etc/nginx/ volumes: nginx-config:
Questi sono archiviati in un formato standard accessibile a Linux:
/var/lib/docker/volumes/volumeID/_data
Tuttavia, su macOS, dovrai connetterti alla macchina virtuale Docker per poter visualizzare i volumi.
RELAZIONATO: Cosa sono i volumi Docker e come li usi?
Montaggio di singoli file
Il montaggio di intere directory funziona bene quando si desidera modificare molti file di configurazione/codice archiviati sull'host. Tuttavia, a volte potresti voler montare un singolo file da modificare, senza toccare gli altri file.
Per fare ciò, puoi eseguire il contenitore con un montaggio bind, che supporta i singoli file se specifichi il percorso:
docker run -it --mount type=bind,source=/path/file.cfg,target=/etc/example/file.cfg nginx sh
Se hai molti file da montare in questo modo, puoi inserirli tutti nella stessa directory host e montare quella directory in una posizione diversa nel contenitore. È quindi possibile utilizzare i collegamenti simbolici all'interno del contenitore per collegare i file nella directory montata alla posizione corretta.