容器使用存储卷实战

1.什么是存储卷

所谓的存储卷就是一种持久化容器数据的一种存储方案。

2.存储卷的基本管理

2.1 清空容器
[root@elk92 ~]# docker container rm -f `docker container ps -qa`

2.2 查看本地的存储卷列表 
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
local     0bd65347815590fc2b97b905ce1956cc95ec5a426e5b651abd51ee5bd9728a3a
local     9855be3402732954195ae84bde12747543b21248559dcfe12334e2a6c501bd38
local     f9ef3a710d56b5d971961c1ff7c4591353ab86fbe8db4b4774ecb345a2714416
[root@elk92 ~]# 

2.3 清理存储卷【清理所有未使用的存储卷】

[root@elk92 ~]# docker volume prune -f
Deleted Volumes:
9855be3402732954195ae84bde12747543b21248559dcfe12334e2a6c501bd38
0bd65347815590fc2b97b905ce1956cc95ec5a426e5b651abd51ee5bd9728a3a
f9ef3a710d56b5d971961c1ff7c4591353ab86fbe8db4b4774ecb345a2714416

Total reclaimed space: 638.8MB
[root@elk92 ~]# 
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
[root@elk92 ~]# 

2.4 创建存储卷
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
[root@elk92 ~]# 
[root@elk92 ~]# docker volume create custom-example  # 创建存储卷指定名称
custom-example
[root@elk92 ~]# 
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
local     custom-example
[root@elk92 ~]# 
[root@elk92 ~]# 
[root@elk92 ~]# docker volume create   # 若不指定存储卷的名称则默认会生成一个匿名(随机)存储卷。
8ee576eb01877bc9feb422d4184ef662c6a7fd1672e459f5803efc8f44d1f4ca
[root@elk92 ~]# 
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
local     8ee576eb01877bc9feb422d4184ef662c6a7fd1672e459f5803efc8f44d1f4ca
local     oldboyedu-linux96
[root@elk92 ~]# 

2.5 删除指定的存储卷
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
local     8ee576eb01877bc9feb422d4184ef662c6a7fd1672e459f5803efc8f44d1f4ca
local     custom-example
[root@elk92 ~]# 
[root@elk92 ~]# 
[root@elk92 ~]# docker volume rm   8ee576eb01877bc9feb422d4184ef66...
8ee576eb01877bc9feb422d4184ef662c6a7fd1672e459f5803efc8f44d1f4ca
[root@elk92 ~]# 
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
local     custom-example
[root@elk92 ~]# 

2.6 查看一个存储卷的详细信息
[root@elk92 ~]# docker volume inspect custom-example
[
    {
        "CreatedAt": "2025-03-20T09:23:06+08:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/custom-example/_data",
        "Name": "custom-example",
        "Options": {},
        "Scope": "local"
    }
]
[root@elk92 ~]# 
[root@elk92 ~]# ll /var/lib/docker/volumes/custom-example/_data
total 8
drwxr-xr-x 2 root root 4096 Mar 20 09:23 ./
drwx-----x 3 root root 4096 Mar 20 09:23 ../
[root@elk92 ~]# 
  • 3.将存储卷给一个容器使用
3.1 容器使用特定的存储卷
[root@elk92 ~]# ll /var/lib/docker/volumes/custom-example/_data
total 8
drwxr-xr-x 2 root root 4096 Mar 20 09:23 ./
drwx-----x 3 root root 4096 Mar 20 09:23 ../
[root@elk92 ~]# 
[root@elk92 ~]# 
[root@elk92 ~]# 
[root@elk92 ~]# docker run -d --name c2 -v custom-example:/usr/share/nginx/html registry.cn-hangzhou.aliyuncs.com/violet-k8s/apps:v1 
a8cdc8eaecb5d0247b672c5a138c71193ab8e71dbf657ff9f573d5e56f2611d5
[root@elk92 ~]# 
[root@elk92 ~]# ll /var/lib/docker/volumes/custom-example/_data
total 244
drwxr-xr-x 2 root root   4096 Mar 20 09:26 ./
drwx-----x 3 root root   4096 Mar 20 09:23 ../
-rw-r--r-- 1 root root 233472 Jan 20  2024 1.jpg
-rw-r--r-- 1 root root    494 May 25  2021 50x.html
-rw-r--r-- 1 root root    357 Jan 20  2024 index.html
[root@elk92 ~]# 
[root@elk92 ~]# 

