『現學現忘』Docker基礎 — 30、Docker中資料卷相關命令

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

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]#

相關文章