1. 程式人生 > 其它 >5-Docker儲存卷

5-Docker儲存卷

Docker儲存卷

1、Docker預設儲存機制

Docker映象由多個只讀層疊加而成,啟動容器後,Docker會載入只讀映象層並在映象棧頂部新增一個讀寫層。

如果執行中的容器修改了現有的一個已經存在的檔案,那該檔案將會從讀寫層下面的只讀層複製到讀寫層,改檔案的只讀版本仍然存在,只是已經被讀寫層中改檔案的副本所隱藏,這就是“寫時複製”機制。

2、預設機制的缺陷

  • 關閉並重啟容器,其資料不受影響,但刪除Docker容器,則其更改將會全部丟失。

  • 存在的問題

    • 儲存於聯合檔案系統中,不易於宿主機訪問
    • 容器間資料共享不變
    • 刪除容器資料會丟失。
  • 解決方案:卷

    • 卷是容器上的一個或多個目錄,此類目錄可繞過聯合檔案系統,與宿主機上的某目錄繫結
    • volume於容器初始化時自動建立。
    • 獨立於容器的生命週期實現資料持久化,因此刪除容器時不會刪除卷,也不會對未引用的卷做垃圾處理。

3、儲存卷

卷為docker提供了獨立於容器的資料管理機制

  • 可以把“映象”想象成靜態檔案,例如“程式”,把卷比作動態內容,例如“資料”,映象可以重用,卷可以共享
  • 卷實現了“程式(映象)”和“資料(卷)”分離,以及“程式(映象)”和“製作映象的主機”分離,使用者製作映象時無需再考慮映象執行的容器所在的主機環境。

4、儲存卷型別

Docker有兩種型別的卷,每種型別都在容器中存在一個掛載點,單其在宿主機上的位置有所不同

  • Bind mount volume
    • 指定容器上的路徑和宿主機上的路徑繫結
  • Docker-managed volume
    • 只指定容器上的路徑,宿主機上的對應路徑無需關係,由容器引擎自行建立。

5、使用儲存卷

為docker run命令使用-v選項即可使用volume

  • 建立使用Bind mount volume型別的儲存卷
[root@localhost ~]# docker run --name t2 -it -v /data/app/container/t1:/data --rm busybox:latest 
[root@localhost _data]# docker inspect t2
"Mounts": [
    {
        "Type": "bind",
        "Source": "/data/app/container/t1",
        "Destination": "/data",
        "Mode": "",
        "RW": true,
        "Propagation": "rprivate"
    }
],

上例會建立宿主機的/data/app/container/t1和容器/data的繫結關係,且為持久化儲存。

  • 建立使用Docker-managed volume型別的儲存卷
[root@localhost ~]# docker run --name t1 -it -v /data busybox:latest
[root@localhost ~]# docker inspect t1
"Mounts": [
    {
        "Type": "volume",
        "Name": "6475280cb20709cd0e4746421266a014d5d04525b57f950ec50d0fbdbf0cba1d",
        "Source": "/var/lib/docker/volumes/6475280cb20709cd0e4746421266a014d5d04525b57f950ec50d0fbdbf0cba1d/_data",
        "Destination": "/data",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
],
......
"Volumes": {
    "/data": {}
},

上面可以看到建立後會繫結宿主機的/var/lib/docker/volumes/6475280cb20709cd0e4746421266a014d5d04525b57f950ec50d0fbdbf0cba1d/_data目錄到容器的/data目錄

  • 多個容器的卷使用同一個主機目錄
# docker run -it --name c1 -v /docker/volumes/v1:/data busybox
# docker run -it --name c2 -v /docker/volumes/v1:/data busybox
  • 複製使用其他容器的卷,為docker run命令使用--volumes-from選項
# docker run -it --name bbox1 -v /data/volumes/v1:/data/busybox
# docker run -it --name bbox2 --volumes-from bbox1 busybox

5.1、獲取inspect資訊

使用docker inspect [containers]可以獲取到容器的詳細資訊,也可以使用指令獲取到指定的資訊

# 獲取Mounts節點資訊
[root@localhost _data]# docker inspect -f {{.Mounts}} t2      
[{bind  /data/app/container/t1 /data   true rprivate}]
 
# 獲取容器ip地址
[root@localhost _data]# docker inspect -f {{.NetworkSettings.Networks.bridge.IPAddress}} t2                
172.17.0.2
[root@localhost _data]# docker inspect -f {{.NetworkSettings.IPAddress}} t2                
172.17.0.2