Cómo compartir datos entre contenedores Docker

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

En ocasiones, es posible que los contenedores necesiten compartir datos. Si bien debe aspirar a que los contenedores sean autosuficientes, hay escenarios en los que el intercambio de datos es inevitable. Esto podría ser que un segundo contenedor pueda acceder a una caché combinada, usar una base de datos respaldada por archivos, crear una copia de seguridad o realizar operaciones con datos generados por el usuario, como un contenedor de optimización 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 transferir datos entre contenedores Docker. Supongamos que ya ha configurado Docker y está familiarizado con conceptos fundamentales como contenedores, imágenes, volúmenes y redes.

Índice de contenidos
  1. Usar volúmenes para compartir un directorio
  2. Lanzamiento rápido de contenedores con volúmenes coincidentes
  3. Seguridad mejorada con medios de solo lectura
  4. Compartir datos a través de una red
  5. Resumen

Usar volúmenes para compartir un directorio

Los volúmenes son la forma de facto de configurar el intercambio de datos. Son sistemas de archivos independientes que almacenan sus datos fuera de cada 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 al mismo tiempo. Esto facilita el intercambio de datos sin problemas y la persistencia administrada por Docker.

Crea un volumen para comenzar:

docker volume create --name shared-data

Luego 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, el backup contenedor obtendrá acceso efectivo a la example contenedores /data directorio. Se montará como /backup-source; los cambios realizados por uno de los dos contenedores se reflejarán en el otro.

Lanzamiento rápido de contenedores con volúmenes coincidentes

El ejemplo anterior podría simplificarse utilizando el docker run comandos --volumes-frombandera. Esto proporciona un mecanismo para montar automáticamente los volúmenes ya utilizados por un contenedor existente:

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

Esta vez el backup contenedor recibirá el shared-data volumen montado en su /data directorio. El --volumes-from marca inserta todas las definiciones de volumen adjuntas al example envase. Es particularmente ideal para trabajos de respaldo y otros contenedores de corta duración que sirven como componentes auxiliares del servicio principal.

Seguridad mejorada con medios de solo lectura

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

Recomendamos que monte volúmenes compartidos en modo de solo lectura cuando no se espera que un contenedor realice cambios. En el ejemplo anterior, el backup contenedor solo necesita leer el contenido del shared-data volumen. Configurar el montaje en modo de solo lectura refuerza esta expectativa al evitar que errores o binarios maliciosos en la imagen eliminen los datos utilizados por el example envase.

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

agregando ro como tercer parámetro separado por dos puntos para el -v La bandera indica que el volumen debe montarse en modo de solo lectura. También puedes escribir readonly en vez de ro como una alternativa más explícita.

Compartir datos a través de una red

Los intercambios de red se pueden utilizar como un enfoque alternativo para compartir datos entre los volúmenes del sistema de archivos. Unir dos contenedores a la misma red Docker les permite comunicarse sin problemas utilizando 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. Es posible que sus contenedores estén ejecutando un servicio de API HTTP que les permita interactuar con los datos de los demás.

Continuando con el ejemplo de respaldo, ahora suyo backup contenedor podría hacer una solicitud de red http://example:8080/backup-data Adquirir los datos que se van a respaldar. El example El contenedor debe responder con un archivo que contenga todos los datos que deben archivarse. El contenedor de respaldo es entonces responsable de mantener el archivo en una ubicación de almacenamiento adecuada.

Forzar el intercambio de datos a través de una red a menudo ayuda a desvincular los esfuerzos. Termina con interfaces claramente definidas que no crean dependencias rígidas entre 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 completo a un volumen.

Es importante tener en cuenta la seguridad si se utiliza este enfoque. Asegúrese de que las API HTTP diseñadas para el acceso interno de otros contenedores de Docker no tengan puertos expuestos en la red de puente de host de Docker. Este es el comportamiento predeterminado cuando se utilizan las opciones de red que se muestran arriba; atar una puerta 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. Sin embargo, puede compartir los datos creando un volumen montado en todos los contenedores participantes. El uso de una red Docker compartida es una opción alternativa que proporciona una separación más sólida en escenarios donde no se requieren interacciones directas del sistema de archivos.

Es una buena práctica limitar las interacciones entre contenedores tanto como sea posible. Los casos en los que es necesario compartir datos deben definirse claramente para evitar vincular estrechamente los servicios entre sí. Contenedores que dependen estrictamente de los datos otro contenedor puede ser más complicado de implementar y mantener con el tiempo, erosionando los beneficios más amplios de la contenedorización y el aislamiento.

Descubre más contenido

Subir Change privacy settings