前言
容器技术中最核心的一个技术点是分层存储。在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。挂载好并指定盘符后就可以在在容器内开始使用挂载的存储卷了。
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容器存储的相关细节知识点,由于容器销毁后容器内数据即丢失的特性,合理的配置存储卷将帮助我们实现数据持久化。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。