Diferencia entre la declaración de VOLUMEN en Dockerfile y -v como parámetro de ejecución de docker


¿Podría alguien ayudarme a entender la diferencia entre:

VOLUME comando en Dockerfile (capa de construcción de imágenes)

Y

-v paramter al emitir docker run-v/xyz/bla comando (capa de construcción de contenedores).

-v el parámetro está claro para mí, simplemente expone un directorio desde el host al contenedor y viceversa, pero ¿cómo se comporta VOLUME en Dockerfile de manera diferente?

Author: Carlos Rafael Ramirez, 2016-10-20

2 answers

El parámetro -v y la palabra clave VOLUME son casi los mismos. Puede usar -v para tener el mismo comportamiento que VOLUME.

docker run -v /data

Igual que

VOLUME /data

Pero también-v tienen más usos, uno de ellos es donde mapear el volumen:

docker run -v data:/data # Named volumes
docker run -v /var/data:/data # Host mounted volumes, this is what you refer to -v use, but as you can see there are more uses,

Entonces la pregunta es: ¿cuál es el uso de VOLUME en un Dockerfile?

El sistema de archivos contenedor está hecho de capas, por lo que escribir allí es más lento y limitado (debido al número fijo de capas) que el sistema de archivos simple.

Usted declare VOLUME en su Dockerfile para indicar dónde escribirá su contenedor los datos de la aplicación. Por ejemplo, un contenedor de base de datos, sus datos irán en un volumen independientemente de lo que ponga en su docker run.

Si crea un contenedor docker para JBoss y desea usar acceso rápido al sistema de archivos con libaio, debe declarar el directorio de datos como VOLUME o JBoss se bloqueará al iniciar.

En resumen VOLUME declara un volumen independientemente de lo que hagas en docker run. De hecho, en docker run no se puede deshacer a VOLUME declaración hecha en Dockerfile.

Saludos

 18
Author: Carlos Rafael Ramirez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-08-14 20:28:40

En pocas palabras

La instrucción VOLUME [PATH] dentro de un Dockerfile es equivalente a

$ docker run -v $(docker volume create):[PATH] [IMAGE_NAME]

Explicación detallada

El sistema de archivos contenedor está hecho de capas, por lo que escribir allí es más lento y limitado (debido al número fijo de capas) que el sistema de archivos simple.

El uso de volúmenes en Docker es principalmente menos una cuestión de velocidad que una cuestión de persistencia de datos independiente del ciclo de vida de un contenedor. Montaje de volúmenes desde un un disco más rápido obviamente mejorará el rendimiento, pero el comportamiento predeterminado de Docker para VOLUME es crear un volumen con nombre en el sistema host con pocas o ninguna mejora de velocidad en comparación con la capa de escritura del contenedor.

-v parámetro es para mí claro, simplemente expone un directorio desde el host al contenedor y viceversa

Si bien esto es parcialmente cierto, -v también se puede usar para montar volúmenes con nombre en su contenedor Docker en lugar de un directorio. Este pequeño detalle es importante para entender lo que VOLUME hace. Un ejemplo:

$ docker volume create my_volume
$ docker run -v my_volume:[PATH] [IMAGE_NAME]

Aquí se creó un volumen llamado my_volume. Se comporta como cabría esperar de una montura 'normal'. Cualquier cambio en [PATH] dentro del contenedor se mantendrá en este volumen. La diferencia es que Docker administra la ubicación del volumen, por lo que no necesita preocuparse (es /var/lib/docker/volumes/my_volume/_data en caso de que esté interesado). ¿Por qué querrías esto? Podrías tener una base de datos de pruebas. Mientras que usted no necesita acceso directo a los archivos, es posible que desee guardar el estado actual para montarlo en otros contenedores de base de datos.

La instrucción VOLUME [PATH] básicamente guarda las instrucciones anteriores en la metainformación de la imagen. Así que cada vez que inicie un contenedor desde esta imagen, Docker sabe que desea persistir [PATH] en un volumen y se encarga de eso.

 9
Author: stepf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-11-07 16:03:16