1、什麼是Docker容器資料卷
Docker容器資料卷,即Docker Volume
(卷)。
當Docker容器執行的時候,會產生一系列的資料檔案,這些資料檔案會在關閉Docker容器時,直接消失的。但是其中產生部分的資料內容,我們是希望能夠把它給儲存起來,另作它用的。
所以我們期望:
- 將應用與執行的環境打包形成容器執行,伴隨著容器執行產生的資料,我們希望這些資料能夠持久化。
- 希望容器之間也能夠實現資料的共享。
根據我們之前所學,Docker容器產生的資料,如果不通過docker commit
命令生成新的映象,把資料做為映象的一部分儲存下來。那麼當容器刪除後,資料自然也就沒有了。但為了能儲存Docker容器中的資料,Docker為我們提供了卷技術(Volume
)。
總結:Docker容器中產生的資料,同步到本地,這就是卷技術。也就是通過目錄的掛載,將容器內的目錄,掛載到Linux系統上面,實現容器資料的持久化。
2、資料卷的作用
資料卷就是目錄或檔案,存在於一個或多個容器中,由Docker掛載到容器,但不屬於聯合檔案系統,因此能夠繞過Union File System
(聯合檔案系統),提供一些用於持續儲存或共享資料的特性。
資料卷的設計目的就是為了Doeker容器中資料的持久化,完全獨立於容器的生存週期,Docker不會在容器刪除時,刪除其掛載的資料卷。
資料卷:
- 資料卷可在容器之間共享或重用資料。
- 資料卷中的更改可以直接生效。
- 資料卷中的更改不會包含在映象的更新中。
- 資料卷的生命週期一直持續到沒有容器使用它為止。
3、資料卷的使用
使用-v
引數給容器新增資料卷,Volume
(卷)的首字母。
我們以CentOS容器為例進行演示。
步驟1:下載CentOS映象。
# docker pull centos
[root@192 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 300e315adb2f 3 months ago 209MB
步驟2:啟動CentOS映象,並掛載資料卷。
命令:docker run -it -v /宿主機絕對路徑目錄:/容器內目錄 映象名或映象ID
我們希望宿主機/home
中的HostDataVolume
目錄和容器中/home
中的ContainerDataVolume
目錄實現資料卷掛載。
我們先來檢視宿主機/home
目錄的內容,如下:
[root@192 ~]# ll /home/
總用量 0
沒有任何檔案。
執行啟動CentOS容器命令:
# 啟動centos容器
[root@192 ~]# docker run -it -v /home/HostDataVolume:/home/ContainerDataVolume centos /bin/bash
# 檢視centos容器中/home目錄中內容
[root@5f63a0fc88c5 /]# ls /home/
ContainerDataVolume
# 我們可以看到在centos容器的/home目錄裡,有ContainerDataVolume目錄
# 這個目錄肯定是容器啟動後,根據
# -v /home/HostDataVolume:/home/ContainerDataVolume建立的。
我們在來看看宿主機上/home
目錄的內容,如下:
[root@192 ~]# ls /home/
HostDataVolume
發現生成了HostDataVolume
資料夾,說明我們資料卷的掛著初步成功。
提示:掛載的資料夾可以存在也可以不存在,不存在則會自動建立。
步驟3:驗證CentOS容器資料卷是否掛著成功。
我們可以使用docker inspect
命令,來檢視CentOS容器的詳細資料。
[root@192 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
5f63a0fc88c5 centos "/bin/bash" 10 minutes ago Up 10 minutes
# 檢視centos容器的詳細資料
[root@192 ~]# docker inspect 5f63a0fc88c5
[
{
"Id": "5f63a0fc88c5ef2804a45dff0fbf82ae153f2df04887427a3057668867d64443",
"Created": "2021-03-18T11:35:14.632025511Z",
... # 省略
... # 省略
"HostConfig": { # 主機配置
"Binds": [
"/home/HostDataVolume:/home/ContainerDataVolume"
],
... # 省略
},
... # 省略
"Mounts": [ # 容器掛載的資料卷
{
"Type": "bind",
"Source": "/home/HostDataVolume", # 宿主機內地址
"Destination": "/home/ContainerDataVolume", # Docker容器內的地址
"Mode": "", # 兩目錄就好比同一個目錄。
"RW": true, # 支援讀寫操作
"Propagation": "rprivate"
}
],
"Config": {
... # 省略
# 新版的Dodker把Volumes資訊放到了Mounts的Json字待串裡了
"Volumes": null,
... # 省略
}
... # 省略
}
]
[root@192 ~]#
看到上面的資訊,主要是Mounts
屬性,說明資料卷掛載已經成功。