容器使用存储卷实战
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 ~]#
Categories: