Volume
:即資料卷。
Docker Volume
命令能讓容器從宿主主機中讀取檔案,或從容器中持久化資料到宿主主機內,讓容器與容器產生的資料分離開來,一個容器可以掛載多個不同的目錄。Volume
的生命週期是獨立於容器的生命週期之外的,即使容器刪除了,Volume
(資料卷)也會被保留下來,Docker也不會因為這個Volume
(資料卷)沒有被容器使用而回收。- 在容器中,新增或修改這個資料夾裡的檔案也不會影響容器的聯合檔案系統。
1、Volume命令說明
通過docker volume --help
可以檢視Volume
命令的詳細說明,如下:
[root@192 ~]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume # 建立一個資料卷
inspect # 列印一個或多個資料卷的詳細資訊
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
可以檢視具體命令的詳細說明。
2、Volume命令的使用
(1)建立資料卷
命令:docker volume create 自定義名稱
[root@192 ~]# docker volume create myVolume
myVolume
[root@192 ~]#
(2)檢視本地資料卷列表
命令:docker volume ls
[root@192 ~]# docker volume ls
DRIVER VOLUME NAME
# 下面三個volume是之前練習時所建立的資料卷掛載,提示這樣的volume叫匿名掛載
local 0feb6247c783f1b3620b9dff44ace0c4f4071bc7470b55472f87701c916866ad
local 1d729d58cebf058fa9b14022ddd5211d1690fe6c9084e5c0576bb52743c170c1
local 45ae2157b3cd4ea4b04f2308cbb8562f46d56e9cb19a7aedb6391d35c44ac9b9
# 這個是我們上面剛剛建立的資料卷
local myVolume
(3)列印myVolume資料卷的詳細資訊
命令:docker volume inspect 一個或多個Volume名稱
[root@192 ~]# docker volume inspect myVolume
[
{
"CreatedAt": "2021-03-19T15:13:50+08:00",
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/myVolume/_data",
"Name": "myVolume",
"Options": {},
"Scope": "local"
}
]
說明:
- 每建立一個
Volume
,Docker預設會在宿主機的/var/lib/docker/volumes/
目錄下建立一個子目錄,預設情況下目錄名是一串UUID。 - 如果指定了名稱,則目錄名是
Volume
名稱(例如上面的myVolume
)。Volume
裡的資料都儲存在這個子目錄的_data
目錄下。 MountPoint
屬性標識了,該資料卷在宿主機上的路徑為/var/lib/docker/volumes/myVolume/_data
,
Name
屬性標識了,資料卷的名稱為myVolume
。
之後我們可以把這個資料卷掛載到一個新的容器中,例如Nginx容器。
執行如下命令:
docker run --rm \
--name Nginx01 \
-p 80:80 \
-v myVolume:/usr/share/nginx/html:ro \
-d nginx
說明:
--rm
:容器停止後刪除該容器。--name Nginx01
:給容器命名。-p 80:80
:埠對映。-v myVolume:/usr/share/nginx/html:ro
:配置剛建立的資料捲到新啟動的容器。ro
:只讀。-d nginx
:後臺執行該容器。
提示:這裡主要是說明Docker Volume命令如何使用,在實際的工作用一般情況下都使用
-v
配置容器的資料卷掛載。
(4)刪除資料卷
命令:docker volume rm 一個或多個Volume名稱
# 刪除myVolume資料卷
[root@192 ~]# docker volume rm myVolume
myVolume
# 檢視本地資料卷
[root@192 ~]# docker volume ls
DRIVER VOLUME NAME
local 0feb6247c783f1b3620b9dff44ace0c4f4071bc7470b55472f87701c916866ad
local 1d729d58cebf058fa9b14022ddd5211d1690fe6c9084e5c0576bb52743c170c1
local 45ae2157b3cd4ea4b04f2308cbb8562f46d56e9cb19a7aedb6391d35c44ac9b9
[root@192 ~]#
(5)刪除所有未使用的資料卷
命令:docker volume prune
# 刪除所有未使用的資料卷
[root@192 ~]# 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: # 刪除的資料卷
0feb6247c783f1b3620b9dff44ace0c4f4071bc7470b55472f87701c916866ad
45ae2157b3cd4ea4b04f2308cbb8562f46d56e9cb19a7aedb6391d35c44ac9b9
1d729d58cebf058fa9b14022ddd5211d1690fe6c9084e5c0576bb52743c170c1
Total reclaimed space: 207MB # 回收總空間:207MB
# 檢視本地的資料,發現一個都沒有了。
[root@192 ~]# docker volume ls
DRIVER VOLUME NAME
[root@192 ~]#
提示:只要該資料卷沒有被正在執行的容器使用,都會被清楚。
3、具名掛載和匿名掛載
(1)匿名掛載
匿名掛載格式:-v /容器內路徑
或者-v /宿主機路徑:/容器內路徑
執行命令如下:
docker run -P --name nginx01 \ # 大P隨機指定埠
-v /ect/nginx \ # 匿名掛載
-d nginx
此時檢視本地Volume
列表:
[root@192 ~]# docker volume ls
DRIVER VOLUME NAME
local 9c4f90cee862dc2c79246c9d1f01119c2ae9082a50f22e12f8b69b9496e3595b
[root@192 ~]#
這個一長串的UUID就是,就是該Volume
沒有名字,稱為匿名掛載。
可以使用docker volume inspect UUID
來檢視這個Volume
的詳細資訊
[root@192 ~]# docker volume inspect 9c4f90cee862dc2c79246c9d1f01119c2ae9082a50f22e12f8b69b9496e3595b
[
{
"CreatedAt": "2021-03-19T16:35:13+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/9c4f90cee862dc2c79246c9d1f01119c2ae9082a50f22e12f8b69b9496e3595b/_data",
"Name": "9c4f90cee862dc2c79246c9d1f01119c2ae9082a50f22e12f8b69b9496e3595b",
"Options": null,
"Scope": "local"
}
]
(2)具名掛載
具名掛載格式:-v volume名稱:/容器內路徑
或者-v volume名稱:/宿主機路徑:/容器內路徑
執行命令如下:
docker run -P --name nginx02 \ # 大P隨機指定埠
-v juming-nginx:/ect/nginx \ # 匿名掛載
-d nginx
此時檢視本地Volume
列表:
[root@192 ~]# docker volume ls
DRIVER VOLUME NAME
local 9c4f90cee862dc2c79246c9d1f01119c2ae9082a50f22e12f8b69b9496e3595b
local juming-nginx
[root@192 ~]#
我們得到的就是一個具有具體名稱的Volume
。
我們通過具名掛載可以方便的找到某一個資料卷,一般情況下都使用具名掛載。
(3)Docker容器資料卷的預設掛載位置
所有的Docker容器內的卷,在沒有指定宿主機目錄的情況下,都是在宿主機的/var/nib/docker/vilumes/xxxx/data
目錄位置掛載資料。
# 進入宿主機docker目錄/var/lib/docker/,
# docker的東西都在這個目錄中。
[root@192 ~]# cd /var/lib/docker/
[root@192 docker]# ll
總用量 12
drwx--x--x. 4 root root 120 3月 15 02:00 buildkit
drwx-----x. 4 root root 150 3月 19 16:47 containers
drwx------. 3 root root 22 3月 15 02:00 image
drwxr-x---. 3 root root 19 3月 15 02:00 network
drwx-----x. 23 root root 8192 3月 19 16:47 overlay2
drwx------. 4 root root 32 3月 15 02:00 plugins
drwx------. 2 root root 6 3月 19 12:07 runtimes
drwx------. 2 root root 6 3月 15 02:00 swarm
drwx------. 2 root root 6 3月 19 16:30 tmp
drwx------. 2 root root 6 3月 15 02:00 trust
drwx-----x. 4 root root 142 3月 19 16:47 volumes
# 檢視volumes目錄,裡邊存放的都收本地Docker中的資料卷
[root@192 docker]# ll volumes/
總用量 24
drwx-----x. 3 root root 19 3月 19 16:35 9c4f90cee862dc2c79246c9d1f01119c2ae9082a50f22e12f8b69b9496e3595b
drwx-----x. 3 root root 19 3月 19 16:47 juming-nginx
-rw-------. 1 root root 32768 3月 19 16:47 metadata.db
# 進入juming-nginx中的_data目錄就能看到nginx的配置檔案nginx.conf
[root@192 docker]# cd volumes/juming-nginx/_data/
[root@192 _data]# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
[root@192 _data]#