Cómo usar el comando docker container cp para copiar archivos

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás a utilizar eficazmente el comando docker container cp para copiar archivos entre tu sistema de archivos local y los contenedores de Docker. Esta experiencia práctica cubrirá escenarios esenciales, incluyendo la copia de archivos desde tu máquina local a un contenedor en ejecución, la recuperación de archivos desde un contenedor a tu sistema local, y el uso de capacidades de transmisión (streaming) para transferir datos mediante STDOUT y STDIN.

A través de ejemplos prácticos, adquirirás competencia en la gestión del flujo de datos para tus aplicaciones en contenedores. Aprenderás a copiar archivos individuales, directorios e incluso a transmitir datos en flujo, brindándote la flexibilidad necesaria para diversas tareas de desarrollo e implementación.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/VolumeOperationsGroup(["Volume Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/start("Start Container") docker/ContainerOperationsGroup -.-> docker/stop("Stop Container") docker/ContainerOperationsGroup -.-> docker/rm("Remove Container") docker/ContainerOperationsGroup -.-> docker/exec("Execute Command in Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/VolumeOperationsGroup -.-> docker/cp("Copy Data Between Host and Container") subgraph Lab Skills docker/run -.-> lab-555105{{"Cómo usar el comando docker container cp para copiar archivos"}} docker/ps -.-> lab-555105{{"Cómo usar el comando docker container cp para copiar archivos"}} docker/start -.-> lab-555105{{"Cómo usar el comando docker container cp para copiar archivos"}} docker/stop -.-> lab-555105{{"Cómo usar el comando docker container cp para copiar archivos"}} docker/rm -.-> lab-555105{{"Cómo usar el comando docker container cp para copiar archivos"}} docker/exec -.-> lab-555105{{"Cómo usar el comando docker container cp para copiar archivos"}} docker/pull -.-> lab-555105{{"Cómo usar el comando docker container cp para copiar archivos"}} docker/cp -.-> lab-555105{{"Cómo usar el comando docker container cp para copiar archivos"}} end

Copiar un archivo local a un contenedor

En este paso, aprenderás cómo copiar un archivo desde tu sistema de archivos local a un contenedor Docker en ejecución. Esta es una tarea común cuando necesitas agregar archivos de configuración, scripts u otros datos a un contenedor después de que ha sido iniciado.

Primero, creemos un archivo de texto simple en tu máquina local dentro del directorio ~/project.

echo "This is a test file." > ~/project/test_file.txt

Este comando crea un archivo llamado test_file.txt en tu directorio ~/project y escribe el texto "This is a test file." en él.

A continuación, necesitamos un contenedor en ejecución para copiar el archivo. Usaremos una imagen simple de ubuntu para este propósito. Como la imagen podría no estar presente localmente, primero la descargaremos.

docker pull ubuntu:latest

Este comando descarga la última versión de la imagen ubuntu desde Docker Hub.

Ahora, ejecutemos un contenedor basado en la imagen ubuntu. Lo ejecutaremos en modo desatendido (-d) y le daremos un nombre (my_ubuntu_container) para facilitar su identificación.

docker run -d --name my_ubuntu_container ubuntu:latest sleep infinity

Este comando inicia un nuevo contenedor llamado my_ubuntu_container usando la imagen ubuntu:latest. El comando sleep infinity mantiene el contenedor en ejecución indefinidamente, lo cual es útil para fines de demostración.

Puedes verificar que el contenedor está en ejecución usando el comando docker ps.

docker ps

Deberías ver my_ubuntu_container listado en la salida.

Ahora, podemos copiar el archivo test_file.txt desde tu máquina local al contenedor en ejecución usando el comando docker cp. La sintaxis es docker cp <ruta_local> <nombre_contenedor>:<ruta_contenedor>.

docker cp ~/project/test_file.txt my_ubuntu_container:/tmp/

Este comando copia el archivo ~/project/test_file.txt al directorio /tmp/ dentro de my_ubuntu_container.

Para verificar que el archivo se copió correctamente, puedes ejecutar un comando dentro del contenedor usando docker exec. Usaremos ls para listar los archivos en el directorio /tmp/ del contenedor.

docker exec my_ubuntu_container ls /tmp/

Deberías ver test_file.txt listado en la salida, lo que confirma que el archivo se copió correctamente.

Finalmente, limpiemos el contenedor que creamos.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

Estos comandos detienen y eliminan el contenedor, respectivamente.

Copiar archivos de un contenedor al sistema de archivos local

En este paso, aprenderás cómo copiar archivos desde un contenedor Docker en ejecución a tu sistema de archivos local. Esto es útil para recuperar logs, archivos de configuración o cualquier otro dato generado o modificado dentro de un contenedor.

Primero, asegurémonos de tener un contenedor en ejecución con el que trabajar. Usaremos my_ubuntu_container del paso anterior. Si no está en ejecución, inícialo.

docker start my_ubuntu_container

Este comando inicia el contenedor llamado my_ubuntu_container.

Ahora, creemos un archivo dentro del contenedor que copiaremos a nuestra máquina local. Usaremos docker exec para ejecutar un comando dentro del contenedor que creará un archivo llamado container_file.txt en el directorio /root/.

docker exec my_ubuntu_container sh -c 'echo "This file is from the container." > /root/container_file.txt'

Este comando ejecuta una instrucción shell dentro de my_ubuntu_container para crear el archivo /root/container_file.txt con el contenido especificado.

Para verificar que el archivo se creó dentro del contenedor, puedes usar docker exec para listar los archivos en el directorio /root/ del contenedor.

docker exec my_ubuntu_container ls /root/

Deberías ver container_file.txt listado en la salida.

Ahora podemos copiar container_file.txt desde el contenedor a tu máquina local usando el comando docker cp. La sintaxis para copiar desde un contenedor a local es docker cp <nombre_contenedor>:<ruta_contenedor> <ruta_local>. Lo copiaremos a tu directorio ~/project.

docker cp my_ubuntu_container:/root/container_file.txt ~/project/

Este comando copia el archivo /root/container_file.txt desde my_ubuntu_container a tu directorio local ~/project/.

Para verificar que el archivo se copió correctamente a tu máquina local, lista los archivos en tu directorio ~/project.

ls ~/project/

Deberías ver container_file.txt listado en la salida, junto con test_file.txt del paso anterior.

También puedes ver el contenido del archivo copiado usando el comando cat.

cat ~/project/container_file.txt

La salida debería ser "This file is from the container.", confirmando que el contenido se copió correctamente.

Finalmente, limpiemos el contenedor.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

Transmitir un archivo desde un contenedor a STDOUT

En este paso, aprenderás cómo transmitir el contenido de un archivo desde un contenedor Docker en ejecución directamente a la salida estándar (STDOUT) de tu máquina local. Esto es útil para visualizar rápidamente el contenido de un archivo dentro de un contenedor sin necesidad de copiarlo explícitamente.

Primero, asegúrate que my_ubuntu_container esté en ejecución. Si no lo está, inícialo.

docker start my_ubuntu_container

Ahora, creemos otro archivo dentro del contenedor que transmitiremos a STDOUT. Crearemos un archivo llamado stream_test.log en el directorio /var/log/ del contenedor.

docker exec my_ubuntu_container sh -c 'echo "This is a log entry." > /var/log/stream_test.log'

Este comando ejecuta una instrucción shell dentro de my_ubuntu_container para crear el archivo /var/log/stream_test.log con el contenido especificado.

Para transmitir el contenido de este archivo a tu STDOUT local, puedes usar el comando docker exec con el comando cat dentro del contenedor.

docker exec my_ubuntu_container cat /var/log/stream_test.log

Este comando ejecuta cat /var/log/stream_test.log dentro de my_ubuntu_container. La salida de este comando dentro del contenedor se transmite entonces a la STDOUT de tu terminal local.

Deberías ver el contenido "This is a log entry." impreso directamente en tu terminal. Esto demuestra cómo puedes visualizar rápidamente el contenido de un archivo dentro de un contenedor sin necesidad de copiar el archivo completo.

Finalmente, limpiemos el contenedor.

docker stop my_ubuntu_container
docker rm my_ubuntu_container

Transmitir un archivo tar local a un contenedor desde STDIN

En este paso, aprenderás cómo transmitir un archivo tar local directamente a un contenedor Docker en ejecución utilizando la entrada estándar (STDIN). Esta es una forma eficiente de transferir múltiples archivos o directorios a un contenedor sin crear archivos intermedios en tu máquina local.

Primero, creemos un directorio y algunos archivos en tu máquina local dentro del directorio ~/project que archivaremos y transmitiremos.

mkdir ~/project/my_files
echo "File 1 content." > ~/project/my_files/file1.txt
echo "File 2 content." > ~/project/my_files/file2.txt

Esto crea un directorio my_files y dos archivos de texto dentro de él.

Ahora, asegúrate que my_ubuntu_container esté en ejecución. Si no lo está, inícialo.

docker start my_ubuntu_container

Para transmitir un archivo tar al contenedor, usaremos el comando tar para crear un archivo del directorio my_files y canalizaremos (|) su salida al comando docker exec. Dentro del contenedor, usaremos nuevamente el comando tar para extraer el archivo.

Transmitiremos el archivo al directorio /opt/ dentro del contenedor.

tar -cvf - ~/project/my_files | docker exec -i my_ubuntu_container tar -xvf - -C /opt/

Analicemos este comando:

  • tar -cvf - ~/project/my_files: Este comando crea un archivo tar (-c) de forma detallada (-v) del directorio ~/project/my_files. La opción -f - indica a tar que escriba el archivo en la salida estándar.
  • |: Esto canaliza la salida estándar del comando tar (el archivo tar) a la entrada estándar del siguiente comando.
  • docker exec -i my_ubuntu_container tar -xvf - -C /opt/: Esto ejecuta el comando tar dentro de my_ubuntu_container. La bandera -i es crucial ya que mantiene STDIN abierto para el comando exec, permitiéndole recibir los datos canalizados. El comando tar -xvf - extrae (-x) de forma detallada (-v) desde la entrada estándar (-f -). La opción -C /opt/ cambia al directorio /opt/ antes de extraer, por lo que los contenidos del archivo se extraerán en /opt/my_files dentro del contenedor.

Para verificar que los archivos se transmitieron y extrajeron correctamente dentro del contenedor, lista los contenidos del directorio /opt/my_files/ dentro del contenedor usando docker exec.

docker exec my_ubuntu_container ls /opt/my_files/

Deberías ver file1.txt y file2.txt listados en la salida, confirmando que el archivo tar se transmitió y extrajo correctamente.

Finalmente, limpiemos el contenedor y los archivos locales.

docker stop my_ubuntu_container
docker rm my_ubuntu_container
rm -rf ~/project/my_files

Resumen

En este laboratorio, aprendiste a utilizar el comando docker container cp para copiar archivos entre tu sistema de archivos local y un contenedor Docker en ejecución. Practicaste copiar un archivo local a un contenedor, demostrando cómo agregar datos o configuraciones necesarias después de iniciar un contenedor. Esto incluyó crear un archivo local, descargar y ejecutar un contenedor simple de Ubuntu, y luego usar docker cp para transferir el archivo al directorio /tmp del contenedor.