Copie archivos del host al contenedor Docker

Isaac Tony 23 agosto 2022
  1. Use docker cp para copiar archivos del host al contenedor Docker
  2. Usar docker volume para copiar archivos del host al contenedor Docker
Copie archivos del host al contenedor Docker

Este artículo discutirá y demostrará los métodos que podemos usar para transferir archivos desde nuestra máquina host a un contenedor en ejecución en Docker.

Use docker cp para copiar archivos del host al contenedor Docker

El comando docker cp es una de las formas más fáciles que podemos usar para copiar archivos y directorios desde nuestra máquina host a un contenedor Docker. Usaremos Ubuntu 20.4.5 y la última versión de Docker en ese momento, que es v 19.03.

Sintaxis:

docker cp {options} PATH_HOST CONTAINER:PATH_TO_CONTAINER 

Donde:

  • PATH_HOST especifica la ruta de origen donde se encuentra el archivo que queremos copiar en el host.
  • PATH_TO_CONTAINER es la ruta de destino donde queremos almacenar el archivo en el contenedor.

Ejemplo:

Comenzaremos creando nuestro contenedor de destino. Usaremos la imagen oficial de Nginx para este artículo, que podemos obtener a través del escritorio Docker o la terminal ejecutando el siguiente comando.

$ docker pull nginx

Producción :

Using default tag: latest
latest: Pulling from library/nginx
5eb5b503b376: Pull complete
1ae07ab881bd: Pull complete
78091884b7be: Pull complete
091c283c6a66: Pull complete
55de5851019b: Pull complete
b559bad762be: Pull complete
Digest: sha256:2834dc507516af02784808c5f48b7cbe38b8ed5d0f4837f16e78d00deb7e7767
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

Usamos el siguiente comando para verificar que extrajimos con éxito la imagen del registro.

$ docker images

Producción :

REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
nginx        latest    c316d5a335a5   2 weeks ago   142MB

Ahora podemos crear un contenedor. Usando el comando ejecutar, crearemos un contenedor y lo implementaremos en el modo separado para escuchar en el puerto externo 8080 y el puerto interno 80.

El siguiente comando creará un contenedor utilizando la imagen base de Nginx.

$ docker run -d -p 8080:80 nginx

Podemos comprobar que hemos creado correctamente un nuevo contenedor ejecutando el comando docker ps -a. Esto mostrará una lista de todos los contenedores que creamos recientemente y en el pasado, junto con sus ID de contenedor y sus respectivas imágenes.

Podemos ejecutar esto como se muestra aquí.

docker ps -a

Producción :

CONTAINER ID   IMAGE   COMMAND                  CREATED              STATUS              PORTS                  NAMES
0c57de10362b   nginx   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp   lucid_booth

Antes de usar el comando docker cp, debemos crear un archivo que copiaremos desde el host al contenedor que acabamos de crear.

Crearemos un archivo llamado new_file.txt y lo almacenaremos en el directorio de inicio usando el comando touch.

Aquí está el comando para hacer eso.

$ touch new_file.txt

Podemos ver el directorio para asegurarnos de que hemos creado correctamente el archivo usando el comando ls como se muestra aquí.

isaac@DESKTOP-HV44HT6:~$ ls
new_file.txt

Por supuesto, nuevo_archivo.txt es un archivo vacío; sin embargo, queremos centrarnos en usar el comando docker cp para moverlo del host al contenedor que creamos anteriormente.

Luego copiamos este archivo en el contenedor que creamos.

$ docker cp new_file.txt 0c57de10362b:/usr/share

Así, hemos copiado new_file.txt en el contenedor con ID 0c57de10362b en la carpeta /usr/share.

Podemos determinar esto ingresando al contenedor en ejecución a través de una sesión SSH interactiva usando el comando docker exec y el indicador -it para ejecutar comandos de forma interactiva.

$ docker exec -it 0c57de10362b /bin/bash

Ahora que hemos iniciado sesión en el contenedor, queremos enumerar los archivos para verificar que hemos copiado este archivo en este contenedor. Podemos usar el comando ls nuevamente pero especificando la carpeta a la que queremos acceder.

root@0c57de10362b:/# ls -lh /usr/share/

Producción:

ver un archivo copiado en el contenedor docker desde el host

De manera similar, también podemos copiar un directorio que contenga muchos archivos simplemente cambiando la ubicación de los archivos para leer desde el directorio, como se muestra a continuación.

$ docker cp src/directory/. container-id:/target_location/directory

El comando docker cp, aunque fácil de usar, tiene algunas limitaciones. Su sintaxis es diferente del comando cp de Unix y solo admite un número limitado de etiquetas.

Además, esto solo se puede usar para copiar archivos del host a un contenedor y no entre contenedores.

Usar docker volume para copiar archivos del host al contenedor Docker

Un mejor enfoque para copiar archivos entre contenedores es a través de docker volume.

Podemos adjuntar volúmenes que contengan archivos que queramos copiar a un contenedor durante el proceso de creación del contenedor utilizando cualquiera de las dos banderas, -v o -mount.

Para usar volúmenes en Docker, primero creamos uno usando el comando docker volume, como se muestra a continuación.

$ docker volume create volume_one

Usando docker volume ls, podemos comprobar que hemos creado correctamente el volumen. Esto mostrará una lista de los nombres de los volúmenes creados ahora y en el pasado y el nombre del controlador.

isaac@DESKTOP-HV44HT6:~$ docker volume ls
DRIVER    VOLUME NAME
local     volume_one

Ahora que hemos creado un volumen, el siguiente paso consiste en crear un nuevo contenedor con el comando ejecutar y adjuntar el volumen que creamos con el indicador -v.

La bandera -v nos permite adjuntar el nuevo volumen al contenedor que creamos. Haremos este contenedor utilizando la última versión de la imagen base de Nginx.

$ docker run -d -v volume_one:/app nginx:latest
f2457d3eb8fe14645b9e3938017c02c46a657c9ad3323ff4c03924d2fddd7046

Podemos devolver información de bajo nivel sobre los objetos de Docker usando el comando de inspección de Docker. Investigaremos si nuestro volumen se adjuntó con éxito al contenedor que creamos.

Como no le asignamos ningún nombre a este contenedor, usaremos la ID del contenedor para inspeccionarlo. Usaremos el ID de contenedor más reciente y no el anterior.

$ docker ps -a

Producción :

CONTAINER ID   IMAGE          COMMAND                  CREATED             STATUS             PORTS                  NAMES
f2457d3eb8fe   nginx:latest   "/docker-entrypoint.…"   4 minutes ago       Up 4 minutes       80/tcp                 brave_kirch
0c57de10362b   nginx          "/docker-entrypoint.…"   About an hour ago   Up About an hour   0.0.0.0:8080->80/tcp   lucid_booth

Ahora podemos usar este ID de contenedor para inspeccionar el contenedor.

$ docker inspect f2457d3eb8fe

Producción:

Inspeccionar un volumen montado en un contenedor docker

Una de las ventajas del comando docker volume es crear un único directorio compartido con varios contenedores.

Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn

Artículo relacionado - Docker Container