Volúmenes NFS en contenedores Docker

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!

¡Contacta con nosotros y charlemos sobre cómo podemos ayudarte a hacer tu plataforma más ágil y segura!

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *