No tienes acceso a esta clase

隆Contin煤a aprendiendo! 脷nete y comienza a potenciar tu carrera

Curso de Docker

Curso de Docker

Guido Vilari帽o

Guido Vilari帽o

Insertar y extraer archivos de un contenedor

15/32
Recursos

Aportes 50

Preguntas 14

Ordenar por:

驴Quieres ver m谩s aportes, preguntas y respuestas de la comunidad?

o inicia sesi贸n.

En cortas palabras:

Host: Donde Docker esta instalado.
Bind Mount: Guarda los archivos en la maquina local persistiendo y visualizando estos datos (No seguro).
Volume: Guarda los archivos en el area de Docker donde Docker los administra (Seguro).
TMPFS Mount: Guarda los archivos temporalmente y persiste los datos en la memoria del contenedor, cuando muera sus datos mueren con el contenedor.

Comandos:

$ touch prueba.txt (creo un archivo en mi m谩quina)
$ docker run -d --name copytest ubuntu tail -f /dev/null (corron un ubuntu y le agrego el tail para que quede activo)
$ docker exec -it copytest bash (entro al contenedor)
$ mkdir testing (creo un directorio en el contenedor)
$ docker cp prueba.txt copytest:/testing/test.txt (copio el archivo dentro del contenedor)
$ docker cp copytest:/testing localtesting (copio el directorio de un contenedor a mi m谩quina)
con 鈥渄ocker cp鈥 no hace falta que el contenedor est茅 corriendo

Acerca de el comando tail

Por default, 茅ste comando imprime las 煤ltimas 10 l铆neas de un archivo en el sistema operativo GNU/Linux y luego termina.
al pasarle -f, indicamos que se 鈥渧igilen鈥 los cambios en el archivo que le pasemos.

Acerca de /dev/null

Se le conoce como una 鈥渃aja negra鈥 que no contiene ni hace nada.
para entender mejor el uso de 茅ste fichero podemos analizar los siguientes casos:
Si ejecutamos el comando

cat /dev/null

No se producir谩 salida o mensaje

Por lo cual es normalmente utilizado para recibir archivos basura (descartables), o para vaciar archivos mediante redirecci贸n:

ls > /dev/null

Manda la lista de archivos de ls a el archivo /dev/null, con lo cual dicha lista desaparece.

Si ejecutamos la siguiente orden:

cat /dev/null  > Archivo.Awk

Estar铆amos borrando el contenido de Archivo.Awk, es decir, dej谩ndolo vac铆o.

Como nota final, cabe aclarar que no es posible copiar o mover archivos hacia /dev/null

Pr谩ctica realizada:

Para crear un archivo en mi m谩quina:

touch prueba.txt

Crear un contenedor llamado copytest, que corra ubuntu e iniciar un proceso que se mantenga activo:

docker run -d --name copytest ubuntu tail -f /dev/null

Iniciar una conexi贸n de terminal con el contenedor que est谩 corriendo ubuntu

docker exec -it copytest bash

Creamos un directorio llamado testing en el contenedor de ubuntu

mkdir testing

Comando docker para copiar un fichero o un directorio desde la m谩quina anfitri贸n hacia el contenedor, copytest es el nombre del contenedor hacia el cual queremos copiar el archivo

docker cp prueba.txt copytest:/testing/test.txt

Comando para ejecutar la acci贸n inversa, es decir, copiar fichero o directorio desde el contenedor hacia la m谩quina anfitri贸n.
donde localtesting ser谩 el nombre de un nuevo directorio que se crear谩 en la m谩quina anfitri贸n dentro del directorio en el que nos encontremos al momento de haber ejecutado el siguiente comando:

docker cp copytest:/testing localtesting 

Nota: utilizando docker cp, no es necesario que el contenedor est茅 corriendo

Comandos de la clase

Por si a alguien le pico la curiosidad, no se permite copiar entre contenedores鈥 sale como mensaje

copying between containers is not supported

