05 容器数据卷
容器数据卷
什么是容器数据卷
docker的理念回顾
将应用和环境打包成一个镜像
如果数据都在容器中,那么我们容器删除,数据就会丢失!需求:数据可以持久化
容器之间可以有一个数据共享的技术
Docker容器中产生的数据,同步到本地!
这就是卷技术,将我们容器内的目录,挂载到Linux上面!
容器的持久化和同步操作,容器间也是可以数据共享的
使用数据卷
方式一:直接使用命令来挂载 -v
docker run -it -v 主机目录:容器内目录
[root@vdevops home]# docker run -it -v /home/ceshi:/home centos /bin/bash
# 启动后 我们可以通过 docker insepect 容器id

测试文件的同步
再次测试
1、停止容器
2、宿主机上修改文件
3、启动容器
4、容器内的数据依旧是同步的
好处:以后修改只需要在本地修改即可,容器内会自动同步
实战:安装MySQL
思考:MySQL的数据持久化
# 获取镜像
[root@vdevops home]# docker pull mysql:5.7
#运行镜像,需要做数据挂载 安装启动 mysql 需要配置密码 -e 设置密码
##官方测试 docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:tag
#启动mysql
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
[root@vdevops home]# docker run -d -p 3310:3306 -v /home/mysql/conf:/etc/mysql/conf..d -v /home/mysql/data:/vat/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
#启动成功之后 使用 sqlyog 测试
# sqlyog 连接到服务器的3310 --- 3306 和容器内的3306 映射 这个时候我们就可以连接上了
#在本地测试创建一个数据库,查看一下我们映射的路径是否ok
将容器删除后,发现,我们挂载到本地的数据卷依旧没有丢失,这就实现了容器数据持久化功能
具名和匿名挂载
# 匿名挂载
-v 容器内路径
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 查看所有的 volume 的情况
[root@vdevops ~]# docker volume ls
local b86b7d785dae3880beb936e2b5ddf2c87741f950dcba692f2de822918b9968ba
#这里发现,这种就是匿名挂载,我们在 -v 只写了容器内的路径 没有写容器外的路径
#具名挂载
[root@vdevops ~]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx nginx
11141334d26e2cc8b5d8bb598ce836c239b00a44b02b7699150c6b995db112c1
[root@vdevops ~]# docker volume ls
DRIVER VOLUME NAME
local
local juming-nginx
#通过 -v 卷名:容器内路径
[root@vdevops ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2021-12-21T14:16:40+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录的情况下都是在:/var/lib/docker/volume/xxxx/_data
我们通过具名挂载可以方便的找到我们的一个卷,大多数情况下使用:具名
#如何确定是具名挂载还是匿名挂载,还是指定路径挂载
-v 容器内路径 #匿名挂载
-v 卷名:容器内路径 #具名挂载
-v /宿主机路径:容器内路径 #指定路径挂载
拓展
# 通过 -v 容器内路径: ro rw 改变读写路径
ro #只读
rw #只写
#一旦设置了权限 容器对挂载出来的内容就有限定了
[root@vdevops docker]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:rw nginx
[root@vdevops docker]# docker run -d -P --name nginx03 -v juming-nginx:/etc/nginx:ro nginx
# ro 只要看到ro 说明这个路径只能通过宿主机来操作,容器内无法操作
初识 Dockerfile
Dockerfile 就是用来构建 docker 镜像的构建文件!命令脚本
方式二:
通过这个脚本可以生产镜像 镜像是一层一层的 脚本是一个一个命令 一个命令就是一层
# 创建一个 dockerfile 文件 名字随意
#文件中的内容 指令(大写) 参数
FROM centos
VOLUME {"volume01","volume-2"}
CMD echo "------end----"
CMD /bin/bash
这种方式我们未来使用的十分多 因为我们通常会创建自己的镜像
假设构建镜像时候没有挂载卷,要手动镜像挂载 -v 卷名:容器内部路径
数据卷容器
多个 mysql 同步数据
测试 可以删除docker01 查看一下docker02和docker03是否可以访问这个文件
测试依旧可以访问
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器使用为止
但是一旦你持久到了本地,这个时候,本地的数据就不会删除
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)