Docker 容器数据卷
容器数据卷
一、什么是容器数据卷
我们知道,Docker是把应用和环境一起打包成一个镜像发布出去。如果我们的数据都在容器中,那么我们把容器删除之后,数据就会丢失。所以我们想要数据持久化。假如我们搞了个MySQL容器,如果一不小心将MySQL容器删除了,就会很危险。所以我们需要MySQL的数据可以存储在本地。于是基于上述两种需求,我们就出现了容器数据卷的技术,容器之间有一个数据共享的技术。Docker容器产生的数据同步到本地。说白了就是目录的挂载,将我们容器的目录挂载到Linux上面。
二、使用数据卷
方式一:直接使用命令来挂载 -v
命令
docker run -it -v 宿主机目录:容器内目录
测试
docker run -it -v /home/ceshi:/home centos /bin/bash
docker ps # 查看容器id
docker inspect 87e46c7dd4df
测试文件的同步。
再来测试
停止容器,在宿主机修改文件,就算容器内关闭了,也会同步修改。
修改宿主机上的文件。
再次启动centos镜像查看文件是否改变。
好处:我们以后修改只需要在本地修改即可,容器内会自动同步!
三、实战MySQL数据同步
思考:MySQL的数据持久化的问题!
1、获取镜像
docker search mysql # 搜索MySQL docker pull mysql:5.7 # 拉取MySQL5.7
2、运行容器,需要做数据挂载! 安装启动mysql 需要配置密码
官方测试: docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
-d 后台运行
-p 端口映射
-v 卷挂载 可配置多个 -v
-e 环境配置
--name 容器名字
测试连接(Navicat)
在本地测试创建一个test数据库,在本地查看是否存在。
即使容器删除,宿主机数据依旧存在,这就实现了容器数据持久化功能!
四、具名和匿名挂载
1、匿名挂载
-v 容器内路径!
docker run -d -P --name nginx01 -v /etc/nginx nginx docker volume ls # 查看所有的 volume 的情况
2、具名挂载
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx # -v 容器内路径
查看宿主机
Docker 容器中所有的卷,在没有指定目录的情况下,都在"var/lib/docker/volumes/xxxxx/_data"
我们可以通过具名挂载找到卷的位置,大多数情况下,我们使用具名挂载。
关于docker的挂载问题,有三个比较容易混淆的概念: (区分的方式) (1)具名挂载:-v 参数 卷名:容器内路径 (2)匿名挂载:-v 参数后面 没有写上容器之外的地址, docker 自己会在docker内部给你找个位置 (3)指定路径挂载: -v /宿主机路径::容器内路径
拓展:
-v 容器内路径:ro/rw 改变读写权限
ro readonly # 只读 rw readwrite # 可读可写
设置权限之后,容器对我们挂载出来的内容就有限定(只能通过宿主机改变,容器内部无法改变)
例: docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx # 只能通过宿主机操作,容器内无法操作 docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
五、通过 volumes-from 实现容器之间数据共享
图例:
1、使用之前DokerFile构建好的test-centos 启动第一个centos容器命名为centos01。
docker run -it --name centos01 test-centos
按ctrl+p+q 使centos01容器不停止退出。
2、启动第二个centos容器加 volumes-from 参数,继承centos01的volumes 命名为centos02。
docker run -it --name centos02 --volumes-from centos01 test-centos
3、新开xshell窗口,进入centos01容器,创建测试文件 docker01。
docker attach centos01 // 进入centos01容器 cd /volume01 // 进入volume01目录 ls // 查看volume01目录是否为空 touch docker01 // 创建docker01测试文件
4、返回到centos02容器中,查看是否出现docker01文件。
5、启动第三个centos容器加 volumes-from 参数,同样继承centos01的volumes 命名为centos03。
docker run -it --name centos03 --volumes-from centos01 test-centos cd /volume01 // 进入volume01目录 ls // 查看是否存在docker01文件 touch centos03 // 创建centos03文件
6、进入到docker01容器中,查看刚刚创建的docker03文件是否存在。
docker attach centos01 cd /volume01 ls
7、停止并销毁centos01容器,查看刚刚创建的docker01、docker03文件是否还存在。
8、使用centos镜像实现宿主机与容器 容器与容器 之间实现数据共享。
docker run -it -v /home/centos:/home --name centos01 centos // 将宿主机home目录与centos01容器进行数据共享 docker run -it --name cnetos02 --volumes-from centos01 centos // 创建启动centos02容器加 volumes-from 参数,继承centos01的volumes实现与cnetos01容器进行数据共享 从而达到与宿主机进行数据共享
结论:
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止。
但是一旦持久化到了本地,即使销毁容器这时候本地的数据是不会删除的!