数据卷相关docker命令
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安装mysql建立数据卷同步数据
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
- 问题
VOLUME NAME都是乱码,因为前面运行的时候只指定了容器内的目录
(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)
初识Dockerfile
- 新建一个文件dockerfile1
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----end----"
CMD /bin/bash
注意:这里的每一个命令,都各是一个镜像的一层。
- 执行docker build
[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
- 执行docker run 运行
[root@VM-4-17-centos docker-test-volume]# docker run -it d3bf78adc986 /bin/bash
[root@cbd17bdad4e4 /]#
- 查看容器的目录
注意:宿主机上一定有对应的目录,这里的挂载是匿名挂载。 - 查看一下卷挂载的路径
数据卷容器
如果用户需要在多个容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,但是它的目的是专门用来提供数据卷供其他容器挂载。
测试:
- 启动容器
- 进入docker01中的/volume01下创建一个文件,观察docker02中的volume01目录
进入docker01:
查看docker02中的volume01目录:
- 测试删除docker01容器,查看docker01中volume01下是否还存在创建的文件
结果:依然存在。
原因:docker01和docker02中的volume01和volume02实际上都挂载到了宿主机上的volumes目录中,只要不删除宿主机上的目录,文件就一直存在。