容器数据卷
场景假设:将环境和应用打包成一个镜像。当我们使用Mysql时将数据存储在了Mysql容器里、删除了Mysql容器就等于删除跑路了。要求数据持久化。
一)什么是容器数据卷?
当我们正在使用docker容器的时候、会产生一系列的数据文件、这些数据文件在我们关闭docker容器时是会消失的、但是其中产生的部分内容我们是希望能够把它给保存起来另作用途的,Docker将应用与运行环境打包成容器发布,我们希望在运行过程钟产生的部分数据是可以持久化的的,而且容器之间我们希望能够实现数据共享。
数据共享传递:容器之间配置信息的传递,数据卷的生命周期会一致持续到没有容器使用它为止,换言之,只要有一个容器仍在使用该数据卷,该数据卷一直都可以进行数据共享,通俗地来说,如果此时我们把父容器关闭掉,两个字容器之间依旧可以进行数据共享,而且通过继承子容器生成的新容器,一样可以与子容器进行数据共享。这就是docker容器间的数据传递共享。
通俗地来说,docker容器数据卷可以看成使我们生活中常用的u盘,它存在于一个或多个的容器中,由docker挂载到容器,但不属于联合文件系统,Docker不会在容器删除时删除其挂载的数据卷。
特点:
1:数据卷可以在容器之间共享或重用数据
2:数据卷中的更改可以直接生效
3:数据卷中的更改不会包含在镜像的更新中
4:数据卷的生命周期一直持续到没有容器使用它为止
当我们正在使用docker容器的时候、容器之间有一个数据共享的技术、docker容器中产生的数据保存到本地
二)添加数据卷的方式
-
1.使用命令来挂载
docker run -it -v 主机目录、容器目录 容器id
这个命令会在宿主机和容器内分别建立两个目录,两个目录是对接的,里面的数据可以共享。如果我们不知道数据卷是否挂载成功时,我们可以通过以下方式来检查数据卷的挂载结果。
docker inspect 容器id、name
在本机服务器上存储
#先进入home目录检测home目录下
[root@xiaozhang1999 ~]# cd /home
[root@xiaozhang1999 home]# ls
[root@xiaozhang1999 home]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcattunc latest 276239fa14a3 22 hours ago 672MB
tomcat 9.0 5505f7218e4d 7 days ago 667MB
tomcat latest 5505f7218e4d 7 days ago 667MB
tomcat ssss 5505f7218e4d 7 days ago 667MB
redis latest fad0ee7e917a 3 weeks ago 105MB
mysql 5.7 2c9028880e58 6 weeks ago 447MB
mysql latest c0cdc95609f1 6 weeks ago 556MB
portainer/portainer latest 580c0e4e98b0 3 months ago 79.1MB
hello-world latest d1165f221234 3 months ago 13.3kB
centos latest 300e315adb2f 6 months ago 209MB
[root@xiaozhang1999 home]# docker run -it -v /home/ceshi:/home centos
[root@185d7e114c39 /]# cd home
[root@185d7e114c39 home]# ls
# Ctrl+P+Q退出centos
[root@185d7e114c39 home]# [root@xiaozhang1999 home]#
#检测本地home目录下是否生成了本机目录
[root@xiaozhang1999 home]# ll
total 0
drwxr-xr-x 2 root root 6 Jun 24 14:40 ceshi
#查看挂载的详情
[root@xiaozhang1999 home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
185d7e114c39 centos "/bin/bash" 13 minutes ago Up 13 minutes eloquent_leakey
[root@xiaozhang1999 home]# docker inspect eloquent_leakey
-
2.利用dockerfile的形式添加
dockerFile对于docker镜像而言就如同java中某个类的.class文件对应上该类的.java文件。
首先在linux服务器根目录上新建docker文件夹并建立DockerFile文件,使用volume命令(出于可移植可分享的的考虑,用以上 -v /宿主机绝对路径目录 : /容器内目录 的这种方式不能够直接在dockerFile中直接实现,因为宿主机目录是依赖于特定的宿主机的,并不能保证所有的宿主机都存在这样特定的目录)
编写的dockerFile文件如下
FROM 镜像名
VOLUME [“/生成的目录路径”] — privileged=true
CMD echo “success build”
CMD /bin/bash
相当于命令行: docker run -it -v /宿主机目录路径 : /生成的目录路径
然后我们通过命令行docker build执行我们写好的dockerFile文件(docker build和docker commit两个命令都可以建立docker镜像,docker commit 需要在容器内进行,docker build 不需要)
docker build -f /docker/DockerFile -t 命名空间/镜像名
执行后输入docker images就可以发现自己通过DockerFile所build的镜像,里面有挂载数据卷,那么问题来了宿主机所对应的目录是什么呢?同上,我们可以通过docker inspect来查看当前容器的Volumes,里面会有宿主机的数据卷目录。