3.2 修改容器的数据

[root@elk92 ~]# docker container inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" c2
172.17.0.2
[root@elk92 ~]# 
[root@elk92 ~]# curl 172.17.0.2
<!DOCTYPE html>
<html>
  <head>
    <meta charset="utf-8"/>
    <title>yinzhengjie apps v1</title>
    <style>
       div img {
          width: 900px;
          height: 600px;
          margin: 0;
       }
    </style>
  </head>

  <body>
    <h1 style="color: green">凡人修仙传 v1 </h1>
    <div>
      <img src="1.jpg">
    <div>
  </body>

</html>
[root@elk92 ~]# 
[root@elk92 ~]# docker exec -it c2 sh
/ # echo www.vionletarchitect.top > /usr/share/nginx/html/index.html 
/ # 
/ # cat /usr/share/nginx/html/index.html 
www.vionletarchitect.top
/ # 
[root@elk92 ~]# 
[root@elk92 ~]# curl 172.17.0.2
www.vionletarchitect.top
[root@elk92 ~]# 
[root@elk92 ~]# cat /var/lib/docker/volumes/custom-example/_data/index.html 
www.vionletarchitect.top
[root@elk92 ~]# 

3.3 删除容器观察存储卷是否删除
[root@elk92 ~]# docker rm -f c2 
c2
[root@elk92 ~]# 
[root@elk92 ~]# ll /var/lib/docker/volumes/custom-example/_data/  # 发现数据并没有丢失
total 244
drwxr-xr-x 2 root root   4096 Mar 20 09:26 ./
drwx-----x 3 root root   4096 Mar 20 09:23 ../
-rw-r--r-- 1 root root 233472 Jan 20  2024 1.jpg
-rw-r--r-- 1 root root    494 May 25  2021 50x.html
-rw-r--r-- 1 root root     18 Mar 20 09:28 index.html
[root@elk92 ~]# 

3.4 重新创建新的容器并使用之前的存储卷
[root@elk92 ~]# docker run -d --name c3 -v custom-example:/usr/share/nginx/html registry.cn-hangzhou.aliyuncs.com/violet-k8s/apps:v1 
3a79ca38546481517a35a55e49c4105a37808df68ce78d3ac1694f30f5a00eba
[root@elk92 ~]# 
[root@elk92 ~]# docker container inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" c3
172.17.0.2
[root@elk92 ~]# 
[root@elk92 ~]# curl 172.17.0.2
www.vionletarchitect.top
[root@elk92 ~]# 

3.5 将多个容器挂载到同一个存储卷
[root@elk92 ~]# docker run -d --name c4 -v custom-example:/usr/share/nginx/html registry.cn-hangzhou.aliyuncs.com/violet-k8s/apps:v1 
9fd1654da34116af2c181f2f28200fc1b6f085c4b6c211270c92a9a2445ad58c
[root@elk92 ~]# 
[root@elk92 ~]# docker container inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" c4
172.17.0.3
[root@elk92 ~]# 
[root@elk92 ~]# curl 172.17.0.3
www.vionletarchitect.top
[root@elk92 ~]# 
[root@elk92 ~]# docker exec -it c4 sh
/ # echo violet > /usr/share/nginx/html/index.html 
/ # 
[root@elk92 ~]# 
[root@elk92 ~]# curl 172.17.0.3
violet
[root@elk92 ~]# 
[root@elk92 ~]# curl 172.17.0.2
violet
[root@elk92 ~]# 

