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