Docker之挂载命令
为什么需要挂载路径
因为容器启动时时候会自动加一个存储层,数据都是写入到存储层的,
- 容器启动会创建一个存储层
- 随着容器结束存储层也会消失
- 容器会存在写时复制的问题(写时复制:由于镜像是不可改变的,如果需要修改centos层的内容,需要先将centos的内容读到读写层再进行修改),这样效率会很低
解决方式:
将容器需要的目录挂载到宿主机
写时复制
若运行中的容器修改镜像中已经存在的文件,它会把这个文件复制到存储层再进行修改,这样非常浪费资源。
解决方式是使用一个挂载路径,将该文件挂载到宿主机,这样再进行修改的话就会修改宿主机中的文件了。
容器挂载的方式
容器有两种挂载方式,一种是存储卷,一种是绑定.
存储卷:
存储卷是Docker所管理的文件系统它可以被容器挂载,可绕过联合文件系统,与宿主机上的某个目录绑定。
存储卷的特点:
1、存储卷可以实现文件持久化
2、存储卷不会随着容器结束而消失
3、存储卷是Docker所管理的文件系统(他的具体挂载路径使用docker引擎来管理的不是用户进行管理)
4、定期需要清理存储卷以节省磁盘空间
如何使用存储卷:
使用存储卷,我们需要重新构建镜像,设置存储卷的路径
yaml中配置的日志路径:
logging:
file:
name:./logs/${spring.application.name}.log
重新构建DockerFile (按上图配置volume存储卷的配置)
docker build -f DockerFile -t learn-docker-storage:0.0.2
查看所有存储卷:
docker volume ls
根据容器ID查看容器配置信息:
dokcer inspect 【容器ID】
存储卷的验证与结论:
删除容器检查存储卷的日志是否还存,再启动一个新容器检查日志的存储情况
结论:删除容器后,存储卷日志不会消失,但启动一个新的容器,就会创建一个新的存储卷,存储卷不会被复用。
存储卷总结
存储卷对需要持久化的存储如数据库是不适用存储卷,但对于临时性存储或者缓存存储可以使用存储卷。
注意:随着服务运行越来越多,存储卷不会随着容器结束而消失,我们就需要手动清理存储卷以节省磁盘空间
批量清理没有引用关系的存储卷:(容器被删除使用该命令会清理被删除容器的存储卷)
docker volume prune
bind挂载方式
Bind方式和存储卷很类似,但是bind方式是将文件挂载到宿主机的指定目录
bind挂载特点
Bind可以实现文件持久化
Bind不会随着容器结束而消失
Bind是挂载到宿主机的某个目录
bind与存储卷对比
1、存储卷会随着容器创建而创建不适合永久的存储数据
2、Bind是挂载到宿主机,创建新的容器后挂载的路径不会变化
存储卷适合临时性存储,bind适合永久存储
bind挂载实例
创建挂载目录:
mkdir -p /tmp/data/logs
启动容器并进行bind挂载(":" 前是宿主机路径,":"后是容器路径)
docker run -d-v /tmp/data/logs:/logs-p 8003:8003--name learn-docker-storagelearn-docker-storage:0.0.2
删除容器后,存储卷日志不会消失,启动一个新的容器,日志还是写到配置的挂载目录。
bind与存储卷区别总结
存储卷 | Bind |
---|---|
存储卷是Docker的文件系统来管理的不需要指定路径 | 是宿主机来管理文件的,需要指定挂载路径 |
不需要关心操作系统差异 | 需要关心操作系统差异,不同操作系统挂载路径也不同 |
新建容器会创建存储卷 | 新建容器还是使用老的挂载路径 |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?