docker volume
1.什么是匿名挂载和具名挂载?
所谓匿名挂载(匿名卷),即在进行数据卷挂载的时候不指定宿主机的数据卷目录,-v
命令之后直接跟上容器内数据卷所在的路径
。
而具名挂载(命名卷)即在进行数据卷挂载的时候既指定宿主机数据卷所在路径
,又指定容器数据卷所在路径
先通过下面这种命令的方式感受一下两者的区别:
#匿名挂载(匿名卷)
docker run -d -p 6379:6379 --name mycentos -v /src/volume01
#具名挂载(命名卷) -v 宿主机数据卷所在路径:容器数据卷所在路径
docker run -d -p 6379:6379 --name mycentos -v /home/docker_volume:/src/volume01
12345
除此种方式之外,我们也可以在在dockerfile构建docker镜像的时候使用VOLUME
保留字来对数据卷进行挂载,此种挂载方式是匿名挂载的,我们可以指定一个或多个数据卷,这样只要启动了该自定义容器镜像,则会自动进行数据挂载,不会出现忘记挂载导致数据不安全
的情况。
VOLUME ["容器内数据卷路径1","容器内数据卷路径2"……]
1
由于匿名挂载的时候只是指定了容器内数据卷的路径
,至于该容器内数据卷的路径
到底和宿主机
中的哪个文件进行数据挂载,可以使用下面命令进行查看:
#查看当前正在运行的镜像容器id
[root@privateCloud / ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
38d2810685e1 fc67f9b77899 "/bin/sh -c /bin/bash" 2 hours ago Up 2 hours 80/tcp focused_williams
#使用 inspect 查看镜像信息
[root@privateCloud / ]# docker inspect 38d2810685e1(这是容器id)
#在弹出来的信息中找到下面的数据:
"Mounts": [
{
"Type": "volume",
"Name": "040a163ac1eb50ebc53b9014f2438baf3583491bfc38c0ae47c9d08ec4b009f8",
"Source": "/var/lib/docker/volumes/040a163ac1eb50ebc53b9014f2438baf3583491bfc38c0ae47c9d08ec4b009f8/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "b7e238d439bb63d681d0c962bf44632fc76f2e82e249964023842198bfb3c16c",
"Source": "/var/lib/docker/volumes/b7e238d439bb63d681d0c962bf44632fc76f2e82e249964023842198bfb3c16c/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
1234567891011121314151617181920212223242526272829303132
从上面的 Mounts 中可以看到 Destination 和 Source 分别就是 容器内的数据卷 和 宿主机内的容器卷
2.匿名卷和命名卷的区别?
命名卷在用过一次之后以后挂载容器的时候还是可以继续使用,所以一般在需要保存数据的时候使用命名卷
的方式,下面例子用以展示命名卷
对于数据的保存方式:
例:
#1.查看目前的镜像
[root@privateCloud / ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 4 months ago 237MB
#2.启动centos镜像并且使用命名挂载的方式进行数据卷挂载(此centos是官网下载的官方镜像包)
[root@privateCloud / ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac
48dece440eb377a466d72327895c5ed24a75823e70ffebf40fee0e2fe9e4c66e
#3.查看刚刚启动的容器id
[root@privateCloud / ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48dece440eb3 470671670cac "/bin/bash" 4 minutes ago Up 4 minutes mycentos
#4.进入容器内部
[root@privateCloud / ]# docker exec -it 48dece440eb3 /bin/bash
#5.查看/usr/local/,发现多了一个 volume01文件夹
[root@48dece440eb3 /]# cd /usr/local/
[root@48dece440eb3 local]# ls
bin etc games include lib lib64 libexec sbin share src volume01
#6.创建一个txt文件
[root@48dece440eb3 local]# cd volume01/
[root@48dece440eb3 volume01]# touch file01.txt
[root@48dece440eb3 volume01]# vi file01
#随便输入一段话
this file create in container
[root@48dece440eb3 volume01]# ls
file01.txt
#7.使用 ctrl+p+Q 不停止容器退出
#8.进行宿主机 容器卷 所在路径
[root@privateCloud /home/centos_volume ]# cd /home/centos_volume/
#9.发现多了一个 file01文件,说明数据挂载成功
[root@privateCloud /home/centos_volume ]# ll
total 0
-rw-r--r-- 1 root root 0 Jun 1 17:17 file01.txt
#10.此时将启动的容器停掉:
[root@privateCloud /home/centos_volume ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
48dece440eb3 470671670cac "/bin/bash" 8 minutes ago Up 8 minutes mycentos
[root@privateCloud /home/centos_volume ]# docker stop 48dece440eb3
48dece440eb3
#11.然后重新进入该容器
[root@privateCloud /usr/local ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 4 months ago 237MB
[root@privateCloud /usr/local ]# docker run -it -d --name mycentos -v /home/centos_volume:/usr/local/volume01 470671670cac
#12.直接到 /usr/local/volume01路径
[root@privateCloud /usr/local ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a842a7e8d514 470671670cac "/bin/bash" 2 minutes ago Up 2 minutes mycentos
[root@privateCloud /usr/local ]# docker exec -it a842a7e8d514 /bin/bash
[root@a842a7e8d514 /]# cd /usr/local/volume01/
[root@a842a7e8d514 volume01]# ls
file01.txt
#13.查看该file01.txt文件
[root@a842a7e8d514 volume01]# cat file01.txt
this file create in container
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
匿名卷则是随着容器的建立而建立,随着容器的关闭而消亡。匿名卷一般用来存储无关痛痒的数据。
#1.查看镜像
[root@privateCloud /usr/local ]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos latest 470671670cac 4 months ago 237MB
#2.使用匿名挂载的方式只指定容器内数据卷所在路径启动镜像
[root@privateCloud /usr/local ]# docker run -it -d --name mycentos -v /usr/local/centos 470671670cac
175034d3759bb678877fcaaba6db2b9cd50aa9e61a7cb5770a48370032f07d1f
#3.进入 容器内数据卷所在路径
[root@privateCloud /usr/local ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
175034d3759b 470671670cac "/bin/bash" About a minute ago Up About a minute mycentos
[root@privateCloud /usr/local ]# docker exec -it 175034d3759b /bin/bash
[root@175034d3759b /]# cd /usr/local/centos/
#4.编辑一个文件
[root@175034d3759b centos]# vi file02
[root@175034d3759b centos]# cat file02
this file create in container222222222
#5.使用ctrl+p+Q命令不停止并退出容器
#6.查看当前容器数据卷挂载在宿主机的文件路径
[root@privateCloud /home ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
175034d3759b 470671670cac "/bin/bash" 7 minutes ago Up 7 minutes mycentos
[root@privateCloud /home ]# docker inspect 175034d3759b
#7.从显示的信息中找到Mounts
"Mounts": [
{
"Type": "volume",
"Name": "226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e",
"Source": "/var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data",
"Destination": "/usr/local/centos",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
#8.进入宿主机挂载的路径目录中
[root@privateCloud /home ]# cd /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data
[root@privateCloud /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data ]# ll
total 4
-rw-r--r-- 1 root root 39 Jun 1 17:45 file02
#9.发现该目录下也生成了file02文件
[root@privateCloud /var/lib/docker/volumes/226304086cb9042ae7150d5e27c55b88383b36c68b2796dd6a4647dc4e78ca7e/_data ]# cat file02
this file create in container222222222
#10.关闭当前容器并重新使用匿名方式启动
[root@privateCloud / ]# docker run -it -d -v /usr/local/centos 470671670cac
19a23edc6aebd23109437cac91e0011737d3e0cb29d0fad99ea884193409ec9e
#11.进入容器
[root@privateCloud / ]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
19a23edc6aeb 470671670cac "/bin/bash" 32 seconds ago Up 32 seconds laughing_wiles
[root@privateCloud / ]# docker exec -it 19a23edc6aeb /bin/bash
[root@19a23edc6aeb /]# cd /usr/local/centos/
#12.发现重新启动之后,该数据卷之下的数据没有了,但是命名卷在重启之后数据就还在
[root@19a23edc6aeb centos]# ls
[root@19a23edc6aeb centos]#
ps
本文摘抄自[这里][https://blog.csdn.net/qq_43655835/article/details/106478731]