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

Introducción

En general, los contenedores Docker son efímeros y se ejecutan todo el tiempo necesario para que se complete el comando emitido en el contenedor. Por defecto, cualquier dato creado dentro del contenedor solo está disponible desde dentro del contenedor y solo mientras el contenedor se está ejecutando.

Los volúmenes Docker se pueden usar para compartir archivos entre un sistema host y el contenedor Docker. Por ejemplo, supongamos que deseas 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 manera predeterminada, la imagen nginx de Docker se registrará en el directorio /var/log/nginx dentro del contenedor Docker Nginx. Normalmente no es accesible desde el sistema de archivos del host.

En este tutorial, exploraremos cómo hacer que los datos del interior del contenedor sean accesibles en la máquina host.

Prerrequisitos

Para seguir este artículo, necesitarás un servidor Ubuntu 18.04 con lo siguiente:

Si eres nuevo en Docker, la serie ecosistema Docker proporciona una descripción detallada de los conceptos claves.

Nota: Los requisitos previos dan instrucciones para instalar Docker en Ubuntu 18.04. Empero, los comandos docker 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 de un volumen

El siguiente comando creará un directorio llamado nginxlogs en el directorio de inicio de tu usuario actual y lo vincularás a /var/log/nginx en el contenedor:

Tomemos un momento para examinar este comando en detalle:

  • –name=nginx nombra el contenedor para que podamos consultarlo más fácilmente.
  • -d se para el proceso y lo ejecuta en segundo plano. De lo contrario, solo estaríamos viendo un aviso de Nginx vacío y no podríamos usar esta terminal hasta que cerremos Nginx.
  • -v ~/nginxlogs:/var/log/nginx configura un volumen que vincula el directorio /var/log/nginx desde el interior del contenedor Nginx al directorio ~/nginxlogs en la máquina host. Docker utiliza un : para dividir la ruta del host de la ruta del contenedor, y la ruta del host siempre es lo primero.
  • -p 5000:80 configura un puerto. El contenedor Nginx está escuchando en el puerto 80 de forma predeterminada. Este indicador asigna el puerto 80 del contenedor al puerto 5000 en el sistema host.
  • nginx especifica que el contenedor debe construirse a partir de la imagen de Nginx, que emite el comando nginx -g “daemon off” para iniciar Nginx.

Nota: El indicador –v es muy flexible. Puedes enlazar o nombrar un volumen con solo un ligero ajuste en la sintaxis. Si el primer argumento comienza con a /~/, estás creando un enlace. Elimina eso y estarás nombrando el volumen.

  • -v /path:/path/in/container monta el directorio de host, /path en /path/in/container
  • -v path:/path/in/container crea un volumen llamado path sin relación con el host.

Para obtener más información sobre volúmenes con nombre, debes consultar Cómo compartir datos entre contenedores Docker.

Paso 2: acceder a los datos en el host

Ahora tenemos una copia de Nginx ejecutándose dentro de un contenedor Docker en nuestra máquina. El puerto de nuestra máquina host 5000 se asigna directamente a esa copia del puerto de Nginx 80.

Debes cargar la dirección en un navegador web, utilizando la dirección IP o el nombre del servidor y el número de puerto: http://ip_de _tu_servidor:5000

Deberías ver lo siguiente:

Más interesante aún, si observamos en el directorio ~/nginxlogs en el host, veremos el access.log creado por el contenedor nginx que mostrará nuestra solicitud:

Esto debería mostrar algo como lo siguiente:

Si realizas cambios en la carpeta ~/nginxlogs, también podrás verlos desde el 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 es ú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, debes consultar Cómo compartir datos entre contenedores Docker.