Docker自娱—5.volume
卷的概念
- 卷就是实现数据的持久化存储,容器之间可以数据共享。
- docker容器中产生的数据同步到本地,就是卷技术
- 目录的挂载,将容器中的目录挂载到本地,卷技术
- 总结说:把容器内路径挂载到本地,在容器内操作,数据会同步。
- 总结说:当然,在本地操作,数据也会同步到容器内。。。
卷的使用
- 卷使用方式一:
| 直接使用-v命令来挂载
| 格式: docker run -it -v 主机目录:容器内目录 镜像名 bashshell
[root@wg ~]# docker run -it -v /home/test:/home centos /bin/bash
| 1.此时已经完成同步,在容器内已经能看到/home/test目录
| 2.或者说本机能看到容器home内的信息
| 3.在本地或者容器执行操作,对端都能看到
- docker inspect 容器id //查看挂载是否成功 命令查看的是容器元数据
[root@wg docker1]# docker inspect 1bb9c3cd6c0b
"Mounts": [
{
"Type": "bind",
"Source": "/opt/docker1",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
# 停止容器后,在真实机创建的文件,仍能同步到容器
# 需要留意,如果容器被杀死,是无法进入的
# 可以使用docker start 容器id(ps -a查出)启动容器,再用docker attach等方式进入容器
# inspect查看的是mounts下的路径
MySQL操作
[root@wg ~]# docker pull mysql:5.7
[root@wg ~]# docker run -d -p 3310:3306 --name mysql_test -v /home/mysql/conf:/etc/mysql/conf.d \
> -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
docker inspect 容器id或容器名都可以 // 依旧查看的是元数
docker exec -it mysql_test /bin/bash //这里名字和容器id都可以
# 1.一个v挂一个路径
# 2.第一个挂的是配置文件路径
# 3.第二个挂的是mysql数据库数据的路径
# 4.-e传递的是环境变量
# 5.-P大写是随机指定端口
# 进入容器后,模拟登录mysql步骤是一样的
mysql -uroot -p
docker stop mysql_test
docker rm -f mysql_test
# 删除容器后,挂载的数据依旧存在
挂载分类
- 匿名挂载
| -v 容器内路径 (只写容器内路径 没有容器外路径)
| 用 docker volume ls 能看到编码形式 volume name
- 具名挂载
| -v 卷名:容器内路径
| 具名挂载可以方便的找到卷,大多数情况下使用具名挂载
- 挂载的几种情况
| -v 容器内路径 // 匿名
| -v 卷名:容器内路径 // 具名
| -v /宿主路径:容器内路径 // 指定路径挂载(这是bind mount?)
| -v 卷名:容器内路径:ro // 具名,改变读写权限 只读 read only
- ro和rw
| ro只读 只能通过宿主机操作,容器内无法操作写入
| rw读写
深入说明
1、volume作用
- 1.对接其他设备
- 2.拓展存储空间
- 3.隔离存储区域
- 4.对数据的迁移
- 5.对复用也支持
2、bind mount和volume
docker的数据持久化存储有两种方式:bind mount和volume
docker的数据持久化即使数据不随着容器的结束而结束,数据存在host机上——要么在host的某个制定目录(bind mount),要么使用docker自己管理的volume(/var/lib/docker/volumes)
volume也是绕过container的文件系统,直接将数据写到host机器上,只是volume是被docker管理的,docker下所有的volume都在host机上的指定目录下/var/lib/docker/volumes
这时再看前边内容 docker run -v 中,本地目录与容器路径对接,不是volume,是bind mound;填写路径的时候可以用"/"或者"~/"触发;路径:如果host上不存在,主动创建;如果container上不存在,主动创建;覆盖:如果冲突,以host为准
3、实操
docker run -d --name nginx01 -v $(pwd)/html:/usr/share/nginx/html nginx
//容器启动成功 host目录与主机目录成功关联 但是这里不是创建volume
docker container inspect //验证 得到的hostconfig下的字段值为null
docker volume ls //无法查到新的volume
# 创建volume的方式
docker run --name nginx02 -v html:/usr/share/nginx/html -d nginx
# 验证方式
docker volume ls //方式1不会新增数据,方式2会新增以html为名称的数据条目
docker volume inspect html //查看卷详细信息,html是卷名
docker container inspect 容器名 //这个是查看容器详细信息的
# 这里有一个问题 关于使用 `docker container inspect 容器名` 验证是否是volume
# 得到的结果中hostconfig下volumes字段为null,就不是卷
# 我这里各种操作都尝试了,得到的都是null,感觉不靠谱,回头研究下
docker volume rm -f $(docker volume ls -qa) //删除所有卷
安装目录
在使用不指定宿主目录前提下,docker的卷会把容器内文件自动拷贝到本地。这里就涉及一个问题,本地的目录位置不是可控的,这就需要修改docker的安装路径
[root@wg /]# systemctl stop docker
[root@wg /]# vi /etc/docker/daemon.json
| {
| "registry-mirrors": ["http://hub-mirror.c.163.com"],
| "data-root": "/docker"
| }
[root@wg /]# systemctl start docker
- 1.这是官方文档方式。此文件默认不存在
- 2.文件涉及默认源设定,如果设定了国内源,会有第一行的内容
- 3.在有文件的前提下,就是增加 data-root
- 4.如果使用一段时间后修改,记得把原路径文件拷贝过来
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律