docker 数据持久化及配置Volume和mount说明


发现其他人构建容器docker run与自己写法不一样 

docker run --name=mysql5.7.21 \
-p 33061:3306 \
--privileged=true \
--mount type=bind,src=/data/mysql/conf/my.cnf,dst=/etc/my.cnf \
--mount type=bind,src=/data/mysql/data,dst=/var/lib/mysql \
--restart=always \
-e MYSQL_ROOT_PASSWORD=1234 \
-d mysql/mysql-server:5.7.21

好奇研究一下这个 --mount type  与-v

首先官方文档说明

https://docs.docker.com/storage/

默认情况下,在容器内创建的所有文件都存储在可写容器层上。这意味着:

  • 当该容器不再存在时,数据不会持续存在,并且如果另一个进程需要数据,则可能很难将数据从容器中取出。
  • 容器的可写层与运行容器的主机紧密耦合。您无法轻松地将数据移动到其他地方。
  • 写入容器的可写层需要 存储驱动程序来管理文件系统。存储驱动程序提供了一个联合文件系统,使用 Linux 内核。与使用直接写入主机文件系统的数据卷相比,这种额外的抽象会降低性能 。

Docker 有两个选项让容器在主机上存储文件,以便即使在容器停止后文件也能持久保存:volumes和 bind mounts

Docker 还支持将文件存储在主机内存中的容器。此类文件不会持久保存。如果您在 Linux 上运行 Docker,则使用tmpfs mount将文件存储在主机的系统内存中。如果您在 Windows 上运行 Docker,命名管道用于将文件存储在主机的系统内存中。

继续阅读有关持久化数据或利用内存文件的更多信息。

选择正确的坐骑类型

无论您选择使用哪种类型的挂载,容器内的数据看起来都是一样的。它以目录或容器文件系统中的单个文件的形式公开。

可视化卷、绑定挂载和tmpfs 挂载之间差异的一种简单方法是考虑数据在 Docker 主机上的位置。

挂载类型以及它们在 Docker 主机上的位置

  • 卷存储在由 Docker/var/lib/docker/volumes/在 Linux 上)管理的主机文件系统的一部分中。非 Docker 进程不应修改文件系统的这一部分。卷是在 Docker 中持久化数据的最佳方式。

  • 绑定挂载可以存储在主机系统的任何位置。它们甚至可能是重要的系统文件或目录。Docker 主机或 Docker 容器上的非 Docker 进程可以随时修改它们。

  • tmpfs挂载仅存储在主机系统的内存中,永远不会写入主机系统的文件系统。

......

看个开头基本上已经差不多明白了 --mount type 就跟nfs/mount类似的功效;-V 相当于"给容器添加了一块磁盘" 以供容器管理开销  “非 Docker 进程不应修改文件系统的这一部分” 也很好的说明了某些在容器内的修改失效的情况

查了一下其他博主相关的解说

容器自身存储的问题
Docker镜像是由多个文件系统(只读层)叠加而成,容器启动的时候是在原镜像层上面加了一层可读写层,容器层,如果运行中的容器修改了现有的一个已经存在的文件,那该文件将会从读写层下面的只读层复制到读写层,该文件的只读版本仍然存在,只是已经被读写层中该文件的副本所隐藏。当删除Docker容器<不commit-Jaylon补充>,并通过该镜像重新启动时,之前的更改将会丢失。
————————————————
版权声明:本文为CSDN博主「Y。S。H。」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/yangshihuz/article/details/103976407

不搬运了 就此结束


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM