Edehuag

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

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的文件系统来管理的不需要指定路径 是宿主机来管理文件的,需要指定挂载路径
不需要关心操作系统差异 需要关心操作系统差异,不同操作系统挂载路径也不同
新建容器会创建存储卷 新建容器还是使用老的挂载路径

posted on   饿得慌~  阅读(16)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
点击右上角即可分享
微信分享提示