15. Insertar y extraer archivos de un contenedor
Existen dos formas de manejar datos con docker, un m茅todo es bind mount y otro es volumen (volume), el primero consiste en compartir un directorio de la m谩quina host con el contenedor y el segundo es m谩s pr谩ctico consiste en crear un Volume y este 煤ltimo tiene un problema que los archivos son visibles por el contenedor y por otro volumen y no por nosotros.
Lo siguiente que vamos a ver es que independientemente de que usemos un m茅todo u otros podremos introducir archivos o sacar archivos. Es importante resaltar que no es necesario que el contenedor este encendido cuando se intenta introducir o sacar archivos del contenedor

Pasos para copiar un archivo de la m谩quina host al contenedor

  1. Crear un archivo para realizar prueba de copia
  2. Comprobar que el archivo existe y ver que no tiene nada de contenido
  3. Crear un contenedor basado en la imagen de ubuntu e iniciar este contenedor con un proceso NoOps
  4. Verificar que el contenedor est茅 corriendo o activo.
  5. Entrar al bash del contenedor
  6. Crear una carpeta y comprobar que el directorio fue creado. Este directorio dentro del contenedor alojar谩 el archivo prueba.
  7. Salir del contenedor
  8. Copiar el archivo local (host) al contenedor. se puede apreciar que a parte de copiar se est谩 cambiado el nombre del archivo.
  9. Entrar al bash del contenedor
  10. Entrar al directorio donde se copi贸 el archivo y comprobar 11. que existe all铆
  11. Salir del contenedor

Ejecuci贸n de los pasos para copiar un archivo de la m谩quina host al contenedor

  1. $ touch prueba.txt
  2. $ cat prueba.txt
  3. $ sudo docker run -d --name copytest ubuntu tail -f /dev/null
  4. $ sudo docker ps
  5. $ sudo docker exec -it copytest bash
  6. $ mkdir testing && ll
  7. $ exit
  8. $ sudo docker cp prueba.txt copytest:/testing/test.txt
    9.$ sudo docker exec -it copytest bash
  9. $ cd testing && ll
  10. $ exit.

Pasos para copiar un archivo del contenedor al host

  1. Comprobar que el contenedor existe, no importa si est谩 encendido o apagado, ya que el proceso se ejecutar谩 igual
  2. Copiar el archivo/carpeta del contenedor al local (host), como se puede ver tambi茅n se est谩 cambiando el nombre de la carpeta al mismo tiempo que se copia
  3. verificar que el archivo existe

Ejecuci贸n de los pasos para copiar un archivo del contenedor a la m谩quina host
$ sudo docker ps -a
$ sudo docker cp copytest:/testing local-testing
$ ll

Explicaci贸n de la extracci贸n o introducir de datos a un contenedor


Introducir archivos

sudo docker cp <path/nombre-archivo> <nombre Contenedor>:<path/nombre-archivo>


extraer archivos
sudo docker cp <nombre Contenedor>:<path/nombre-archivo> <path/nombre-archivo>

flag

cp :
Instrucci贸n para Copiar

Par谩metros

<nombre Contenedor>: 
	Nombre del contenedor 
<path/nombre-archivo>
	Directorio del archivo y ubicaci贸n del archivo

Si no les funciona

docker run -d --name copytest ubuntu tail -f /dev/null

Pruebe con

docker run -d --name copytest ubuntu tail -f //dev/null

Y si tampoco les funciona

docker cp prueba.txt copytest://testing/test.txt

Pruebe con

docker cp prueba.txt copytest://testing/

Por lo que entend铆 con tmpfs los datos se pierden al borrar el contenedor de igual manera que si no se lo usara, entonces por que usar tmpfs mount?

Para crear un nuevo archivo en blanco sobre Windows 10, ejecute el siguiente comando.
El archivo puede ser de cualquier extensi贸n.

fsutil file createnew prueba.txt 0

Exercise insert and extract files from a container
Start the practice creating a new text file in a directory. Then:

$ docker run -d --name [custom_name] ubuntu tail -f /dev/null

<h1>To run a ubuntu container in the background mode</h1>

$ docker exec -it [custom_name] bash

<h1>To enter to copytest bash</h1>

In the ubuntu container鈥檚 directory create a new directory called testing.

