docker数据卷介绍
Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。|
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷的特点:
1.数据卷可在容器之间共享或重用数据
2.卷中的更改可以直接生效
3.数据卷中的更改不会包含在镜像的更新中
4.数据卷的生命周期一直持续到没有容器使用它为止
docker的理念回顾
将应用和环境打包成一个镜像
数据?如果数据都在容器中,那么我们容器删除,数据就会丢失! 需求:数据可持久化
MySql,容器删了,删库跑路了!需求:MySQL数据可以保存在本地
容器之间可以有一个数据共享的技术!Docker容器中产生的数据,同步到本地!
这就是卷技术!目录的挂载,将我们容器内的目录,挂载到Linux上面!
总结一句话:容器的持久化和同步操作!容器之间也是可以数据共享的!
用数据使卷
方式1:直接使用命令挂载
#docker run -it -v 主机目录:容器内目录
#启动起来的时候我们可以通过docker inspect 容器id
测试文件的同步
再来测试!
1.停止容器
2.宿主机上修改文件
3.启动容器
4.容器内的数据依旧是同步的
实战:安装MySQL
思考:MySQL的数据持久化的问题
#获取镜像
#运行容器,需要做数据挂载 #安装启动mysql,需要配置密码的,
#官方测试:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
-
#-d 后台运行
#-p 端口映射
#-v 卷(目录)挂载
#-e 环境配置
#-name 容器命名
docker run -d -p 3310:3306 -v /home/admin/mountDir/mysql/conf:/etc/mysql/conf.d -v /home/admin/mountDir/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7
#启动成功后,我们载本地使用navicat连接测试成功
#navicat-连接到服务器的3310 ----3310和容器内的3306映射,这个时候我们就是连接上了
#在本地测试创建一个数据库,查看一下我们映射的路径是否正确
假设我们将容器删除
具名挂载和匿名挂载
#匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
#查看所有的volume的情况
#这里发现,这种就是匿名挂载,我们在 -v 只写了容器内路径,没有写容器外的路径
#具名挂载
#通过 -v 卷名:容器内路径
#查看一下这个卷
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况都使用 具名挂载
# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:/容器内路径 #具名挂载
-v /宿主机路径:/容器内路径 #指定路径挂载
拓展:
# 通过-v 容器内路径:ro rw 改变读写权限
ro readonly #只读
rw readwrite #可读可写
# 一旦设置了容器权限,容器对挂载出来的内容就有限制了
docker run -d -P --name nginx02 -v JM-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v JM-nginx:/etc/nginx:rw nginx
#ro 只要看到ro就说明这个路径只能通过宿主机来操作,容器内部只有只读权限
初识Dockerfile
Dockerfile就是用来构建docker镜像的构建文件!命令脚本
通过脚本可以生成经i想,镜像是一层一层的,脚本的一个个的命令,每个命令都是一行!
# 创建一个dockerfile文件,名字可以随机,建议Dockerfile
# 文件的内容
FROM centos --基础镜像
VOLUME ["volume1","volume2"]
CMD echo "-----------end-----------"
CMD /bin/bash
# 这里的每个命令,都是镜像的一层
# 启动自己写的容器
这个卷和外部一定有一个同步的目录
这种方式我们未来使用的会十分多,因为我们通常会构建自己的镜像!
假设构建镜像的时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内路径
数据卷容器
多个mysql同步数据!
# 启动3个容器,通过我们刚才自己构建的镜像myimage来启动