前言

容器技术中最核心的一个技术点是分层存储。在Linux下相关文件默认被存放在/var/lib/docker下,而在Windows 10下安装Docker for Windows 后默认的存储文件被放在 C:\ProgramData\docker 下。可以通过在配置文件中设置 docker-root 来修改默认存放的位置。然后即使知道了文件的实际存储位置,也不建议大家手动对文件进行修改,这些文件处于Docker的精细化管理中。

细节技术点

默认C盘空间大小

默认情况下, microsoft/windowsservercore:1803 的镜像C盘空间大小为20G。我们可以通过以下命令进入容器内部,然后使用PowerShell命令确认。

docker run --rm -it microsoft/windowsservercore:1803 powershell
Get-CimInstance -Class Win32_Volume | select DriveLetter, @{Name="CapacityInGB"; Expression={$PSItem.Capacity / 1GB}}, @{Name"FreeSpaceInGB";  Expression={$PSItem.FreeSpace / 1GB}}

命令的输出结果如下:

DriveLetter     CapacityInGB    FreeSpaceInGB
-----------     ------------    -------------
C:          19.8740043640137 19.7209014892578

如果这个默认大小不能满足部分软件的剩余空间检查条件,那么可以在docker run时使用--storage-opt "size=50GB"进行修改,然后再次运行之前的PowerShell命令进行确认。

DriveLetter     CapacityInGB    FreeSpaceInGB
-----------     ------------    -------------
C:          49.8740005493164 49.7309150695801

持久化存储卷

在Windows中容器的持久化存储有几种方式,比如Bind Mounts, Named Volumes,以及在Bind Mounts中还支持SMB共享文件夹。

Bind Mounts

在使用 Bind Mounts 时我们需要注意权限问题。当容器运行在Hyper-V隔离模式下时,容器对主机文件夹是通过LocalSystem账号进行访问的,并提供简单的只读和读写两种访问模型。如果发现没有权限访问主机文件夹,则只需要在主机文件夹上增加LocalSystem的访问权限即可。

当容器运行在进程隔离模式下时,在容器内使用进程相关账号进行操作。默认情况下microsoft/windowsservercore使用ContainterAdmin,而microsoft/nanoserver使用ContainerUser,来访问主机文件夹的。然而ContainterAdmin和ContainerUser仅存在于容器环境中,因此在主机上进行权限配置时需要使用Authenticated Users。还需要注意的一点是,如果主机文件夹中包含符号链接,那这些主机上符号链接是在容器内解析的,因此容器内无法访问。

以下是 Bind Mounts 的一个例子, 容器启动后通过hostname讲主机名写入到挂载的存储卷中。

docker run --rm -it -v c:/apps/dockerdata:c:/data microsoft/nanoserver:1803 cmd
hostname > c:\data\hostname.txr

SMB Mounts

目前SMB Mounts支持传统的文件服务器以及公用云上的服务,这里的传统服务器也包含支持iSCSI协议的服务器。这意味着可以使用iSCSI Target新建文件服务器,然后通过iSCSI Initiator建立链接。然后设置盘符。本地测试时使用老牌工具厂商Daemon Tools的iSCSI target。挂载好并指定盘符后就可以在在容器内开始使用挂载的存储卷了。

clipboard.png

Named Volume

以上两种方式都是在 docker run 时使用-v参数指定需要挂载的本地文件夹或者映射到本地的远程存储。也可以通过 docker volume create 创建named volume,然后使用指定的名称替代本地文件夹路径进行挂载。

比如可以使用以下命令创建 named volume

docker volume create app1_mysql_data

然后使用 docker inspect 查看数据实际的存放位置

$ docker volume inspect app1_mysql_data
[
    {
        "CreatedAt": "2018-06-10T13:41:39+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "C:\\ProgramData\\Docker\\volumes\\app1_mysql_data\\_data",
        "Name": "app1_mysql_data",
        "Options": {},
        "Scope": "local"
    }
]

总结

今天讨论了和Windows容器存储的相关细节知识点,由于容器销毁后容器内数据即丢失的特性,合理的配置存储卷将帮助我们实现数据持久化。


追寻云的痕迹
301 声望6 粉丝