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.