Cómo compartir datos entre el contenedor Docker y el host

Introducción
En general, los contenedores Docker son efímeros y se ejecutan durante el tiempo que tarda en completarse el comando emitido en el contenedor. De manera predeterminada, los datos creados dentro del contenedor solo están disponibles desde dentro del contenedor y solo mientras el contenedor está en ejecución.
Los volúmenes de Docker se pueden usar para compartir archivos entre un sistema host y el contenedor de Docker. Por ejemplo, supongamos que desea utilizar la imagen oficial de Docker Nginx y conservar una copia permanente de los archivos de registro de Nginx para analizarlos más adelante. De forma predeterminada, la nginx
imagen de Docker se registrará en el /var/log/nginx
directorio dentro del contenedor de Docker Nginx. Normalmente, no se puede acceder a ella desde el sistema de archivos del host.
En este tutorial, exploraremos cómo hacer que los datos dentro del contenedor sean accesibles en la máquina host.
Prerrequisitos
Para seguir este artículo, necesitará un servidor Ubuntu 18.04 con lo siguiente:
- Un usuario no root con
sudo
privilegios, siguiendo la guía Configuración inicial del servidor con Ubuntu 18.04 . - Docker instalado con las instrucciones del Paso 1 y Paso 2 de Cómo instalar y usar Docker en Ubuntu 18.04 .
Si eres nuevo en Docker, la serie El ecosistema de Docker proporciona una descripción detallada de los conceptos clave.
Nota: Aunque los requisitos previos brindan instrucciones para instalar Docker en Ubuntu 18.04, los docker
comandos para los volúmenes de datos de Docker en este artículo deberían funcionar en otros sistemas operativos siempre que Docker esté instalado.
Paso 1: Montaje enlazado de un volumen
El siguiente comando creará un directorio llamado nginxlogs
en el directorio de inicio de su usuario actual y lo enlazará al /var/log/nginx
contenedor:
- docker run --name=nginx -d -v ~/nginxlogs:/var/log/nginx -p 5000:80 nginx
Tomemos un momento para examinar este comando en detalle:
--name=nginx
nombra el contenedor para que podamos referirnos a él más fácilmente.-d
Desconecta el proceso y lo ejecuta en segundo plano. De lo contrario, solo estaríamos viendo un mensaje de Nginx vacío y no podríamos usar esta terminal hasta que cerráramos Nginx.-v ~/nginxlogs:/var/log/nginx
Configura un volumen bindmount que vincula el/var/log/nginx
directorio desde el interior del contenedor Nginx al~/nginxlogs
directorio en la máquina host. Docker usa un:
para separar la ruta del host de la ruta del contenedor, y la ruta del host siempre aparece primero.-p 5000:80
Configura un reenvío de puerto. El contenedor Nginx escucha en el puerto80
de manera predeterminada. Esta bandera asigna el puerto del contenedor80
al puerto5000
del sistema host.nginx
especifica que el contenedor debe construirse a partir de la imagen de Nginx, que emite el comandonginx -g "daemon off"
para iniciar Nginx.
Nota: la -v
bandera es muy flexible. Puede bindmount o nombrar un volumen con solo un pequeño ajuste en la sintaxis. Si el primer argumento comienza con /
o ~/
, estás creando un bindmount. Quítalo y estarás nombrando el volumen.
-v /path:/path/in/container
monta el directorio del host,/path
en el/path/in/container
-v path:/path/in/container
crea un volumen nombradopath
sin relación con el host.
Para obtener más información sobre los volúmenes con nombre, consulte Cómo compartir datos entre contenedores Docker
Paso 2: Acceso a los datos en el host
Ahora tenemos una copia de Nginx ejecutándose dentro de un contenedor Docker en nuestra máquina, y el puerto de nuestra máquina host 5000
se asigna directamente a esa copia del puerto de Nginx 80
.
Cargue la dirección en un navegador web, utilizando la dirección IP o el nombre de host de su servidor y el número de puerto: . Debería ver:http://your_server_ip:5000
Más interesante aún, si miramos el ~/nginxlogs
directorio en el host, veremos el access.log
creado por el contenedor nginx
que mostrará nuestra solicitud:
- cat ~/nginxlogs/access.log
Esto debería mostrar algo como:
Output203.0.113.0 - - [11/Jul/2018:00:59:11 +0000] "GET / HTTP/1.1" 200 612 "-""Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36(KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36" "-"
Si realiza algún cambio en la ~/nginxlogs
carpeta, también podrá verlo desde dentro del contenedor Docker en tiempo real.
Conclusión
En este tutorial, demostramos cómo crear un volumen de datos de Docker para compartir información entre un contenedor y el sistema de archivos del host. Esto resulta útil en entornos de desarrollo, donde es necesario tener acceso a los registros para la depuración. Para obtener más información sobre cómo compartir datos persistentes entre contenedores, consulte Cómo compartir datos entre contenedores de Docker .
Deja una respuesta