天天看點

Docker - Docker Volume及Volume指令詳解

Docker - Docker Volume及Volume指令詳解

什麼是資料卷(Volume)

Docker鏡像被存儲在一系列的隻讀層中。當我們建立一個容器時,Docker會讀取鏡像(隻讀),并在其頂部添加一層讀寫層。如果正在運作中的容器修改了現有檔案,該檔案将會被拷貝出底層的隻讀層,放到最頂層的讀寫層中。讀寫層中原來的舊版本檔案(未被更改過的檔案)仍然存在于鏡像中。

是以當Docker容器被删除後,再基于原來的鏡像建立容器時,将建立一個沒有任何資料更改的容器,在之前那個容器中的資料更改會丢失掉。隻讀層和讀寫層的組合被Docker稱為聯合檔案系統(Union File System)。

為了能夠持久化這些更改過的資料,并且能夠很容易實作容器間共享資料,Docker提出了Volume的概念。Volume是外部預設的聯合檔案系統或者是存在于宿主檔案系統中正常的檔案或檔案夾。

為什麼需要資料卷(Volume)

這得從Docker容器的檔案系統說起。出于效率等一系列原因,Docker容器的檔案系統在主控端上存在的方式很複雜,這會帶來下面幾個問題:

  • 不能在主控端上很友善地通路容器中的檔案。
  • 無法在多個容器之間共享資料。
  • 當容器删除時,容器中産生的資料将會丢失。

為了解決這些問題,Docker引入了資料卷(Volume) 機制。資料卷以獨立于Docker檔案系統的形式存在于主控端中。資料卷的最大特點是:其生存周期獨立于容器的生存周期。

資料卷的設計目的就是資料的持久化,因為其生存周期獨立于容器的生存周期,是以Docker不會在容器删除時删除其挂載的資料卷。是以資料卷可以帶來以下好處:

  • 資料卷可在容器之間共享或重用資料。
  • 資料卷的更改可以直接生效。
  • 資料卷的生命周期一直持續到沒有容器使用它為止。
  • 對資料卷操作不會影響到鏡像本身。
  • 資料卷可以完成容器到主控端、主控端到容器以及容器到容器之間的資料共享。

Volume指令

通過​

​docker volume help​

​可以檢視Volume有哪些指令。

[root@izoq008ryseuupz docker]# docker volume help

Usage:  docker volume COMMAND

Manage volumes

Commands:
  create      Create a volume
  inspect     Display detailed information on one or more volumes
  ls          List volumes
  prune       Remove all unused local volumes
  rm          Remove one or more volumes

Run 'docker volume COMMAND --help' for more information on a command.      

通過​

​docker volume COMMAND --help​

​可以檢視每個Volume指令的詳情。

docker volume ls

列出所有的資料卷。

[root@izoq008ryseuupz docker]# docker volume ls --help

Usage:  docker volume ls [OPTIONS]

List volumes

Aliases:
  ls, list

Options:
  -f, --filter filter   Provide filter values (e.g. 'dangling=true')
      --format string   Pretty-print volumes using a Go template
  -q, --quiet           Only display volume names      

檢視本地所有的資料卷。

docker volume ls      
[root@izoq008ryseuupz docker]# docker volume ls
DRIVER              VOLUME NAME
local               3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62f
local               5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d
local               8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22
local               08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127
local               31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a
local               208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8
local               3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ea
local               a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a
local               db153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155
local               dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c
local               f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369      

隻需要展示資料卷的名稱,可以使用​

​-q​

​選項。

docker volume ls -q      
[root@izoq008ryseuupz docker]# docker volume ls -q
3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62f
5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d
8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22
08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127
31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a
208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8
3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ea
a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a
db153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155
dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c
f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369      

其他的選項可以自己去試一試。

docker volume create

建立一個資料卷。

[root@izoq008ryseuupz docker]# docker volume create --help

Usage:  docker volume create [OPTIONS] [VOLUME]

Create a volume

Options:
  -d, --driver string   Specify volume driver name (default "local")
      --label list      Set metadata for a volume
  -o, --opt map         Set driver specific options (default map[])      

建立資料卷​

​centos-volume​

​。

[root@izoq008ryseuupz docker]# docker volume create centos-volume
centos-volume
[root@izoq008ryseuupz docker]# docker volume ls
DRIVER              VOLUME NAME
local               3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62f
local               5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d
local               8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22
local               08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127
local               31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a
local               208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8
local               3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ea
local               a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a
local               centos-volume
local               db153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155
local               dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c
local               f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369      

其他的選項可以自己去試一試。

docker volume inspect

展示一個或多個資料卷的詳細資訊。

[root@izoq008ryseuupz _data]# docker volume inspect --help

Usage:  docker volume inspect [OPTIONS] VOLUME [VOLUME...]

Display detailed information on one or more volumes

Options:
  -f, --format string   Format the output using the given Go template      

展示資料卷​

​centos-volume​

​的詳細資訊。

[root@izoq008ryseuupz _data]# docker volume inspect centos-volume
[
    {
        "CreatedAt": "2020-11-25T17:30:06+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/centos-volume/_data",
        "Name": "centos-volume",
        "Options": {},
        "Scope": "local"
    }
]      

