GNU/Linux >> Tutoriales Linux >  >> Panels >> Docker

Cómo compartir datos entre contenedores Docker

Los contenedores Docker son entornos intencionalmente aislados. Cada contenedor tiene su propio sistema de archivos al que no pueden acceder directamente otros contenedores o su host.

A veces, los contenedores pueden necesitar compartir datos. Aunque debe aspirar a que los contenedores sean autosuficientes, hay escenarios en los que el intercambio de datos es inevitable. Esto podría ser para que un segundo contenedor pueda acceder a un caché combinado, usar una base de datos respaldada por archivos, crear una copia de seguridad o realizar operaciones en datos generados por el usuario, como un contenedor optimizador de imágenes que procesa fotos de perfil cargadas a través de un contenedor de servidor web separado. .

En esta guía, veremos algunos métodos para pasar datos entre sus contenedores Docker. Asumiremos que ya configuró Docker y está familiarizado con conceptos fundamentales como contenedores, imágenes, volúmenes y redes.

Uso de volúmenes para compartir un directorio

Los volúmenes son la forma de facto de configurar el uso compartido de datos. Son sistemas de archivos independientes que almacenan sus datos fuera de cualquier contenedor individual. Montar un volumen en una ruta del sistema de archivos dentro de un contenedor proporciona acceso de lectura y escritura a los datos del volumen.

Los volúmenes se pueden adjuntar a varios contenedores simultáneamente. Esto facilita el uso compartido de datos sin problemas y la persistencia que gestiona Docker.

Crea un volumen para comenzar:

docker volume create --name shared-data

A continuación, cree sus contenedores, montando el volumen en la ruta del sistema de archivos esperada por cada imagen:

docker run -d -v shared-data:/data --name example example-image:latest
docker run -d -v shared-data:/backup-source --name backup backup-image:latest

En este ejemplo, la backup contenedor obtendrá acceso efectivo al example /data del contenedor directorio. Se montará como /backup-source; los cambios realizados por cualquiera de los contenedores se reflejarán en el otro.

Inicio rápido de contenedores con volúmenes coincidentes

El ejemplo anterior podría simplificarse usando docker run --volumes-from del comando bandera. Esto proporciona un mecanismo para montar automáticamente volúmenes que ya están siendo utilizados por un contenedor existente:

docker run -d --volumes-from example --name backup backup-image:latest

Esta vez la backup contenedor recibirá los shared-data volumen montado en su /data directorio. El --volumes-from flag extrae todas las definiciones de volumen adjuntas al example envase. Es particularmente ideal para trabajos de copia de seguridad y otros contenedores de corta duración que actúan como componentes auxiliares de su servicio principal.

Mejorar la seguridad con montajes de solo lectura

Los volúmenes siempre se montan en modo de lectura y escritura de forma predeterminada. Todos sus contenedores con acceso a un volumen pueden cambiar su contenido, lo que podría causar una pérdida de datos no deseada.

Es una buena práctica montar volúmenes compartidos en modo de solo lectura cuando no se espera que un contenedor realice modificaciones. En el ejemplo anterior, la backup contenedor solo necesita leer el contenido de los shared-data volumen. Establecer el montaje en modo de solo lectura hace cumplir esta expectativa, evitando que los errores o los binarios maliciosos en la imagen eliminen los datos utilizados por el example contenedor.

docker run -d -v shared-data:/backup-source:ro --name backup backup-image:latest

Agregando ro como tercer parámetro separado por dos puntos del -v El indicador indica que el volumen debe montarse en modo de solo lectura. También puede escribir readonly en lugar de ro como una alternativa más explícita.

Compartir datos en una red

Puede utilizar los intercambios de red como un enfoque alternativo para compartir datos a través de volúmenes de sistemas de archivos. Unir dos contenedores a la misma red de Docker les permite comunicarse sin problemas mediante nombres de host asignados automáticamente:

docker network create demo-network
docker run -d --net demo-network --name first example-image:latest
docker run -d --net demo-network --name second another-image:latest

Aquí first podrá hacer ping second y viceversa. Sus contenedores podrían ejecutar un servicio de API HTTP que les permita interactuar con los datos de los demás.

Continuando con el ejemplo de la copia de seguridad, ahora su backup contenedor podría realizar una solicitud de red a http://example:8080/backup-data para adquirir los datos para la copia de seguridad. El example El contenedor debe responder con un archivo que contiene todos los datos que deben almacenarse. El contenedor de copia de seguridad entonces tiene la responsabilidad de conservar el archivo en una ubicación de almacenamiento adecuada.

Hacer cumplir que el intercambio de datos ocurra a través de una red a menudo ayuda a los esfuerzos de desacoplamiento. Termina con interfaces claramente definidas que no crean dependencias estrictas entre los servicios. El acceso a los datos se puede controlar con mayor precisión al exponer las API para cada tipo de datos, en lugar de otorgar a cada contenedor acceso total a un volumen.

Es importante tener en cuenta la seguridad si utiliza este enfoque. Asegúrese de que las API HTTP diseñadas para el acceso interno de sus otros contenedores de Docker no tengan puertos expuestos en la red de puente de su host de Docker. Este es el comportamiento predeterminado cuando se usan las opciones de red que se muestran arriba; vincular un puerto con -p 8080:8080 permitiría el acceso a la API de respaldo a través de las interfaces de red de su host. Esto sería un problema de seguridad.

Resumen

Los contenedores Docker son entornos aislados que no pueden acceder a los sistemas de archivos de los demás. No obstante, puede compartir datos creando un volumen que se monta en todos los contenedores participantes. El uso de una red Docker compartida es una opción alternativa que proporciona una separación más fuerte en escenarios donde las interacciones directas con el sistema de archivos no son necesarias.

Es una buena práctica limitar las interacciones entre contenedores en la medida de lo posible. Los casos en los que necesite compartir datos deben estar claramente definidos para evitar una estrecha vinculación de sus servicios. Contenedores que tienen una dependencia rígida de los datos de otro Con el tiempo, el contenedor puede ser más complicado de implementar y mantener, lo que reduce los beneficios más amplios de la contenedorización y el aislamiento.


Docker
  1. Cómo crear, enumerar y eliminar contenedores Docker en Linux

  2. Cómo construir el contenedor Docker Anaconda Python Data Science

  3. Cómo compartir datos entre contenedores Docker en Ubuntu 22.04

  4. Cómo listar contenedores Docker

  5. Cómo hacer una copia de seguridad y restaurar contenedores Docker

Cómo ejecutar contenedores Docker

Cómo eliminar contenedores Docker

Cómo detener los contenedores de Docker

Cómo nombrar o renombrar contenedores Docker

Cómo gestionar contenedores Docker

Cómo listar/iniciar/detener/eliminar contenedores docker