$ docker cp [file_name] [container_custom_name]:[directory]
$ docker cp test.txt copytest:/testing/prueba.txt

<h1>To copy a file from a directory int our machine to a container</h1>

$ docker cp [container_custom_name]:[directory] [new_name_directory]
$ docker cp copytest:/testing localtesting

<h1>To copy a complete directory from the container to our local machine</h1>

鈥 Creamos un archivo de prueba para copiarla en el contenedor

touch prueba.txt
docker run -d --name copytest ubuntu tail -f /dev/null
docker exec -it copytest bash
# mkdir testing
# exit
docker cp prueba.txt copytest:/testing/test.txt
docker exec -it copytest bash
# cd testing
# ll
# exit

鈥 Ahora vamos a extraer la carpeta testing de nuestro contenedor a nuestro host

docker cp copytest:/testing localtesting
ll

Hola!!
Un dato extra:
probando utilizar cp en un contenedor detenido (Exited) me di cuenta que debemos primero detener el contenedor con:

docker stop copytest

se hacen las operaciones de copia desde y hacia nuestra maquina:

docker cp prueba.txt copytest:/home/testing
docker cp copytest:/home/testing .

Luego se vuelve a arrancar el contenedor (no se menciona en la clase) que estaba en estado Exited con:

docker start copytest

y voil谩鈥sta todo dentro del contenedor.

al principio pense que se podia volver a arrancar con el comando

docker run -d --name copytest ubuntu tail -f /dev/null

pero de esa forma Docker devuelve el mensaje:
"You have to remove (or rename) that container to be able to reuse that name", pero asi se pierde toda la data guardada鈥
Saludos 鈥 Y espero sea de utilidad, para otro novato como yo!!!

Esta parte de docker y como trabaja con los archivos es algo que nunca me termina de quedar claro, luego de estos videos quedo clarisimo!

  • Las tres formas de persistencia de datos en docker son blind mount, volume y tmpfs mount.
  • volume, son administrados por docker, se encuentran en /var/lib/docker/volumes/ en linux, S贸lo los procesos de docker deber铆a de poder modificar esta parte del filesystem.
  • blind mount, Son almacenados en cualquier lugar del sistema y los cualquier proceso puede tener acceso para realizar modificaciones.
  • tmpfs mount, son guardados en la memoria del sistema. Usados para guardar los datos durante la vida del contenedor.

Genial como avanzamos en este curso.

este metodo cp me remonta al deploy鈥 cuando en un droplet tengo que usar un git clone鈥 馃槂

Cree m煤tiple archivos de esta manera:

touch {0001..0012}.txt

En mi caso para mantener el conteiner corriendo us茅:

docker run -d -it --name copytest ubuntu tail

Comandos vistos en clase

Copiar informaci贸n

Local > Docker

docker cp <local_file> <container_name>:<container_path>

Ejemplo

docker cp test.txt copyTest:/testing/test.txt

Docker > Local

docker cp <container_name>:<container_file_path> <local_path>

Ejemplo

docker cp copyTest:/testing localTesting

As simple as This:

  1. Bind mound : Los datos viven en disco y en el container.
  2. Volume : Los datos viven en disco pero solo pueden ser accedidos por docker
  3. Tmpfs mount : Los datos viven en el container.
    y Recordar: Lo que est谩 en el container se muere con el :p

Arranca un contenedor desde afuera
$ docker run -d --name micontenedor ubuntu tail -f /dev/null
Entrar al contenedor de ubuntu creado
$ docker exec -it micontenedor

Ojo que el contenido de los vol煤menes 鈥渁ministrados por Docker鈥 s铆 se puede acceder desde fuera鈥 Simplemente hay que hacer docker volume inspect VOLUME_NAME, ah铆 aparecer谩 el 鈥淢ountpoint鈥 del volumen (path en el disco local), y si nos dirigimos all铆 (con usuario administrador o sudo en sistemas UNIX) podremos ver todo el contenido y gestionarlo.

consulta amigos鈥 si quisiera trabajar con un 2 disco duro: local o en nube, basicamente lo que te tendria es que: moverme a ese disco duro y apartir de alli crear el bind mount, y en el caso de volumenes hay forma de decirle que cree el volume en ese 2 disco duro ? saludos.