3.6 新建容器和现有的容器使用相同的存储卷信息
[root@elk92 ~]# docker run -d --name c5 --volumes-from c4 registry.cn-hangzhou.aliyuncs.com/violet-k8s/apps:v1 
de5f6acba7c49f7f7d612213d68065ef179f72ec50b31877bf3bf11fc94755fe
[root@elk92 ~]# 
[root@elk92 ~]# docker container inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" c5
172.17.0.4
[root@elk92 ~]# 
[root@elk92 ~]# curl 172.17.0.4
violet
[root@elk92 ~]# 

容器使用存储卷注意事项

  • 1.存储卷不存在会自动创建
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
[root@elk92 ~]# 
[root@elk92 ~]# docker run -v custom-example:/usr/share/nginx/html -d --name c1 registry.cn-hangzhou.aliyuncs.com/violet-k8s/apps:v1 
a3a26860c5dc66c69ba689ed586712bd2e2b0c7f43c037dfe7ea79411c593007
[root@elk92 ~]# 
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
local     oldboyedu
[root@elk92 ~]# 
[root@elk92 ~]# docker volume inspect custom-example 
[
    {
        "CreatedAt": "2025-03-20T10:06:45+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/oldboyedu/_data",
        "Name": "custom-example",
        "Options": null,
        "Scope": "local"
    }
]
[root@elk92 ~]# ll /var/lib/docker/volumes/custom-example/_data
total 244
drwxr-xr-x 2 root root   4096 Mar 20 10:06 ./
drwx-----x 3 root root   4096 Mar 20 10:06 ../
-rw-r--r-- 1 root root 233472 Jan 20  2024 1.jpg
-rw-r--r-- 1 root root    494 May 25  2021 50x.html
-rw-r--r-- 1 root root    357 Jan 20  2024 index.html
[root@elk92 ~]# 
  • 2.若不指定存储卷则会自动创建匿名存储卷
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
local     oldboyedu
[root@elk92 ~]# 
[root@elk92 ~]# docker run -v /usr/share/nginx/html -d --name c2 registry.cn-hangzhou.aliyuncs.com/violet-k8s/apps:v1 
390e754181d6d57de79800ca5b71a12a2501c5d40516c9baf3ea45bea6ae66af
[root@elk92 ~]# 
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
local     22d11c315365fe99f0810c343c89c37f60779c5633c6b54fbd2471baad1200b2
local     oldboyedu
[root@elk92 ~]# 
[root@elk92 ~]# 
[root@elk92 ~]# docker volume inspect 22d11c315365fe99f0810c343c89c37f60779c5633c6b54fbd2471baad1200b2 
[
    {
        "CreatedAt": "2025-03-20T10:08:00+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/22d11c315365fe99f0810c343c89c37f60779c5633c6b54fbd2471baad1200b2/_data",
        "Name": "22d11c315365fe99f0810c343c89c37f60779c5633c6b54fbd2471baad1200b2",
        "Options": null,
        "Scope": "local"
    }
]
[root@elk92 ~]# 
[root@elk92 ~]# ll /var/lib/docker/volumes/22d11c315365fe99f0810c343c89c37f60779c5633c6b54fbd2471baad1200b2/_data
total 244
drwxr-xr-x 2 root root   4096 Mar 20 10:08 ./
drwx-----x 3 root root   4096 Mar 20 10:08 ../
-rw-r--r-- 1 root root 233472 Jan 20  2024 1.jpg
-rw-r--r-- 1 root root    494 May 25  2021 50x.html
-rw-r--r-- 1 root root    357 Jan 20  2024 index.html
[root@elk92 ~]# 
  • 3.容器删除匿名存储卷
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
local     22d11c315365fe99f0810c343c89c37f60779c5633c6b54fbd2471baad1200b2
local     custom-example
[root@elk92 ~]# 
[root@elk92 ~]# 
[root@elk92 ~]# docker ps -a
CONTAINER ID   IMAGE                                                       COMMAND                  CREATED          STATUS          PORTS     NAMES
390e754181d6   registry.cn-hangzhou.aliyuncs.com/violet-k8s/apps:v1   "/docker-entrypoint.…"   46 seconds ago   Up 45 seconds   80/tcp    c2
a3a26860c5dc   registry.cn-hangzhou.aliyuncs.com/violet-k8s/apps:v1   "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes    80/tcp    c1
[root@elk92 ~]# 
[root@elk92 ~]# 
[root@elk92 ~]# docker container rm -f -v `docker ps -aq`  # 注意,使用-v选项可以删除匿名的存储卷。
390e754181d6
a3a26860c5dc
[root@elk92 ~]# 
[root@elk92 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@elk92 ~]# 
[root@elk92 ~]# docker volume ls
DRIVER    VOLUME NAME
local     custom-example
[root@elk92 ~]# 
  • 4.使用宿主机的某个路径作为存储卷挂载到容器【如果容器有数据,会将之前的内容清空】
