En un artículo reciente , el ingeniero de Docker, Stephen Turner, compartió algunas de las mejores prácticas para ayudar a los desarrolladores a comprender el uso compartido de archivos entre un contenedor de Docker y su host local y cómo varía su rendimiento entre los sistemas operativos.
Docker Desktop proporciona dos mecanismos para compartir una parte del sistema de archivos local con un contenedor, a saber, volumen de montaje enlazado y volúmenes con nombre. Además, puede copiar una parte de su sistema de archivos dentro del propio sistema de archivos del contenedor.
Cada enfoque tiene el mismo objetivo de compartir archivos entre el sistema de archivos local y el contenedor (así como entre distintos contenedores). Sin embargo, cada mecanismo viene con su propio equilibrio de pros y contras, lo que los hace adecuados para diferentes casos de uso.
La copia de archivos en un contenedor tiene el principal inconveniente de que todos los datos copiados, incluida cualquier modificación, se perderán cuando se elimine el contenedor. Definitivamente, este no es el resultado deseado si desea compartir el código que necesita editar.
En cuanto a las otras dos opciones, como explica Turner, los montajes de enlace son la solución más flexible, pero su rendimiento es inferior al de los volúmenes compartidos.
[…] está en la naturaleza de la virtualización que siempre hay una pequeña sobrecarga inevitable al cruzar el límite entre el host y la máquina virtual. Es muy pequeño, pero en un entorno de desarrollo con un gran árbol de código fuente y muchas lecturas y escrituras, se acumula y puede afectar visiblemente el rendimiento.
Es importante tener en cuenta que este problema solo existe en máquinas macOS y Windows que ejecutan Docker, ya que Linux tiene acceso directo al sistema de archivos montado en enlace.
En base a esto, Turner sugiere algunos criterios para comprender cuándo usar montajes de vinculación o volúmenes compartidos.
Los montajes de enlace son definitivamente el camino a seguir cuando desea compartir código que necesita editar. Sin embargo, podrían ser un problema para repositorios muy grandes en los que debe realizar una gran cantidad de operaciones de lectura/escritura. En estos casos, podría intentar la duplicación, utilizando soluciones de terceros como Mutagen y docker-sync .
Los montajes de enlace, por otro lado, definitivamente no son una buena opción para cosas como bases de datos, árboles de dependencias o bibliotecas, cachés y archivos de registro. Para todos esos casos, será mejor que utilice volúmenes compartidos.
Este estado de cosas podría cambiar, dice Turner, gracias a Virtiofs , que está diseñado específicamente para compartir archivos entre un host y una VM. Virtiofs ya está disponible en una vista previa de Docker Desktop para macOS.