El tmpfs mount funciona como un tipo de memoria de acceso aleatorio mientras dura la sesi贸n del contenedor.

Excelente 馃槂 muchas gracias!

Para m谩s detalle del comando docker cp se puede ver la documentaci贸n: 鈥https://docs.docker.com/engine/reference/commandline/cp/

buenisimo

Insertar y extraer archivos de un contenedor

Podemos copiar archivos de nuestra computadora hacia un contenedor.

Creamos un archivo 鈥榩rueba.txt鈥.

Creamos un contenedor de ubuntu:

sudo docker run -d --name copytest ubuntu tail -f /dev/null

Entramos a ubuntu:

sudo docker exec -it copytest bash y creamos una carpeta donde vivir谩 el nuevo archivo: mkdir testing y salimos de ubuntu con exit

Copiamos y pegamos el archivo:

sudo docker cp prueba.txt copytest:/testing/test.txt

Tambi茅n podemos hacerlo a la inversa, copiando el contenido del contenedor a nuestra computadora:

sudo docker cp copytest:/testing localtesting

Nota: no es necesario que el contenedor est茅 corriendo para ejecutar la instrucci贸n docker cp

Excelente y muy bien explicado, gracias man!

copiar archivos o directorios desde fuera hacia dentro de un contenedor y viceversa

para los que al hacer el ejercisio de copiar local al contenedor y este se copia a la rama principal , y no a la carpeta testing tienen que escribirlo de la siguiente manera:
docker cp prueba.txt copytest:\testing\test.txt

esta solucion es para win 10 usando bash

Resulta que el comando 鈥渄ocker cp鈥 se ejecuta en el ambito del sistema linux WSL2 y no es capas de interpretar las rutas del sistema anfitri贸n windows; por suerte linux WSL2 ya monta por defecto nuestras unidades de almacenamiento en su sistema de ficheros. en mi caso intentaba copiar un archivo html desde windows hacia un contenedor de apache

entonces el comando:

docker cp C:\workspace\index.html apache-container:/usr/local/apache2/htdos/index.html

en realidar se escribe:

docker cp "/mnt/c/workspace/index.html" apache-container:/usr/local/apache2htdos/index.html

Se entiende que nuestra unidad de almacenamiento 鈥淐鈥 se encuentra montada en la ruta 鈥/mnt/c鈥 del sistema lunux WSL2 que hemos instalado y sobre el cual corre Docker

Bind mounts y volumenes no son la unica forma de mover archivos desde y hacia el contenedor, es posible copiar archivos de un lugar a otro con el comando docker cp, ejemplos:

  • Mover un archivo dentro del contenedor
docker cp <path/al/archivo/en/host> <container-name>:<path/dentro/del/contenedor> 
  • Extraer un archivo fuera del contenedor
docker cp <container-name>:<path/dentro/del/contenedor> <path/al/archivo/en/host>

super !

Crear un archivo dentro del directorio local

touch prueba.txt

Correr un nuevo Contenedor que se mantenga activo

docker run -d --name copytest ubuntu tail -f /dev/null

Creamos un nuevo directorio

mkdir testing

Copiamos el archivo desde afuera al nuevo directorio

dockerdata>docker cp prueba.txt copytest:/testing/test.txt

Extraer archivo de vuelta a mi m谩quina local
Copiamos el directorio testing en mi m谩quina local con nombre localtesting

docker cp copytest:/testing localtesting

Insertar y extraer archivos de un contenedor

touch prueba.txt
docker run -d --name copytest ubuntu tail -f /dev/null

Ingresar al contenedor

docker exec -it copytest bash

Para copiar el archivo o directorio de la maquina anfitriona al contenedor copytest, se utilizar谩

docker cp prueba.txt copytest:/testing/test.txt

Extraer archivos o directorios del contenedor copytest a la maquina anfitriona

docker cp copytest:/testing localtesting 

No hace falta que el contenedor este corriendo para poder usar el docker cp

