什么是容器数据卷
将应用和环境打包成一个镜像!如果数据都在容器中,那么我们删除容器,数据也会丢失!
需求:数据可以持久化
容器之间最好有一个数据共享技术!那么,把容器内的目录挂载到linux上面或者本机上,就实现了卷技术!
1、使用数据卷:
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
#测试
[root@liuyang mysql_test_data_test]# docker run -it -v /home/test:/usr/local/tomcat/webapps tomcat /bin/bash
root@ed7651b9f45f:/usr/local/tomcat#
#服务启动之后,通过docker inspect 容器id 查看mounts是否挂载成功

测试宿主机,docker容器目录同步情况
1、宿主机增加文件,docker同步
root@liuyang home]# cd test/
[root@liuyang test]# ls
[root@liuyang test]# touch liuyang.java
[root@liuyang test]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed7651b9f45f tomcat "/bin/bash" 8 minutes ago Up 8 minutes 8080/tcp laughing_ardinghelli
[root@liuyang test]# docker attach ed7651b9f45f
root@ed7651b9f45f:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@ed7651b9f45f:/usr/local/tomcat# cd webapps
root@ed7651b9f45f:/usr/local/tomcat/webapps# ls
liuyang.java
root@ed7651b9f45f:/usr/local/tomcat/webapps#
2、测试docker容器改变文件数据,宿主机同步
[root@liuyang ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ed7651b9f45f tomcat "/bin/bash" 13 minutes ago Up 13 minutes 8080/tcp laughing_ardinghelli
[root@liuyang ~]# docker attach ed765
root@ed7651b9f45f:/usr/local/tomcat# ls
BUILDING.txt LICENSE README.md RUNNING.txt conf logs temp webapps.dist
CONTRIBUTING.md NOTICE RELEASE-NOTES bin lib native-jni-lib webapps work
root@ed7651b9f45f:/usr/local/tomcat# mv webapps.dist webapps
root@ed7651b9f45f:/usr/local/tomcat# cd webapps/
root@ed7651b9f45f:/usr/local/tomcat/webapps# ls
liuyang.java webapps.dist
[root@liuyang ~]# cd ..
[root@liuyang /]# cd home/
[root@liuyang home]# cd test/
[root@liuyang test]# ls
liuyang.java webapps.dist
[root@liuyang test]#
**这样我们就实现了宿主机、docker的数据同步!**
实战:安装MYSQL
思考:MYSQL的数据持久化的问题!
1、获取镜像
[root@liuyang test]# docker pull mysql:5.7
2、运行容器,做数据挂载
[root@liuyang]# docker run -d -p 3310:3306 -v /home/mysql_test/conf_test:/etc/mysql/conf.d -v /home/mysql_test_data_test:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name MYSQL_LIUIYANG mysql:5.7
#再次解析
-d 后台运行
-p 设置映射端口
-v 挂载目录 (可以一段代码 挂载多个-v)
-e 环境配置
--name 容器名字
3、本地navicat测试宿主机数据库联通情况

4、本地目录测试一下创建一个数据库,对应宿主机,容器内目录是否对应映射就ok!


此时,我们将容器删除,发现挂载到本地的数据卷不会丢失,这就实现了容器数据的持久化功能!
具名挂载和匿名挂载
一、匿名挂载
-v 容器内路径
[root@liuyang ~]# docker run -d -P --name nginx_ly -v /liuyang/nginx nginx
查看所有的volume 情况
#这里面每一串乱码都是一个目录
[root@liuyang ~]# docker volume ls
DRIVER VOLUME NAME
local 209d3de8576d141adc7d0b631ec2668f5b0389ecb8b9124545140b5ae2abae9b
local fead09cfceb2ccea8b948f3a61a93c6570bdb1e55cf8198418d999e3820ad7f0
#这种就是匿名挂载,我们在-v只写了容器内部路径没有写容器外路径
二、具名挂载
[root@liuyang _data]# docker run -d -P --name nginx_liuyang02 -v juming_nginx:/etc/nginx nginx
f98f89432b050b35c5ecfa49ffa1921dfa08d2f1ef28540d3491e7b14563a1ce
注意:具名的冒号":" 后面跟的路径必须是绝对路径 否则会报错 还要注意,后面的路径是容器内路径,它决定了你在容器外的宿主机显示的文件内容是什么:
#这里报错是指,路径不是绝对路径
docker: Error response from daemon: invalid volume specification: 'liuyang_nginx:liuyang1/nginx': invalid mount config for type "volume": invalid mount path: 'liuyang1/nginx' mount path must be absolute.
1、查看vloume 情况
[root@liuyang _data]# docker volume ls
DRIVER VOLUME NAME
local 209d3de8576d141adc7d0b631ec2668f5b0389ecb8b9124545140b5ae2abae9b
local 68880a5654adeaf16079009d189a50416c63af2fdb3cd331fc0f3a4ed8e771c8
local fead09cfceb2ccea8b948f3a61a93c6570bdb1e55cf8198418d999e3820ad7f0
local juming_nginx
local liuyang_nginx
执行docker volume inspect juming_nginx可以看到,所有的卷,都存储到"/var/lib/docker/volumes/juming_nginx/_data" ,这里
[root@liuyang ~]# cd /var/lib/docker/volumes/juming_nginx/_data
[root@liuyang _data]# ls
conf.d fastcgi_params koi-utf koi-win mime.types modules nginx.conf scgi_params uwsgi_params win-utf
[root@liuyang _data]#
总结:所有容器的卷,没有指定目录时,都是在:
/var/lib/docker/volumes/XXXXXX/_data 目录之下
我们通过具名挂载,可以方便的找到我们的一个卷,大多数情况也这样使用。
如何确定是具名挂载还是匿名挂载?还是指定路径挂载?
1、-v 容器内路径 #匿名挂载
2、-v 卷名:容器内路径 #具名挂载
3、-v /宿主机路径:容器内路径 #具体路径挂载
拓展:
#通过-v 容器路径之后,ro rw 改变读写权限
ro readonly #只读
rw readwrite #可读可写
举例:
[root@liuyang _data]# docker run -d -P --name nginx_liuyang02 -v juming_nginx:/etc/nginx:ro nginx
注:只要看到ro就说说明这个路径只能通过宿主机进行操作,容器内部是无法操作的。

本文介绍了Docker容器中数据卷的概念及其实现方法,包括数据持久化的解决方案、具名挂载和匿名挂载的区别,并演示了如何通过不同方式挂载目录以实现宿主机与容器间的数据同步。
423

被折叠的 条评论
为什么被折叠?



