资讯专栏INFORMATION COLUMN

Windows Containers 大冒险: 容器存储

cgh1999520 / 1973人阅读

摘要:前言容器技术中最核心的一个技术点是分层存储。当容器运行在进程隔离模式下时,在容器内使用进程相关账号进行操作。挂载好并指定盘符后就可以在在容器内开始使用挂载的存储卷了。

前言

容器技术中最核心的一个技术点是分层存储。在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.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:ProgramDataDockervolumesapp1_mysql_data\_data",
        "Name": "app1_mysql_data",
        "Options": {},
        "Scope": "local"
    }
]
总结

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27329.html

相关文章

  • Windows Containers 冒险: 术语

    摘要:而且在阅读微软的官方文档之前,推荐阅读官方的概览文档。因为微软的文档中主要提及了的一些特有概念,而容器技术本身的概念并没有被着重介绍。因此仅阅读微软现有文档并不能完整的了解容器技术。一个踢爆索尼大法丑闻的男人。以下这张图则来自官网。 前言 在开始介绍具体操作之前,需要向各位不熟悉容器技术的Windows平台下管理员和开发者做一个基础概念的普及。而且在阅读微软的官方文档之前,推荐阅读Do...

    caige 评论0 收藏0
  • Windows Containers 冒险: 容器网络

    摘要:目前容器支持和。网络类型在开始介绍容器网络前,各位需要了解的虚拟交换机类型。外部虚拟交换机将连接到容器主机的的物理网卡。当容器引擎第一次运行时默认会创建名为的网络,该网络使用内部虚拟交换机及名为的系统组件。 前言 得益于现代便捷的交通网络,无论是公路,铁路还是飞机,我们的出游变得十分便利。当数据畅游在容器世界中时,也会经历各式各样的网络。目前Windows容器支持 nat, overl...

    denson 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<