Coder Social home page Coder Social logo

docker-volumes's Introduction

Volumes

Los volumes es el mecanismo que se recomienda usar para que la información generada por in container se mantenga persistente. A diferencia de los bind mounts que dependen de la estructura de directorios y del sistema operativo en el que corre docker, los volumes son administrados automáticamente por Docker.

Ventajas

Los volumes tienen varias ventajas:

  • Es más fácil hacer un respaldo.
  • Los volumes se pueden adiministrar con comandos de docker y de una API.
  • Al no depender de un sistema operativo, son más fáciles de usar.
  • Es más fácil compartir volumes entre varios containers.
  • Podemos usar volumes desde servicios en la nube y conectarnos remotamente a estos.
  • Podemos agregar contenido a un volume con un container y luego usar este volume con otro container.

Administración de volumes

Un volume es independiente a los containers. Por lo tanto, no es necesario tener un volume relacionado con un container para poder usar ese volume.

Por ejemplo, podemos crear un volume.

docker volume create volume-prueba

Una vez creado nuestro volume, podemos listarlo con:

docker volume ls

Podemos ver información de este volume:

docker volume inspect volume-prueba

Y podemos borrarlo con:

docker volume rm volume-prueba

Diferencias entre -v y --mount

Cuando estemos manipulando volume con el CLI de docker, vamos a tener que usar algunas de las opciones -v y --mount. Su fin es el mismo, crear volumes, pero su funcionamiento es diferente.

--mount es para declarar de manera más explícita o detallada las opciones del volume, bind o tmpfs a crear. -v o --volume es más conciso y breve, y sólo es para volumes.

En el caso de -v la syntax es:

<nombre del volume>:<path del archivo o directorio en el container>[:<opciones para el volume>]

Son dos campos obligatorios que están separados por un signo dos puntos (:).

Para usar --mount lo hacemos dando un lista de tuplas <key>=<value>, donde key pueden ser:

  • type para decir el tipo del mount, puede ser bind, volume, tmpfs. Aquí estamos discutiendo sobre volumes, así que esta tupla siempre será type=volume.
  • source o src para decir el nombre del volume una vez creado. Si lo dejamos vacío Docker le asigna un ID.
  • destination, dst, target para decir donde se encuentra el archivo o directorio en el container.
  • readonly o ro para indicar que el volume solo tiene permisos para ser leído.
  • volume-opt son las opciones relacionadas con el volume.

Un ejemplo general del uso de --mount es:

docker service create \
    --mount 'type=volume,src=<VOLUME-NAME>,dst=<CONTAINER-PATH>,volume-driver=local,volume-opt=type=nfs,volume-opt=device=<nfs-server>:<nfs-path>,"volume-opt=o=addr=<nfs-address>,vers=4,soft,timeo=180,bg,tcp,rw"'
    --name myservice \
    <IMAGE>

Iniciar un container con un volume

Docker crea automáticamente los volume necesarios para instalar un container en caso de que el volume no exista.

Como ejemplo:

docker run -d \
  --name neginxdevtest \
  --mount source=nginx-volume,target=/app \
  nginx:latest

Este comando crea un container y también le agrega un volume que se llama nginx-volume.

Podemos ver la información de este container con el siguiente comando:

docker inspect nginxdevtest

Y buscamos en la sección de Mounts.

"Mounts": [
    {
        "Type": "volume",
        "Name": "nginx-volume",
        "Source": "/var/lib/docker/volumes/nginx-volume/_data",
        "Destination": "/app",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],

Para finalizar para detener el container y borrar el container y el volume:

  1. Listamos los containers

    docker container ls

  2. Detenemos el container

    docker container stop nginxdevtest

  3. Vemos el status del container

    docker container ls

  4. Eliminamos el container

    docker container rm nginxdevtest

  5. Vemos que el container está eliminado:

    docker container ls

  6. Vemos que el volume no se eliminó:

    docker volume ls

  7. Eliminamos el volume:

    docker volume rm nginx-volume

  8. Vemos que se eliminó el container:

    docker volume ls

Podemos volver a crear este container usando -v:

docker run -d \
  --name nginxdevtest \
  -v nginx-volume:/app \
  nginx:latest

Como nota, no podemos borrar un volume que está en uso por un container.

Usar volumes en docker-compose

Cómo recuerdan, anteriormente vimos la estructura de un docker-compose.yaml.

version: "3.9"
services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:

En la parte de volumes podemos describir los volumes que queremos crear con el multicontainer. Cuando hagamos docker-compose up estos volumes se crearán. Si volvemos a crear más multicontainers se va usar el mismo volume.

También podemos crear los volumes por fuera de docker-compose y luego referenciarlos.

version: "3.9"
services:
  frontend:
    image: node:lts
    volumes:
      - myapp:/home/node/app
volumes:
  myapp:
    external: true

Popular un volume

Si creamos un container que tiene un volume, los archivos del container se van a copiar a este volume, el volume se va a montar y el container va empezar a usarlo. Pero este mísmo volume puede ser usado por otros containers.

Para ejemplificar, realicemos el siguiente ejercicio:

  1. Vamos a usar VSCode para editar los archivos por lo que deben instalar la siguiente extensión:

    img

  2. Una vez instalado el plugin, vamos a crear un container con un volume referenciado al container:

    docker run -d -p 8081:80
    --name=nginxtest
    --mount source=nginx-vol,destination=/usr/share/nginx/html
    nginx:latest

Este es un servidor web nginx que incluye una pequeña página en HTML dando la bienvenida.

  1. Vamos a dirección localhost/8082 y veremos la página de inicio.

    img

  2. Hagamos un pequeño cambio. Tenemos que ir a la extensión de Docker dentro de VSCode. Dentro de la pestaña CONTAINERS vamos a buscar a buscar el container que acabamos de crear.

    img

  3. Dentro de la estructura del container tenemos que ingresar hasta /usr/share/nginx/html, donde encontraremos el archivo index.html que es la página que estamos viendo, damos click derecho y en "Abrir".

  4. Editamos este archivo, lo guardamos y recargamos la página web para confirmar los cambios.

  5. Ahora, podemos crear otro container usando el mismo volume:

    docker run -d -p 8082:80
    --name=nginxtest2
    --mount source=nginx-vol,destination=/usr/share/nginx/html
    nginx:lates

  6. Si visitamos la dirección que le dimos a este container veremos que los cambios hechos en el container anterior se mantienen.

docker-volumes's People

Contributors

luis-barrera avatar

Watchers

 avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.