5-Docker儲存卷
阿新 • • 發佈:2021-07-13
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