Volúmenes NFS en contenedores Docker

 In Labs

En muchas ocasiones nos encontramos con la necesidad de tener que usar en docker un volumen que esté compartido desde otro servidor mediante NFS. Para esto docker incluye su propio driver de NFS que nos permitirá directamente usar ese volumen sin tener que montarlo dentro de la máquina host.

Tenemos diferentes formas de usar estos volúmenes NFS en nuestros contenedores:

  • En primer lugar, podemos crear un volumen que podremos usar tanto en docker compose como usando un docker run. Para esto usaremos el siguiente comando: 
      $ docker volume create --driver local \
          --opt type=nfs \
          --opt o=nfsvers=4,addr=nfs.example-domain.com,rw \
          --opt device=:/path/to/dir \
          volume-name

     Una vez que tenemos creado el volumen, podremos montarlo dentro de nuestro contenedor 

      $ docker run -it --rm \
        --mount type=volume,dst=/container/path,volume-driver=local,volume-opt=type=nfs,\"volume-opt=o=nfsvers=4,addr=nfs.example-domain.com\",volume-opt=device=:/host/path \
        volume-name
  • Esta misma configuración podemos aplicarlas dentro de nuestro docker-comper. Dentro de nuestro docker-compose.yaml tendremos que crear el volumen y montarlo dentro de nuestro contenedor.
    # Container conf
      ...
      container-conf:
        container_name: foo/bar
        image: imagename:tag
        ports:
          - 80:80
        volumes:
          - new_volume:/path/inside/container
      ...
    # Create volume
      ...
      volumes:
        new_volume:
          driver: local
          driver_opts:
            type: nfs
            o: nfsvers=4,addr=nfs.example-domain.com,rw
            device: ":/host/path/to/dir"
      ...

    Esta misma situación nos la hemos encontrado teniendo la necesidad de montar al contenedor un EFS (Elastic File System) de Amazon Web Services. Este servicio de AWS proporciona almacenamiento escalable, elástico y concurrente y podremos añadirlo usando el mismo driver de NFS en docker.

    # Container conf
     ...
      container-conf:
        container_name: foo/bar
        image: imagename:tag
        ports:
          - 80:80
        volumes:
          - new_volume:/path/inside/container
     ... 
    # Create volume
     ...
      volumes:
        efs_volume:
          driver: local
          driver_opts:
            type: nfs
            o: addr=[EFS_DNS],nfsvers=4.1,rsize=1048576,wsize=1048576,hard,timeo=600,retrans=2
            device: [EFS_DNS]:/
     ...

    Hay que tener en cuenta que si acabamos de crear este EFS, puede ser que cuando intentemos crear este volumen nos dé un error avisando de que no encuentra el endpoint de EFS. Esto se debe a que esas DNS tardaran unos minutos en propagarse. En el caso de que no podáis añadirlo mediante el endpoint, podremos hacerlo directamente desde la IP del EFS.

Esperamos que esta explicación te haya sido de utilidad y no olvides que en Geko cloud estamos a tu disposición para la gestión de infraestructuras cloud y microservicios.

Si tienes otras dudas relacionadas con docker o Kubernetes, quizá puedas encontrar respuestas en otras de las entradas de nuestro blog.

¡Hasta la próxima!

Geko cloud

Recommended Posts

Leave a Comment

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.