什么是容器数据卷
将应用和环境打包成一个镜像!如果数据都在容器中,那么我们删除容器,数据也会丢失!
需求:数据可以持久化
容器之间最好有一个数据共享技术!那么,把容器内的目录挂载到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就说说明这个路径只能通过宿主机进行操作,容器内部是无法操作的。