Docker数据持久化--容器数据卷

什么是容器数据卷?

docker理念回顾:将应用和环境打包成一个镜像!

数据问题:如果数据都在容器中,容器删除,数据会丢失

需求:数据可以持久化,例如mysql的数据可以存在本地

容器与本地之间可以有一个数据共享的技术,Docker容器中的数据,同步到本地

这就是卷技术!我们将容器内的目录挂载到Linux上面

总结:容器的持久化和同步操作,容器间也是可以数据共享的

使用数据卷

方式1:直接使用命令挂载(-v)

命令:docker run -it -v /宿主机目录:/容器目录
[root@server ~]# docker run -it -v /home/mount_centOS_home:/home centos /bin/bash
[root@c784218bd2eb /]# cd /home
[root@c784218bd2eb home]# ls
[root@c784218bd2eb home]# 					//此时容器内的centos的home文件夹是空的

打开Linux内终端查看挂载状态:

[root@server home]# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
f50570b4b258        centos              "/bin/bash"         43 seconds ago      Up 42 seconds                           fervent_johnson
[root@server home]# docker inspect f50570b4b258		//查看容器详细信息

在这里插入图片描述

数据由容器到Linux同步成功

在这里插入图片描述

数据由Linux到容器同步成功

在这里插入图片描述

实战测试:安装MySQL
#获取mysql:5.7镜像
[root@server ~]# docker pull mysql:5.7
#运行容器,并做数据挂载:启动mysql需要配置密码!!!!
-d:后台运行
-p:端口映射
-v:数据卷挂载(可以多个)
-e:环境配置
--name:设置容器名字
 docker run -p 3310:3306 -v /home/mount_mysql/config:/etc/mysql/conf.d -v /home/mount_mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
#启动成功后,使用本地的Navicat连接测试一下
#在本地的navicat上创建一个数据库,然后查看Linux上我们映射的路径是否ok
#此时删除mysql容器,我们挂载到本地的数据卷并没有丢失,这就实现了我们的数据持久化功能
具名挂载和匿名挂载
#匿名挂载:
[root@server /]# docker run -d -P --name naginx_02 -v /etc/nginx nginx
52c6d73a9ecfa0322dbd83eb20e6d20acca788756e1d6d3175aa0df6b860b14d
#查看所有卷的挂载情况
[root@server /]# docker volume ls
DRIVER              VOLUME NAME
local               a6514dbbf47e2cc515aa8b0c2e79c769e092da267df468d0cc0c1b6085de5890
#此时在启动一个具名挂载的nginx	通过 -v 卷名:容器内路径 
[root@server /]# docker run -d -P --name nginx_03 -v nginx_03:/etc/nginx nginx
03159dc81a099b4b4971480f1e9c12dc95fff6322237438c4e9a255d521016c2
#再查看所有卷的挂载情况
[root@server /]# docker volume ls
DRIVER              VOLUME NAME
local               a6514dbbf47e2cc515aa8b0c2e79c769e092da267df468d0cc0c1b6085de5890
local               nginx_03
​`区别`
#这种一长串的就是匿名挂载,我们在-v 只写了容器内的路径,没有写当前宿主机的路径
#查看一下具名挂载卷
[root@server /]# docker volume inspect nginx_03
[
    {
        "CreatedAt": "2020-05-25T16:41:52+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/nginx_03/_data",
        "Name": "nginx_03",
        "Options": null,
        "Scope": "local"
    }
]
#所有的docker容器内的卷,在没有指定本地目录的情况下都是在 ”/var/lib/docker/volumes/卷名/_data“
[root@server /]# cd /var/lib/docker
[root@server docker]# ls
builder   containers  network   plugins   swarm  trust
buildkit  image       overlay2  runtimes  tmp    volumes
[root@server docker]# cd volumes/
[root@server volumes]# ls
a6514dbbf47e2cc515aa8b0c2e79c769e092da267df468d0cc0c1b6085de5890  
nginx_03
metadata.db
[root@server volumes]# cd nginx_03/
[root@server nginx_03]# ls
_data
[root@server nginx_03]# cd _data/
[root@server _data]# ls
conf.d          koi-utf  mime.types  nginx.conf   uwsgi_params
fastcgi_params  koi-win  modules     scgi_params  win-utf

#我们通过具名挂载可以方便的找到我们挂载到宿主机的一个卷,也是实际业务中大多数会使用的方法

#如何确定是具名挂载还是匿名挂载,还是指定路径挂载???
-v 容器内的地址				#匿名挂载
-v 卷名:容器内地址		 #具名挂载
-v /宿主机路径:容器内路径		#指定目录挂载

拓展:

#通过 -v 容器内路径:ro或者rw  改变读写权限
ro:readonly			#只读(挂载的目录只能通过宿主机来改变,容器内部无法操作)
rw:readwrite		#可读可写(默认)

[root@server _data]# docker run -d -P --name nginx_03 -v nginx_03:/etc/nginx:ro nginx
[root@server _data]# docker run -d -P --name nginx_03 -v nginx_03:/etc/nginx:rw nginx
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值