其他的選項可以自己去試一試。

docker volume prune

移除未使用的資料卷。

[root@izoq008ryseuupz _data]# docker volume prune --help

Usage:  docker volume prune [OPTIONS]

Remove all unused local volumes

Options:
      --filter filter   Provide filter values (e.g. 'label=<label>')
  -f, --force           Do not prompt for confirmation      
docker volume prune      
[root@izoq008ryseuupz _data]# docker volume ls
DRIVER              VOLUME NAME
local               3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62f
local               5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d
local               6b5a0394e690c4e0e869ddecc0db24a748a0229c70a83db46e0f2f95e3314958
local               8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22
local               08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127
local               31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a
local               208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8
local               3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ea
local               a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a
local               c8079a1f169f2f0d93923db7b785f1033a46bdc8cf6baf73d742ebbb3c03d6a4
local               centos-volume
local               db153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155
local               dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c
local               f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369
[root@izoq008ryseuupz _data]# docker volume prune 
WARNING! This will remove all local volumes not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Volumes:
31a6cbc600b3d30d0c567b3842ce5e7944495fcc12d42008385912d32facfd7a
208ddc66938b611237d4e868cb8800a36b5390969ba7a22d2d2e65a8c173b2c8
3c1ed533ce142b49eadc15ba57b87a3bac780e89e22c06503b3e909ab69ed62f
db153ec29b07b6268e7204fc2e91a32db91797bcd8f4d92c7e2637577cd1a155
f00edae7bd06b264a25329143fa2207e998491e459c24b0c30b1f78996a49369
a4beb8e0e17a3369c8c9a447d777323df71d2b5e2f77ebfc69cc99af39e1077a
5b086d5fdb68b5a58593fdca6d6f0a9b3ead0ed929fd3961b7db48e3a928c24d
8eb0f149b72711acd9618f827fc26a9afcce63ed51f1e60ac48e752344f88f22
centos-volume
08b4d10ef219075ee8a283112be06e1df52729bf23d3216342da3f8b21a0c127
dcf0505225e08c4c4d24f0e89ac83ed02a5387620734c4add6ab4f1d8196489c
3285a7fb977eb7a87da83b2a5ff838c98037b15ec659eeff68c489e7004114ea

Total reclaimed space: 94.79MB
[root@izoq008ryseuupz _data]# docker volume ls
DRIVER              VOLUME NAME
local               6b5a0394e690c4e0e869ddecc0db24a748a0229c70a83db46e0f2f95e3314958
local               c8079a1f169f2f0d93923db7b785f1033a46bdc8cf6baf73d742ebbb3c03d6a4      

其他的選項可以自己去試一試。

docker volume rm

移除一個或多個資料卷,不能移除被容器使用的資料卷。

[root@izoq008ryseuupz _data]# docker volume rm --help

Usage:  docker volume rm [OPTIONS] VOLUME [VOLUME...]

Remove one or more volumes. You cannot remove a volume that is in use by a container.

Aliases:
  rm, remove

Examples:

$ docker volume rm hello
hello


Options:
  -f, --force   Force the removal of one or more volumes      

查詢容器​

​centos.9​

​的詳細資訊。

[root@izoq008ryseuupz ~]# docker inspect centos.9      

可以得到容器ID、資料卷挂載等資訊。

"Id": "857601f85a5adf1e1305f2f6a7c317431af6841d750b7dd947a03b0725e0ae49"      
"Mounts": [
            {
                "Type": "volume",
                "Name": "8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496",
                "Source": "/var/lib/docker/volumes/8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496/_data",
                "Destination": "centos-nwe",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ]      
[root@izoq008ryseuupz ~]# docker volume rm 8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496
Error response from daemon: remove 8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496: volume is in use - [857601f85a5adf1e1305f2f6a7c317431af6841d750b7dd947a03b0725e0ae49]      

很顯然不能移除該資料卷,因為它正在被容器ID為​

​857601f85a5adf1e1305f2f6a7c317431af6841d750b7dd947a03b0725e0ae49​

​​(容器名稱為​

​centos.9​

​)的容器使用。

是以需要先移除該容器(隻停止是不行的)。

[root@izoq008ryseuupz ~]# docker stop centos.9
centos.9
[root@izoq008ryseuupz ~]# docker rm centos.9
centos.9      

再移除該資料卷。

[root@izoq008ryseuupz ~]# docker volume rm 8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496
8aee2f0aa880dc1892a01c211101f6360158ae64867b90e5ad3685d7a4ca9496
[root@izoq008ryseuupz ~]# docker volume ls
DRIVER              VOLUME NAME
local               6b5a0394e690c4e0e869ddecc0db24a748a0229c70a83db46e0f2f95e3314958
local               3799beaa4dfc538280ecb0817a57ad92d160b6a46611e914c5c5ab832a66d3a7
local               c8079a1f169f2f0d93923db7b785f1033a46bdc8cf6baf73d742ebbb3c03d6a4      

其他的選項可以自己去試一試。