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.如果使用一段时间后修改,记得把原路径文件拷贝过来
posted @   梵高de画笔  阅读(58)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· winform 绘制太阳,地球,月球 运作规律
点击右上角即可分享
微信分享提示