Docker之容器数据卷

什么是容器数据卷

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘小羊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值