『現學現忘』Docker基礎 — 28、Docker容器資料卷介紹

繁華似錦Fighting發表於2022-03-21

1、什麼是Docker容器資料卷

Docker容器資料卷,即Docker Volume(卷)。

當Docker容器執行的時候,會產生一系列的資料檔案,這些資料檔案會在關閉Docker容器時,直接消失的。但是其中產生部分的資料內容,我們是希望能夠把它給儲存起來,另作它用的。

所以我們期望:

  • 將應用與執行的環境打包形成容器執行,伴隨著容器執行產生的資料,我們希望這些資料能夠持久化。
  • 希望容器之間也能夠實現資料的共享。

根據我們之前所學,Docker容器產生的資料,如果不通過docker commit命令生成新的映象,把資料做為映象的一部分儲存下來。那麼當容器刪除後,資料自然也就沒有了。但為了能儲存Docker容器中的資料,Docker為我們提供了卷技術(Volume)。

總結:Docker容器中產生的資料,同步到本地,這就是卷技術。也就是通過目錄的掛載,將容器內的目錄,掛載到Linux系統上面,實現容器資料的持久化。

2、資料卷的作用

資料卷就是目錄或檔案,存在於一個或多個容器中,由Docker掛載到容器,但不屬於聯合檔案系統,因此能夠繞過Union File System(聯合檔案系統),提供一些用於持續儲存或共享資料的特性。

資料卷的設計目的就是為了Doeker容器中資料的持久化,完全獨立於容器的生存週期,Docker不會在容器刪除時,刪除其掛載的資料卷。

資料卷:

  1. 資料卷可在容器之間共享或重用資料。
  2. 資料卷中的更改可以直接生效。
  3. 資料卷中的更改不會包含在映象的更新中。
  4. 資料卷的生命週期一直持續到沒有容器使用它為止。

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屬性,說明資料卷掛載已經成功。

相關文章