容器技术中最核心的一个技术点是分层存储。在Linux下相关文件默认被存放在/var/lib/docker下,而在Windows 10下安装Docker for Windows 后默认的存储文件被放在 C:\ProgramData\docker 下。能够经过在配置文件中设置 docker-root 来修改默认存放的位置。而后即便知道了文件的实际存储位置,也不建议你们手动对文件进行修改,这些文件处于Docker的精细化管理中。mysql
默认状况下, microsoft/windowsservercore:1803 的镜像C盘空间大小为20G。咱们能够经过如下命令进入容器内部,而后使用PowerShell命令确认。sql
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}}
命令的输出结果以下:docker
DriveLetter CapacityInGB FreeSpaceInGB ----------- ------------ ------------- C: 19.8740043640137 19.7209014892578
若是这个默认大小不能知足部分软件的剩余空间检查条件,那么能够在docker run时使用--storage-opt "size=50GB"进行修改,而后再次运行以前的PowerShell命令进行确认。shell
DriveLetter CapacityInGB FreeSpaceInGB ----------- ------------ ------------- C: 49.8740005493164 49.7309150695801
在Windows中容器的持久化存储有几种方式,好比Bind Mounts, Named Volumes,以及在Bind Mounts中还支持SMB共享文件夹。windows
在使用 Bind Mounts 时咱们须要注意权限问题。当容器运行在Hyper-V隔离模式下时,容器对主机文件夹是经过LocalSystem帐号进行访问的,并提供简单的只读和读写两种访问模型。若是发现没有权限访问主机文件夹,则只须要在主机文件夹上增长LocalSystem的访问权限便可。服务器
当容器运行在进程隔离模式下时,在容器内使用进程相关帐号进行操做。默认状况下microsoft/windowsservercore使用ContainterAdmin,而microsoft/nanoserver使用ContainerUser,来访问主机文件夹的。然而ContainterAdmin和ContainerUser仅存在于容器环境中,所以在主机上进行权限配置时须要使用Authenticated Users。还须要注意的一点是,若是主机文件夹中包含符号连接,那这些主机上符号连接是在容器内解析的,所以容器内没法访问。app
如下是 Bind Mounts 的一个例子, 容器启动后经过hostname讲主机名写入到挂载的存储卷中。工具
docker run --rm -it -v c:/apps/dockerdata:c:/data microsoft/nanoserver:1803 cmd hostname > c:\data\hostname.txr
目前SMB Mounts支持传统的文件服务器以及公用云上的服务,这里的传统服务器也包含支持iSCSI协议的服务器。这意味着可使用iSCSI Target新建文件服务器,而后经过iSCSI Initiator创建连接。而后设置盘符。本地测试时使用老牌工具厂商Daemon Tools的iSCSI target。挂载好并指定盘符后就能够在在容器内开始使用挂载的存储卷了。测试
以上两种方式都是在 docker run 时使用-v参数指定须要挂载的本地文件夹或者映射到本地的远程存储。也能够经过 docker volume create 建立named volume,而后使用指定的名称替代本地文件夹路径进行挂载。spa
好比可使用如下命令建立 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容器存储的相关细节知识点,因为容器销毁后容器内数据即丢失的特性,合理的配置存储卷将帮助咱们实现数据持久化。