https://docs.docker.com/engine/reference/commandline/volume_create/
Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷的特点:
命令:
docker run -it -v 主机目录:容器目录 镜像
运行centos:
[root@VM-4-17-centos home]# docker run -it -v /home/ceshi:/home centos /bin/bash
[root@c5eb5967894d /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
结果:host机中生成了一个ceshi目录
[root@VM-4-17-centos ~]# ls /home
ceshi java_program JiKeZhang lighthouse shell_program www
docker inspect c5eb5967894d 查看容器信息

共享数据测试:
[root@VM-4-17-centos ceshi]# touch test.java # 在主机对应的目录中添加一个文件
[root@VM-4-17-centos ceshi]# ls
test.java
[root@c5eb5967894d home]# ls # 查看容器中对应目录下的文件
test.java
docker pull mysql:下载最新的mysql镜像
docker pull mysql
启动:
[root@VM-4-17-centos home]# docker run -d -p 3306:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql
5e45350f42b5164b0cc0f511d39dafb6839fcc5946e7c0766a476a0e56feda1d
[root@VM-4-17-centos home]#
使用navicat等工具连接测试即可
(1) 匿名挂载:
[root@VM-4-17-centos docker]# docker run -d --name nginx01 -p 3344:80 -v /etc/nginx nginx
[root@VM-4-17-centos docker]# docker volume ls
DRIVER VOLUME NAME
local 8bf3a19c90e0ead92c1d629c496520c24e5f10b90f45ce2c54250baf5637f63d
local c1b588271c994e07fc66e8d0a7d97e4470b2b9a0f12a8529b73858f3fde425ad
(2) 具名挂载
[root@VM-4-17-centos docker]# docker run -d --name nginx02 -p 3345:80 -v juming:/etc/nginx nginx
59c57a689f7e13d4bdffb1b3f58444559dd543ce6ba9d8f27b705a1eb208d6a4
[root@VM-4-17-centos docker]#
[root@VM-4-17-centos docker]# docker volume ls
DRIVER VOLUME NAME
local 8bf3a19c90e0ead92c1d629c496520c24e5f10b90f45ce2c54250baf5637f63d
local c1b588271c994e07fc66e8d0a7d97e4470b2b9a0f12a8529b73858f3fde425ad
local juming
[root@VM-4-17-centos docker]# docker volume inspect juming
[
{
"CreatedAt": "2022-05-11T00:10:39+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming/_data", #主机内的目录
"Name": "juming",
"Options": null,
"Scope": "local"
}
]
/var/lib/docker/volumes[root@VM-4-17-centos docker]# cd /var/lib/docker/volumes
[root@VM-4-17-centos volumes]# ls
8bf3a19c90e0ead92c1d629c496520c24e5f10b90f45ce2c54250baf5637f63d backingFsBlockDev c1b588271c994e07fc66e8d0a7d97e4470b2b9a0f12a8529b73858f3fde425ad juming metadata.db
(3) 拓展
docker run -d --name nginx02 -p 3345:80 -v juming:/etc/nginx;ro nginx
或者
docker run -d --name nginx02 -p 3345:80 -v juming:/etc/nginx;rw nginx
ro:(read only) 表示容器只有读的权限
rw:(read write) 表示容器有读和写的权限(默认就是rw)
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
注意:这里的每一个命令,都各是一个镜像的一层。
[root@VM-4-17-centos docker-test-volume]# docker build -f ./dockerfile1 -t zhxcentos:1.0 .
Sending build context to Docker daemon 2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in 70814db381a5
Removing intermediate container 70814db381a5
---> 3db65aef8482
Step 3/4 : CMD echo "----end----"
---> Running in 92cdf24fdfef
Removing intermediate container 92cdf24fdfef
---> 440c1fcbc31f
Step 4/4 : CMD /bin/bash
---> Running in 6c860a2f7efd
Removing intermediate container 6c860a2f7efd
---> d3bf78adc986
Successfully built d3bf78adc986
Successfully tagged zhxcentos:1.0
[root@VM-4-17-centos docker-test-volume]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
zhxcentos 1.0 d3bf78adc986 8 seconds ago 231MB
[root@VM-4-17-centos docker-test-volume]# docker run -it d3bf78adc986 /bin/bash
[root@cbd17bdad4e4 /]#


如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。
测试:



