Compartir a través de


Almacenamiento persistente en contenedores

Puede haber casos en los que sea importante que una aplicación pueda conservar los datos en un contenedor o en los que quieras mostrar los archivos en un contenedor que no se incluyeron en el tiempo de compilación del contenedor. El almacenamiento persistente se puede proporcionar a los contenedores de dos maneras:

  • Enlazar montajes
  • Volúmenes con nombre

Docker tiene una excelente introducción a cómo usar volúmenes , por lo que es mejor leerlo primero. El resto de esta página se centra en las diferencias entre Linux y Windows y proporciona ejemplos en Windows.

Montajes de enlace

Los montajes de enlace permiten que un contenedor comparta un directorio con el host. Esto es útil si desea un lugar para almacenar archivos en el equipo local que están disponibles si reinicia un contenedor o desea compartirlo con varios contenedores. Si quieres que el contenedor se ejecute en varias máquinas con acceso a los mismos archivos, debe usarse en su lugar un volumen con nombre o el montaje SMB.

Nota:

No se admite el montaje de enlaces directamente en volúmenes compartidos de clúster (CSV), las máquinas virtuales que actúan como host de contenedor se pueden ejecutar en un volumen CSV.

Permisos

El modelo de permisos usado para los montajes de enlace varía en función del nivel de aislamiento del contenedor.

Los contenedores que usan Hyper-V aislamiento usan un modelo de permisos de solo lectura o de lectura y escritura. Se accede a los archivos en el host mediante la LocalSystem cuenta. Si obtiene acceso denegado en el contenedor, asegúrese LocalSystem de que tiene acceso a ese directorio en el host. Cuando se usa la marca de solo lectura, los cambios realizados en el volumen dentro del contenedor no estarán visibles ni se conservarán en el directorio del host.

Los contenedores de Windows que usan el aislamiento de procesos son ligeramente diferentes porque usan la identidad del proceso dentro del contenedor para acceder a los datos, lo que significa que se respetan las ACL de archivo. La identidad del proceso que se ejecuta en el contenedor ("ContainerAdministrator" en Windows Server Core y "ContainerUser" en contenedores de Nano Server, de forma predeterminada) se usará para acceder a los archivos y directorios del volumen montado en lugar de LocalSystem, y tendrá que concederse acceso para usar los datos.

Dado que estas identidades solo existen en el contexto del contenedor,no en el host donde se almacenan los archivos, debe usar un grupo de seguridad conocido, como Authenticated Users al configurar las ACL para conceder acceso a los contenedores.

Advertencia

No enlace directorios confidenciales como C:\ en un contenedor que no es de confianza. Esto permitiría cambiar los archivos en el host a los que normalmente no tendría acceso y podría crear una infracción de seguridad.

Uso de ejemplo:

  • docker run -v c:\ContainerData:c:\data:RO para acceso de solo lectura
  • docker run -v c:\ContainerData:c:\data:RW para acceso de lectura y escritura
  • docker run -v c:\ContainerData:c:\data para el acceso de lectura y escritura (valor predeterminado)

Los vínculos simbólicos se resuelven en el contenedor. Si enlaza una ruta de acceso de host a un contenedor que es un vínculo simbólico o contiene vínculos simbólicos, el contenedor no podrá acceder a ellos.

Montajes SMB

En la versión 1709 y posteriores de Windows Server, la característica denominada "Asignación global de SMB" permite montar un recurso compartido SMB en el host y, a continuación, pasar directorios de ese recurso compartido a un contenedor. No es necesario configurar el contenedor con un servidor, un recurso compartido, un nombre de usuario o una contraseña específicos, que se controlan en su lugar en el host. El contenedor funcionará igual que si tuviera almacenamiento local.

Pasos de configuración

  1. En el host de contenedor, asigne globalmente el recurso compartido SMB remoto:

    $creds = Get-Credential
    New-SmbGlobalMapping -RemotePath \\contosofileserver\share1 -Credential $creds -LocalPath G:
    

    Este comando usará las credenciales para autenticarse con el servidor SMB remoto. Después asigna la ruta de acceso de recurso compartido remoto a la letra de unidad G: (puede ser cualquier otra letra de unidad disponible). Los contenedores creados en este host de contenedor ahora pueden tener sus volúmenes de datos asignados a una ruta de acceso en la unidad G: .

    Nota:

    Al usar la asignación global de SMB para contenedores, todos los usuarios del host de contenedor pueden acceder al recurso compartido remoto. Cualquier aplicación que se ejecute en el host de contenedor también tendrá acceso al recurso compartido remoto asignado.

  2. Creación de contenedores con volúmenes de datos asignados a un recurso compartido de SMB montado globalmente, docker ejecute -it demostración --name -v g:\ContainerData:c:\AppData1 mcr.microsoft.com/windows/servercore:ltsc2019 cmd.exe

    Dentro del contenedor, c:\AppData1 se asignará al directorio "ContainerData" del recurso compartido remoto. Todos los datos almacenados en un recurso compartido remoto asignado globalmente estarán disponibles para las aplicaciones dentro del contenedor. Varios contenedores pueden obtener acceso de lectura y escritura a estos datos compartidos con el mismo comando.

Esta compatibilidad con la asignación global de SMB es una característica del lado cliente de SMB que puede funcionar sobre cualquier servidor SMB compatible, entre los que se incluyen:

  • Servidor de archivos de escalabilidad horizontal sobre Espacios de almacenamiento directo (S2D) o una SAN tradicional
  • Azure Files (recurso compartido de SMB)
  • Servidor de archivos tradicional
  • Implementación de terceros del protocolo SMB (por ejemplo: dispositivos NAS)

Nota:

La asignación global de SMB no admite carpetas de espacios de nombres DFS (DFSN). Por ejemplo, si asigna un recurso compartido raíz DFSN con New-SmbGlobalMapping -LocalPath Z: -RemotePath \\contoso.com\share1', al leer los destinos de carpeta raíz se devolverá el error "No se puede acceder a la ubicación de red".

Volúmenes con nombre

Los volúmenes con nombre permiten crear un volumen por nombre, asignarlo a un contenedor y reutilizarlo más adelante con el mismo nombre. No es necesario realizar un seguimiento de la ruta de acceso real de donde se creó, solo el nombre. El motor de Docker en Windows tiene un complemento de volumen integrado que puede crear volúmenes en el equipo local. Se requiere un complemento adicional si desea usar volúmenes con nombre en varias máquinas.

Pasos de ejemplo:

  1. docker volume create unwound - Crear un volumen denominado "unwound"
  2. docker run -v unwound:c:\data microsoft/windowsservercore - Iniciar un contenedor con el volumen asignado a c:\data
  3. Escriba algunos archivos en c:\data en el contenedor y detenga el contenedor.
  4. docker run -v unwound:c:\data microsoft/windowsservercore - Iniciar un nuevo contenedor
  5. Ejecutar dir c:\data en el nuevo contenedor: los archivos todavía están ahí

Nota:

Windows Server convertirá los nombres de ruta de acceso de destino (la ruta de acceso dentro del contenedor) en minúsculas; es decir -v unwound:c:\MyData, , o -v unwound:/app/MyData en contenedores de Linux, dará como resultado un directorio dentro del contenedor de c:\mydata, o /app/mydata en contenedores de Linux, que se asignan (y se crean, si no existen).