Windows Containers 大冒險: 容器存儲

前言

容器技術中最核心的一個技術點是分層存儲。在Linux下相關文件默認被存放在/var/lib/docker下,而在Windows 10下安裝Docker for Windows 後默認的存儲文件被放在 C:\ProgramData\docker 下。能夠經過在配置文件中設置 docker-root 來修改默認存放的位置。而後即便知道了文件的實際存儲位置,也不建議你們手動對文件進行修改,這些文件處於Docker的精細化管理中。mysql

細節技術點

默認C盤空間大小

默認狀況下, 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

在使用 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

目前SMB Mounts支持傳統的文件服務器以及公用雲上的服務,這裏的傳統服務器也包含支持iSCSI協議的服務器。這意味着可使用iSCSI Target新建文件服務器,而後經過iSCSI Initiator創建連接。而後設置盤符。本地測試時使用老牌工具廠商Daemon Tools的iSCSI target。掛載好並指定盤符後就能夠在在容器內開始使用掛載的存儲捲了。測試

clipboard.png

Named Volume

以上兩種方式都是在 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容器存儲的相關細節知識點,因爲容器銷燬後容器內數據即丟失的特性,合理的配置存儲卷將幫助咱們實現數據持久化。

相關文章
相關標籤/搜索