Docker Swarm puede administrar dos tipos de almacenamiento:
volume
y bind
Si bien bind
Docker Documentation no lo sugiere, ya que crea un enlace entre un directorio local (en cada nodo de enjambre) a una tarea, la volume
implementación no se menciona, por lo que no entiendo cómo se comparten los volúmenes entre las tareas.
- ¿Cómo comparte Docker Swarm volúmenes entre nodos?
- ¿Dónde se guardan los volúmenes (en un administrador? ¿Y si hay más de un administrador?)
- ¿No hay ningún problema entre los nodos si se ejecuta en diferentes máquinas en diferentes redes?
- ¿Crea una VPN?
docker
docker-swarm
docker-machine
alessandro308
fuente
fuente
Respuestas:
Lo que estás preguntando es una pregunta común. Los datos de volumen y las características de lo que puede hacer ese volumen son administrados por un controlador de volumen. Al igual que se pueden utilizar diferentes controladores de red como
overlay
,bridge
ohost
, se pueden utilizar diferentes controladores de volumen.Docker y Swarm solo vienen con el
local
controlador estándar fuera de la caja. No tiene ningún conocimiento de Swarm, y solo creará nuevos volúmenes para sus datos en cualquier nodo en el que estén programadas sus tareas de servicio. Por lo general, esto no es lo que desea.Desea un complemento de controlador de terceros que sea compatible con Swarm y se asegure de que el volumen que creó para una tarea de servicio esté disponible en el nodo correcto en el momento adecuado. Las opciones incluyen el uso de "Docker para AWS / Azure" y su controlador CloudStor incluido , o la popular solución REX-Ray de código abierto .
Hay muchos controladores de volumen de terceros, que puede encontrar en Docker Store .
fuente
El modo Swarm en sí no hace nada diferente con los volúmenes, ejecuta cualquier comando de montaje de volumen que proporciones en el nodo donde se ejecuta el contenedor. Si su montaje de volumen es local para ese nodo, sus datos se guardarán localmente en ese nodo. No hay una funcionalidad incorporada para mover datos entre nodos automáticamente.
Hay algunas soluciones de almacenamiento distribuido basadas en software como GlusterFS, y Docker tiene una llamada Infinit que aún no es GA y el desarrollo ha pasado a un segundo plano frente a la integración de Kubernetes en EE.
El resultado típico es que necesita administrar la replicación del almacenamiento dentro de su aplicación (por ejemplo, etcd y otros algoritmos basados en balsa) o realiza sus montajes en un sistema de almacenamiento externo (con suerte con su propio HA). El montaje de un sistema de almacenamiento externo tiene dos opciones, basado en bloques o en archivos. El almacenamiento basado en bloques (p. Ej., EBS) suele tener un rendimiento superior, pero está limitado a montarse en un solo nodo. Para esto, normalmente necesitará un controlador de complemento de volumen de terceros para darle acceso a su nodo Docker a ese almacenamiento en bloque. El almacenamiento basado en archivos (por ejemplo, EFS) tiene un rendimiento más bajo, pero es más portátil y puede montarse simultáneamente en varios nodos, lo que es útil para un servicio replicado.
El almacenamiento de red basado en archivos más común es NFS (este es el mismo protocolo que usa EFS). Y puede montar eso sin ningún controlador de complemento de terceros. El controlador del complemento de volumen "local", lamentablemente llamado, que viene con la ventana acoplable, le da la opción de pasar los valores que desee al comando de montaje con las opciones del controlador, y sin opciones, por defecto almacena volúmenes en el directorio de la ventana acoplable / var / lib / Docker / volúmenes. Con las opciones, puede pasarle los parámetros de NFS, e incluso realizará una búsqueda de DNS en el nombre de host de NFS (algo que normalmente no tiene con NFS). Aquí hay un ejemplo de las diferentes formas de montar un sistema de archivos NFS usando el controlador de volumen local:
Si usa el ejemplo de archivo de redacción al final, tenga en cuenta que los cambios en un volumen (por ejemplo, la actualización de la ruta o dirección del servidor) no se reflejan en los volúmenes con nombre existentes mientras existan. Debe cambiar el nombre de su volumen o eliminarlo para permitir que swarm lo vuelva a crear con nuevos valores.
El otro problema común que veo en la mayoría de los usos de NFS es que "root squash" está habilitado en el servidor. Esto da lugar a problemas de permisos cuando los contenedores que se ejecutan como root intentan escribir archivos en el volumen. También tiene problemas de permisos de UID / GID similares en los que el UID / GID del contenedor es el que necesita permisos para escribir en el volumen, lo que puede requerir que la propiedad del directorio y los permisos se ajusten en el servidor NFS.
fuente
Mi solución para AWS EFS, que funciona:
Instale el paquete nfs-common:
sudo apt-get install -y nfs-common
Compruebe si su efs funciona:
ls -la efs-test-point/
Configure el archivo docker-compose.yml:
fuente
Mi solución para nuestro enjambre alojado localmente: cada nodo trabajador ha montado un recurso compartido nfs, proporcionado por nuestro servidor de archivos en
/mnt/docker-data
. Cuando defino volúmenes en mis archivos de composición de servicios, configuro el dispositivo en alguna ruta/mnt/docker-data
, por ejemplo:Con esta solución, la ventana acoplable crea el volumen en cada nodo, el servicio se implementa y, sorpresa, ya hay datos, porque es la misma ruta que utilizó el volumen en el otro nodo.
Si observa más de cerca el sistema de archivos de los nodos, verá que los montajes en mi servidor de archivos se crean debajo
/var/lib/docker/volumes
, vea aquí:fuente