摘要:前言容器技术中最核心的一个技术点是分层存储。当容器运行在进程隔离模式下时,在容器内使用进程相关账号进行操作。挂载好并指定盘符后就可以在在容器内开始使用挂载的存储卷了。
前言
容器技术中最核心的一个技术点是分层存储。在Linux下相关文件默认被存放在/var/lib/docker下,而在Windows 10下安装Docker for Windows 后默认的存储文件被放在 C:ProgramDatadocker 下。可以通过在配置文件中设置 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:datahostname.txrSMB 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:ProgramDataDockervolumesapp1_mysql_data\_data", "Name": "app1_mysql_data", "Options": {}, "Scope": "local" } ]总结
今天讨论了和Windows容器存储的相关细节知识点,由于容器销毁后容器内数据即丢失的特性,合理的配置存储卷将帮助我们实现数据持久化。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/27329.html
摘要:而且在阅读微软的官方文档之前,推荐阅读官方的概览文档。因为微软的文档中主要提及了的一些特有概念,而容器技术本身的概念并没有被着重介绍。因此仅阅读微软现有文档并不能完整的了解容器技术。一个踢爆索尼大法丑闻的男人。以下这张图则来自官网。 前言 在开始介绍具体操作之前,需要向各位不熟悉容器技术的Windows平台下管理员和开发者做一个基础概念的普及。而且在阅读微软的官方文档之前,推荐阅读Do...
摘要:目前容器支持和。网络类型在开始介绍容器网络前,各位需要了解的虚拟交换机类型。外部虚拟交换机将连接到容器主机的的物理网卡。当容器引擎第一次运行时默认会创建名为的网络,该网络使用内部虚拟交换机及名为的系统组件。 前言 得益于现代便捷的交通网络,无论是公路,铁路还是飞机,我们的出游变得十分便利。当数据畅游在容器世界中时,也会经历各式各样的网络。目前Windows容器支持 nat, overl...
阅读 2927·2021-11-23 09:51
阅读 1634·2021-10-15 09:39
阅读 1041·2021-08-03 14:03
阅读 2850·2019-08-30 15:53
阅读 3425·2019-08-30 15:52
阅读 2458·2019-08-29 16:17
阅读 2672·2019-08-29 16:12
阅读 1626·2019-08-29 15:26