In genere, con Docker, si desidera che le immagini vengano eseguite indipendentemente dal sistema host. Se desideri, ad esempio, aggiornare il codice di un'app o i file di configurazione, probabilmente vorrai creare una nuova versione del contenitore e ridistribuirla. Ciò consente di ridimensionare e spostare rapidamente le immagini senza preoccuparsi dell'hardware su cui vengono eseguite.
Tuttavia, in un ambiente di sviluppo, essere in grado di montare direttamente una directory per consentire il ricaricamento a caldo della configurazione o del codice può essere molto utile. Ad esempio, potresti lavorare su un file JS o un plug-in PHP che puoi semplicemente trascinare e rilasciare nel contenitore. Oppure potresti voler montare un'intera directory di configurazione NGINX per lavorare sul tuo sito web. Qualunque sia il tuo caso d'uso, il montaggio dei file non è una cattiva soluzione.
È anche utile in produzione, se si dispone di servizi host che dipendono da file nei contenitori. Ad esempio, potresti avere un servizio di acquisizione e aggregazione dei log che preferirebbe se i file di log del contenitore si trovassero in una directory accessibile dall'host. Sebbene ci siano probabilmente alcune soluzioni pure in-Docker ai tuoi problemi, a volte è più semplice montare un volume.
Nota: poiché i montaggi vengono gestiti tramite l'API Docker, funzioneranno indipendentemente dal sistema operativo host. Tuttavia, macOS ha protezioni extra 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 è possibile risolvere questo problema nelle impostazioni di Docker in Preferenze > Risorse > Condivisione file aggiungendo la directory di destinazione all'elenco.
La creazione di un montaggio di bind è piuttosto semplice. Aggiungilo con il --mount type=bind flag all'avvio, specificando una directory di origine e di destinazione su cui montare.
docker run -d \
-esso \
--name contenitore \
--mount type=bind,source=/nginxconfig,target=/etc/nginx \
nginx: più recente
I montaggi di associazione sono i più semplici, ma Docker fornisce l'API Volume per gestire un po' meglio questo tipo di montaggi. I dati archiviati verranno 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.
volume docker creare nginx-config
docker run -d \
--name devtest \
--mount source=nginx-config,target=/etc/nginx \
nginx: più recente
Puoi anche utilizzare Docker Compose per definire i volumi:
versione: "3.0"
Servizi:
ragnatela:
immagine: nginx:latest
porti:
- "80:80"
volumi:
- nginx-config:/etc/nginx/
volumi:
nginx-config:
Questi sono memorizzati in un formato standard accessibile a Linux:
/var/lib/docker/volumes/volumeID/_data
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 singoli file se specifichi il percorso:
docker esegui -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.