Permítanme agregar mi propia respuesta, porque creo que a los demás les falta el punto de Docker.
Usar VOLUME
en el Dockerfile es el Right Way ™, porque le informa a Docker que cierto directorio contiene datos permanentes. Docker creará un volumen para esos datos y nunca los eliminará, incluso si elimina todos los contenedores que los usan.
También omite el sistema de archivos de unión, de modo que el volumen es de hecho un directorio real que se monta (lectura-escritura o solo lectura) en el lugar correcto en todos los contenedores que lo comparten.
Ahora, para acceder a esos datos desde el host, solo necesita inspeccionar su contenedor:
# docker inspect myapp
[{
.
.
.
"Volumes": {
"/var/www": "/var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6...",
"/var/cache/nginx": "/var/lib/docker/vfs/dir/62499e6b31cb3f7f59bf00d8a16b48d2...",
"/var/log/nginx": "/var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87..."
},
"VolumesRW": {
"/var/www": false,
"/var/cache/nginx": true,
"/var/log/nginx": true
}
}]
Lo que generalmente hago es crear enlaces simbólicos en algún lugar estándar, como / srv , para que pueda acceder fácilmente a los volúmenes y administrar los datos que contienen (solo para los volúmenes que le interesan):
ln -s /var/lib/docker/vfs/dir/b3ef4bc28fb39034dd7a3aab00e086e6... /srv/myapp-www
ln -s /var/lib/docker/vfs/dir/71896ce364ef919592f4e99c6e22ce87... /srv/myapp-log
--volumes-from
montará tuVOLUME
sobre la parte superior de todo lo que especifiques-v
. Curiosamente, parece que se ejecuta el contenedor en modo privilegiado (docker run --privileged
) eumount
ing/var/lib/mysql
dejará un directorio vacío para que su-v
montaje sea completamente ignorado cuando entre en conflicto con aVOLUME
.named-volume:/path/in/container
. Los volúmenes sin nombre reciben valores hash para nombres y esos valores hash se pueden proporcionar en lugar de una ruta de host para acceder a volúmenes huérfanos. :) Tenga en cuenta quevolume ls
puede no mostrarlos a todos, intentedocker volume ls -f dangling=true
también.