Host: Donde Docker esta instalado.
Bind Mount: Guarda los archivos en la maquina local persistiendo y visualizando estos datos (No seguro).
Volume: Guarda los archivos en el area de Docker donde Docker los administra (Seguro).
TMPFS Mount: Guarda los archivos temporalmente y persiste los datos en la memoria del contenedor, cuando muera sus datos mueren con el contenedor.

Limitaciones de los montajes tmpfs馃敆

 A diferencia de los vol煤menes y los bind mounts, no puede compartir montajes tmpfs entre contenedores.
 Esta funcionalidad solo est谩 disponible si est谩 ejecutando Docker en Linux. 

Los Volume y los bind mounts le permiten compartir archivos entre la m谩quina host y el contenedor para que pueda conservar los datos incluso despu茅s de que se detenga el contenedor.

Si est谩 ejecutando Docker en Linux, tiene una tercera opci贸n: montajes tmpfs. Cuando crea un contenedor con un montaje tmpfs, el contenedor puede crear archivos fuera de la capa de escritura del contenedor.

A diferencia de los volumenes y los bind mounts, un montaje tmpfs es temporal y solo persiste en la memoria del host. Cuando el contenedor se detiene, el montaje tmpfs se elimina y los archivos escritos all铆 no se conservar谩n.

ejemplo de montaje tmpfs:

docker run -d -it --name nombreContenedor --mount type=tmpfs,destination=/ruta/directorio/deseado ubuntu:latest 

Bind Mount Vs Vol煤menes Vs Tmpfs Mount:

  1. Bind Mount, se suele usar para temas de desarrollo, o para hacer pruebas r谩pidas donde se requieran hacer cambios en la maquina y que se vean inmediatamente en el contenedor.

  2. Los vol煤menes, son mas para compartir datos entre contenedores, sin preocuparse de que parte del disco est谩n, o que sobrevivan a la de vida del contenedor.

  3. Tmpfs Mount, no se usan tanto pero tienen sus usos, como por ejemplo: Esto puede servir o ser c贸modo usarlo para escribir archivos temporales que puedan ser accedidos, pero que no se requieran conservar una vez el contenedor desaparezca.

ok 3 formas de almacenar o intercambiar datos con el container. bind mount , volume y tmpfs mount

Entendido

Lo que entend铆 y era como ven铆a trabajando y es que yo uso bin mount para montar el c贸digo cuando est谩 en desarrollo, paraque se vean los cambios al instante y volumes para bases de datos

Sobre la aplicaci贸n t铆pica de cada uno de los m茅todos de manejo de datos con Docker.
Bind Mount: Se usa mas en etapa de desarrollo.
Vollume: Mas 煤til para compartir datos entre contenedores.
TMPFS Mount (solo Linux): Para compartir datos temporalmente entre el file system del host y el contenedor, estos datos ser谩n borrados una vez el contenedor sea detenido. Este m茅todo no sirve para compartir data entre contenedores. Una aplicaci贸n podr铆a ser monitorear desde un archivo en el file system el comportamiento de un contenedor durante un periodo de ejecuci贸n.

Les dejo un script que automatiza el copiar y extrar archivos usando docker. Link

Wow, super poderoso lo que se puede construir con Docker 馃槷

El comando extrae de un directorio un archivo o un direcctorio de un contenedor. docker cp nombreContenedor:/rutadeextrancion archivo.ext o directorioaExtraer

Este comando copia un archivo de la maquina anfitriona hacia un contenedor. docker ps archivo.ext nombreContenedor:/rutaDondeSeDeposita/nombreArchivo.ext

El comando ll es ls -lac en debian

Otro punto es que cuando se comienza a crear el contenedor ejemplo: [email protected]:$/Escritorio y despu茅s quieren realizar un cp deberan hacerlo desde ese punto, porque si cierran la terminal y comienzan hacerlo sin el Escritorio no podr谩n ejecutar el comando cp, los demas si.

interesante el insertar y extraer los datos

No es necesario que el contenedor est茅 corriendo para usar docker cp

  • Copiar archivos a un contenedor
docker cp <file> <container_name>:/<route>/<new_file_name>
Ejemplo
docker cp prueba.txt copytest:/testing/test.txt