[root@elk92 ~]# mkdir /data
[root@elk92 ~]# 
[root@elk92 ~]# echo "欢迎来到天暗星小作坊~" > /data/index.html
[root@elk92 ~]# 
[root@elk92 ~]# ll /data/
total 12
drwxr-xr-x  2 root root 4096 Mar 20 10:11 ./
drwxr-xr-x 23 root root 4096 Mar 20 10:10 ../
-rw-r--r--  1 root root   41 Mar 20 10:11 index.html
[root@elk92 ~]# 
[root@elk92 ~]# cat /data/index.html 
欢迎来到天暗星小作坊~
[root@elk92 ~]# 
[root@elk92 ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED   STATUS    PORTS     NAMES
[root@elk92 ~]# 
[root@elk92 ~]# docker run -v /data:/usr/share/nginx/html -d --name c1 registry.cn-hangzhou.aliyuncs.com/violet-k8s/apps:v1 
fc03e0faa05b95687defd41bb9e6a86c91d9a1ded48ffd125dc5fc7c9d70c0b8
[root@elk92 ~]# 
[root@elk92 ~]# docker container inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" c1
172.17.0.2
[root@elk92 ~]# 
[root@elk92 ~]# curl 172.17.0.2
欢迎来到天暗星小作坊~
[root@elk92 ~]# 
[root@elk92 ~]# ll /data/
total 12
drwxr-xr-x  2 root root 4096 Mar 20 10:11 ./
drwxr-xr-x 23 root root 4096 Mar 20 10:10 ../
-rw-r--r--  1 root root   41 Mar 20 10:11 index.html
[root@elk92 ~]# 
  • 5.如果挂载宿主机的某个目录不存在,则会自动创建【尽管该目录没有数据,也会将容器的数据清空】
[root@elk92 ~]# ll /data3
ls: cannot access '/data3': No such file or directory
[root@elk92 ~]# 
[root@elk92 ~]# docker run -v /data3:/usr/share/nginx/html -d --name c3 registry.cn-hangzhou.aliyuncs.com/violet-k8s/apps:v1 
42d9e15a2fab660dd0742431bd2a09da37b47b393cc5416d2a93afc6e3e9308d
[root@elk92 ~]# 
[root@elk92 ~]# ll /data3
total 8
drwxr-xr-x  2 root root 4096 Mar 20 10:13 ./
drwxr-xr-x 25 root root 4096 Mar 20 10:13 ../
[root@elk92 ~]# 
[root@elk92 ~]# docker container inspect -f "{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}" c3
172.17.0.3
[root@elk92 ~]# 
[root@elk92 ~]# curl 172.17.0.3
<html>
<head><title>403 Forbidden</title></head>
<body>
<center><h1>403 Forbidden</h1></center>
<hr><center>nginx/1.20.1</center>
</body>
</html>
[root@elk92 ~]#