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 “docker 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 “vigilen” los cambios en el archivo que le pasemos.

Acerca de /dev/null

Se le conoce como una “caja 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’s 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á…esta 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 “aministrados por Docker” sí se puede acceder desde fuera… Simplemente hay que hacer docker volume inspect VOLUME_NAME, ahí aparecerá el “Mountpoint” 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 ‘prueba.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 “docker 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 “C” 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