在某些情况下,你可能需要应用能够将数据持久保存在容器中,或者需要将生成容器时未包括的文件显示到容器中。 可以通过以下几种方式向容器提供持久性存储:
- 绑定装载
- 命名卷
Docker 概述了如何使用 卷 ,以便最好先读取卷。 本页的其余部分重点介绍 Linux 和 Windows 之间的差异,并在 Windows 上提供示例。
绑定装载
绑定装载 允许容器与主机共享目录。 如果想要将文件存储在本地计算机上(如果重启容器)或想要与多个容器共享,则此方法非常有用。 如果你希望在可以访问相同文件的多台计算机上运行容器,则应该改用命名卷或 SMB 装载。
注释
不支持直接在群集共享卷(CSV)上绑定装载,充当容器主机的虚拟机可以在 CSV 卷上运行。
权限
用于绑定装载的权限模型因容器的隔离级别而异。
使用 Hyper-V 隔离 的容器使用简单的只读或读写权限模型。 使用 LocalSystem
帐户在主机上访问文件。 如果在容器中被拒绝访问,请确保 LocalSystem
有权访问主机上的该目录。 使用只读标志时,对容器内的卷所做的更改将不可见或保存到主机上的目录。
使用 进程隔离 的 Windows 容器略有不同,因为它们使用容器中的进程标识来访问数据,这意味着遵守文件 ACL。 默认情况下,Windows Server Core 上运行的进程(Windows Server Core 上的“ContainerAdministrator”和 Nano Server 容器上的“ContainerUser”)的标识将用于访问装载卷 LocalSystem
中的文件和目录,并且需要授予使用数据的权限。
由于这些标识仅存在于容器的上下文中(不在存储文件的主机上),因此应使用已知的安全组,例如 Authenticated Users
将 ACL 配置为授予对容器的访问权限。
警告
不要将敏感目录(例如 C:\
绑定装载到不受信任的容器中)。 这样,它就可以更改主机上通常无法访问的文件,并且可能会造成安全漏洞。
示例用法:
-
docker run -v c:\ContainerData:c:\data:RO
用于只读访问 -
docker run -v c:\ContainerData:c:\data:RW
用于读写访问 -
docker run -v c:\ContainerData:c:\data
用于读写访问(默认值)
Symlinks
符号链接在容器中解析。 如果将主机路径绑定到作为符号链接的容器或包含符号链接,则容器将无法访问它们。
SMB 装载
在 Windows Server 版本 1709 及更高版本上,称为“SMB 全局映射”的功能使可以在主机上装载 SMB 共享,然后将该共享上的目录传递到容器中。 不需要使用特定的服务器、共享、用户名或密码来配置容器 ,而是在主机上进行处理。 容器的工作方式与具有本地存储时的工作方式相同。
配置步骤
在容器主机上,全局映射远程 SMB 共享:
$creds = Get-Credential New-SmbGlobalMapping -RemotePath \\contosofileserver\share1 -Credential $creds -LocalPath G:
此命令将使用凭据向远程 SMB 服务器进行身份验证。 然后,将远程共享路径映射到 G: 驱动器号(可以是任何其他可用的驱动器号)。 在此容器主机上创建的容器现在可以将其数据卷映射到 G: 驱动器上的路径。
注释
对容器使用 SMB 全局映射时,容器主机上的所有用户都可以访问远程共享。 在容器主机上运行的任何应用程序也将有权访问映射的远程共享。
创建映射到全局装载的 SMB 共享 docker 运行的容器 -it --name demo -v g:\ContainerData:c:\AppData1 mcr.microsoft.com/windows/servercore:ltsc2019 cmd.exe
在容器中,c:\AppData1 随后将映射到远程共享的“ContainerData”目录。 存储在全局映射远程共享上的任何数据都可用于容器中的应用程序。 多个容器可以使用同一命令获取对此共享数据的读/写访问权限。
此 SMB 全局映射支持是 SMB 客户端功能,可在任何兼容的 SMB 服务器的基础上工作,包括:
- 存储空间直通(S2D)或传统 SAN 上的横向扩展文件服务器
- Azure 文件存储(SMB 共享)
- 传统文件服务器
- SMB 协议的第三方实现(例如:NAS 设备)
注释
SMB 全局映射不支持 DFS 命名空间 (DFSN) 文件夹。 例如,如果使用映射 DFSN 根共享 New-SmbGlobalMapping -LocalPath Z: -RemotePath \\contoso.com\share1'
,读取该根的文件夹目标将返回错误“无法到达网络位置”。
命名卷
命名卷允许按名称创建卷,将其分配给容器,稍后使用相同的名称重复使用该卷。 无需跟踪创建位置的实际路径,只需跟踪名称。 Windows 上的 Docker 引擎具有内置的命名卷插件,可在本地计算机上创建卷。 如果要在多台计算机上使用命名卷,则需要额外的插件。
示例步骤:
-
docker volume create unwound
- 创建名为“unwound”的卷 -
docker run -v unwound:c:\data microsoft/windowsservercore
- 使用映射到 c:\data 的卷启动容器 - 将某些文件写入容器中的 c:\data,然后停止容器
-
docker run -v unwound:c:\data microsoft/windowsservercore
- 启动新容器 - 在新容器中运行
dir c:\data
- 文件仍然存在
注释
Windows Server 会将目标路径名称(容器内的路径)转换为小写:即-v unwound:c:\MyData
,在 -v unwound:/app/MyData
Linux 容器中,将导致映射的容器c:\mydata
/app/mydata
或 Linux 容器中的目录(如果不存在)和创建。