Se devi copiare file dall'host Docker al tuo container Docker, questo tutorial fa per te.
In questo tutorial imparerai a copiare file dall'host Docker a un container Docker utilizzando vari approcci.
Andiamo al punto!
Prerequisiti
Se desideri seguire passo dopo passo, assicurati di avere quanto segue:
- Un host Linux. Questo tutorial utilizza Ubuntu 18.04.5 LTS.
- Docker installato sull'host Linux. Questo tutorial utilizza Docker v19.03.11. Puoi confermare la tua versione Docker eseguendo
docker version
.
- Qualsiasi immagine Docker scaricata e disponibile. Questo tutorial utilizza l'ultima immagine Docker NGINX disponibile su Docker Hub.
Copiare file con docker cp
Comando
Per iniziare questo tutorial, imparerai a copiare i file dall'host Docker ai contenitori usando il docker cp
comando. Il docker cp
comando copia file o cartelle tra un contenitore e il filesystem locale del tuo host Docker e viceversa.
Impariamo come utilizzare il comando Docker cp con un esempio.
1. Apri un terminale sul tuo computer locale.
2. Crea un file chiamato miofile.txt utilizzando il touch
comando. Il miofile.txt verrà copiato dall'host Docker al contenitore.
touch myfile.txt
3. Esegui docker run
comando. L'esecuzione della finestra mobile sottostante creerà un nuovo contenitore in background. Il comando seguente contiene tre parametri descritti di seguito:
d
flag che esegue il contenitore in background e lo mantiene attivo fino all'eliminazione.p
flag pubblica la porta di un container80
all'host sulla porta80
.nginx
sarà l'immagine che verrà utilizzata per eseguire il contenitore.
sudo docker run -d -p 80:80 nginx
4. Verifica se il contenitore Docker è stato creato correttamente utilizzando docker ps
comando. Dopo aver eseguito il docker ps
comando, dovresti vedere un nuovo valore generato sotto l'attributo CONTAINER ID (Nel caso seguente ccae4670f030
) utilizzando l'immagine NGINX che conferma che il contenitore è stato creato correttamente.
sudo docker ps
Prima di eseguire il comando Docker cp, la sintassi del comando Docker cp è:
CONTAINER: SRC_PATH
specifica il percorso di origine del contenitore.DEST_PATH
è il percorso di destinazione sull'host.CONTAINER: DEST_PATH
è il percorso di destinazione sul contenitore.
Inoltre, puoi anche aggiungere le options
con i seguenti parametri nel comando come segue:
- Utilizzo di archivio o a:copia tutte le autorizzazioni utente e gruppo principale dei file e delle cartelle.
- Utilizzo di L:specificando l'opzione L, qualsiasi collegamento simbolico nel percorso di origine verrà copiato nel percorso di destinazione.
# Syntax to Copy from Container to Docker Host
docker cp {options} CONTAINER:SRC_PATH DEST_PATH
# Syntax to Copy from Docker Host to Container
docker cp {options} SRC_PATH CONTAINER:DEST_PATH
5. Quindi, esegui il docker cp
comando. Il docker cp
il comando copierà il miofile.txt che hai creato in precedenza nei contenitori /usr/share directory. ccae4670f030
è l'ID del contenitore in cui è myfile.txt verrà copiato.
sudo docker cp myfile.txt ccae4670f030:/usr/share
6. Infine, SSH nel contenitore in esecuzione eseguendo docker exec
comando con /bin/bash
, che viene utilizzata come shell predefinita per l'accesso utente del sistema Linux.
- Il
i
flag che indica che desideri aprire una sessione SSH interattiva nel contenitore. Ili
flag non chiude la sessione SSH anche se il contenitore non è collegato. - Il
t
flag alloca uno pseudo-TTY che può essere usato per eseguire comandi in modo interattivo.sudo docker exec -it ccae4670f030 /bin/bash
sudo docker exec -it ccae4670f030 /bin/bash
Di seguito vedrai che ora sei connesso alla shell del contenitore quando esegui docker exec
.
7. Dopo aver effettuato l'accesso al contenitore, verificare se myfile.txt è stato copiato nel contenitore utilizzando il comando ls.
ls
è un comando per elencare i file del computer nei sistemi operativi Unix e simili a Unix.grep
cercherà tutti i file o le cartelle, iniziando con la stringamy
all'interno di usr/share directory.
Copiare file utilizzando DockerFile
Nella sezione precedente, hai imparato come copiare i file nel contenitore eseguendo il comando Docker cp. Cosa succede se devi copiare più file in una volta sola? Certamente, eseguire più comandi diventa un sovraccarico! Per risolvere l'esecuzione di più comandi cp, perché non provare a copiare file o cartelle in contenitori utilizzando Dockerfile con COPY
comandi?
La distribuzione di un contenitore e la copia di file/cartelle utilizzando Dockerfile consente di rimuovere i passaggi di copia manuali eseguiti nella sezione precedente. Un Dockerfile è un documento di testo che contiene tutti i comandi che un utente può chiamare sulla riga di comando per assemblare un'immagine.
Creiamo un Dockerfile, eseguiamo un container da esso e infine copiamo i file.
1. Crea una cartella denominata ~/host-to-container-copy-demo, quindi cambia (cd
) la directory di lavoro in quella cartella. Questa cartella conterrà tutti i file che creerai in questa demo.
mkdir ~/host-to-container-copy-demo
cd ~/host-to-container-copy-demo
2. Ora, crea due file di testo denominati myfile1.tx t e miofile2.txt , copiali e incollali nei file e salvali nella ~/host-to-container-copy-demo directory.
# myfile1.txt
Hello This is my first file !
This is file will be copied in /usr/share directory from Docker host to Docker Container.
# myfile2.txt
Hello This is my second file !
This is file will be copied in /tmp directory from Docker host to Docker Container.
3. Crea un altro file, copia/incolla la configurazione seguente e salva il file come Dockerfile all'interno della ~/demo da host a copia-contenitore directory. Al termine, Docker utilizzerà questo DockerFile per eseguire tutti i comandi necessari per creare una nuova immagine Docker sopra qualsiasi immagine di base.
Il File Docker di seguito contiene vari passaggi/istruzioni che costruiranno il nuovo contenitore:
FROM
– L'istruzione FROM inizializza una nuova fase di compilazione e imposta l'immagine di base per le istruzioni successive.COPY
– Il comando COPY copia un file dalla macchina host (host Docker) al contenitore.
# Instruction for Dockerfile to create a new image on top of the base image (ubuntu)
# Using the base image ubuntu: latest
FROM ubuntu:latest
# Copying myfile1.txt to the containers /usr/share directory
COPY myfile1.txt /usr/share
# Copying myfile2.txt to the containers /tmp directory
COPY myfile2.txt /tmp
4. Verifica tutti i file richiesti per creare la nuova immagine eseguendo l'tree
comando. Dovresti vedere Dockerfile, miofile1.txt e miofile2.txt sotto la ~/demo da host a copia-contenitore directory.
5. Quindi, crea l'immagine eseguendo docker build
comando. Il t
flag viene utilizzato per taggare l'immagine updated_ubuntu_image
con l'latest
e.
consente a Docker di selezionare tutti i file necessari dalla directory di lavoro attuale.
sudo docker build -t updated_ubuntu_image:latest .
6. Ora verifica l'immagine appena creata updated_ubuntu_image
eseguendo le docker images
comando. Nota il REPOSITORY attributo. Questo attributo è il tag creato con -t
flag nel passaggio precedente.
sudo docker images
7. Infine, esegui il contenitore docker utilizzando l'immagine appena creata eseguendo docker run
comando. Il -it
flag indica a Docker di allocare uno pseudo-terminale connesso allo stdin del contenitore. bash
fornisce la shell predefinita per l'accesso utente del sistema Linux.
sudo docker run -it updated_ubuntu_image bash
Di seguito vedrai che ora sei nella shell Bash del contenitore Docker.
8. Successivamente, verifica se i file sono stati copiati correttamente sul contenitore nelle directory /tmp e /usr/share eseguendo ls
comando.
Montaggio di un volume di archiviazione e accesso ai file con il Docker Volume
Comando
Finora hai imparato a copiare i file dall'host al container utilizzando due diversi approcci usando il docker cp
comando e un DockerFile . Questa volta, impariamo come condividere facilmente i file system tra host e container utilizzando il docker volume
comando.
Supponendo che tu sia ancora connesso al terminale:
1. Crea un volume sull'host Docker eseguendo docker volume create
comando. Il comando seguente creerà un volume chiamato my-vol
. sudo docker volume create my-vol
sudo docker volume create my-vol
2. Verifica che il volume sia stato creato correttamente eseguendo docker volume ls
comando. Il comando docker volume ls elenca il volume. Dopo aver eseguito il docker volume ls
comando, vedrai my-vol
nell'attributo VOLUME NAME che conferma che il volume è stato creato correttamente.
sudo docker volume ls
3. Quindi, esegui il contenitore utilizzando docker run
comando.
- Il contenitore denominato
volume_testing
usanginx: latest
immagine. d
flag esegue il contenitore in background e lo mantiene attivo fino all'eliminazione.v
flag monta il volumemy-vol
creato sull'host Docker alla destinazione del contenitore/app
directory.
sudo docker run -d --name volume_testing -v my-vol:/app nginx:latest
4. Verifica se il volume my-vol che hai creato in precedenza è montato correttamente con il contenitore utilizzando il docker inspect
comando. Il comando Docker inspect fornisce le informazioni sul contenitore. Dopo aver eseguito il docker inspect
comando, visualizzerà tutti i dettagli del contenitore specificato (volume_testing
) dettagli, inclusi i dettagli di montaggio, come mostrato di seguito.
sudo docker inspect volume_testing
Di seguito, l'istantanea dell'immagine conferma che il volume (my-vol
) che hai creato sull'host è stato montato correttamente con il /app
del contenitore directory.
Conclusione
In questo tutorial, hai appreso diversi modi per copiare file o cartelle dall'host Docker ai contenitori, ad esempio utilizzando il comando Docker cp, i comandi del volume Docker e Dockerfile.
Quindi quale approccio utilizzerai successivamente durante la copia dei dati dall'host ai contenitori Docker?