docker持久化读写底层实现

docker的数据卷和绑定挂载可以实现数据持久化,将宿主机的裸盘数据用上述方式实现共享之后,docker访问宿主机这部分数据发生的io流程是怎样的呢?

具体到io访问方式层面,流程需具体,最好是大概描述然后贴相关资料

参考这个:https://blog.51cto.com/u_14301180/5354260

首先,我感觉题主是不是搞错了什么东西,按我理解,这算是一个操作系统问题,而不是计网。docker挂载应该是不需要涉及到网络IO的,具体为Docker 有两个选项让容器在主机上存储文件——volumes和 bind mounts。即参数-v与-mount,其中mount比volume支持更多,但卷比绑定挂载更容易备份或迁移。而它们的原理图,在docker官网下是这样的:

img

那可以看到,它们两种方式都是以filesystem结束,再细分一点为如下图:

img

这张图的原理是当我启动一个容器时,一个写时复制的 R/W '容器层'被应用到 R/O 镜像栈的顶部,使它成为可读写的。基于此原理,甚至有人去开发了第三方volume插件,通常附带自己的命令行工具来管理存储卷的生命周期。

img

而如果要涉及到网络IO,其实就是NFS系统,还有samba协议等,这个可以看一下samba的原理,就共享win与Linux下文件目录:

img

samba原理资料链接如下,以及还有NFS相关api与网络io流程如下:

https://www.likecs.com/show-203892172.html
https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_file_systems/mounting-nfs-shares_managing-file-systems

Docker底层:Docker 卷与持久化数据存储的底层原理_qq5cbd62bd202f1的技术博客_51CTO博客 可以来看看这篇博客

参考一下这个:https://blog.csdn.net/llg___/article/details/125724589

容器发送io指令由宿主机获取以后剩下的就是正常我们服务器和磁盘之间的关系了,持久和不持久对路径没关系而是是否在容器消亡后保留的问题

例如你的docker环境的虚拟IP是..99.,那么宿主机同样会托管一个和..99.同网段的虚拟IP,并且会是主IP:..99.1,那么就简单了,在容器中访问..99.1这个地址就等于访问宿主机。

注意,通过..99.1访问宿主机,等于换了一个ip,如果数据库或中间件限制了本机访问或者做了ip段限制,要记得添加..99.1到白名单。

Docker容器运行的时候有host、bridge、none三种网络可供配置。默认是bridge,即桥接网络,以桥接模式连接到宿主机;host是宿主网络,即与宿主机共用网络;none则表示无网络,容器将无法联网。

当容器使用host网络时,容器与宿主共用网络,这样就能在容器中访问宿主机网络,那么容器的localhost就是宿主机的localhost。

宿主机和容器通信原理的问题:

考虑重启速度:在实际的运维过程中,部分场景下,会出现主机卡死,或者docker进程卡死,这时,最快恢复业务的方法是重启主机。

容器在主机重启后,可以自动恢复,因此可以做到在1到2分钟内快速恢复业务。这一点太重要了,物理机重启由于需要做各种硬件检测,重启时间一般在5到10分钟,虚拟机重启一般在1分钟以内,物理机显然无法满足需求。

重建能力很重要:

容器平台经常需要更新操作系统,或者根据需要调整主机规格。

运行一段时间后,发现内存配置偏少了,需要添加内存。这时候申请一台新的机器加入到集群中,将旧机器下线即可。

运行多年的.04官方已经不再维护,需要全量替换,工作量相当大。好的方法就是使用全新的服务器替换旧服务器。

当发生故障,主机无法恢复时,直接申请新服务器加入集群即可。

怎么用除了宿主机ip之外的其它ip从宿主机浏览器访问docker容器

Docker搭建了lnmp环境后,如果需要访问安装在宿主机上的数据库或中间件,是不能直接使用.这个ip的,这个ip在容器中指向容器自己,那么应该怎么去访问宿主机呢:例如你的docker环境的虚拟IP是..99.,那么宿主机同样会托管一个和..99.同网段的虚拟IP,并且会是主IP:..99.1,那么就简单了,在容器中访问..99.1这个地址就等于访问宿主机,问题解决注意,通过..99.1访问宿主机,等于换了一个ip,如果数据库或中间件限制了本机访问或者做了ip段限制,要记得添加..99.1到白名单

1.Docker镜像是由多层文件系统组成的,当启动一个容器时,Docker会在镜像上层创建一个可读写层,容器中的文件都工作在这个读写层中,当容器删除时,与容器相关的工作文件将全部丢失。


2.Docker容器的文件系统不是一个真正的文件系统,是通过联合文件系统实现的一个伪文件系统,而Docker卷则是直接利用主机的某个文件或者目录,它可以绕过联合文件系统,直接挂载主机上的文件或目录到容器中,这就是它的工作原理。


3.Docker卷存在于主机的/var/lib/docker/volumes目录下,根据卷的名称创建相应的目录,然后在每个卷的目录下创建_data目录,在容器启动时如果进行数据卷挂载,Docker会把主机上的目录直接映射到容器的指定目录下,实现数据持久化。

https://blog.csdn.net/A642960662/article/details/123154025?spm=1005.2026.3001.5635&utm_medium=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-4-123154025-ask-7774533.pc_feed_download_top3ask&depth_1-utm_source=distribute.pc_relevant_ask_down.none-task-blog-2~default~OPENSEARCH~Rate-4-123154025-ask-7774533.pc_feed_download_top3ask

大概就这样
挂载到容器中
安装所有依赖项
包括“dev”依赖项
启动 nodemon
监视文件系统更改

docker作为一个普通程序读写数据,所有的数据其实还是受操作系统管理,只是在docker容器挂载了该卷后,对应的卷(宿主系统中的目录、文件等)可以接收到由docker发出的读写指令,完成数据读写(如果没有挂载,则对应的docker读写是在其虚拟的磁盘卷中——由docker程序维护的临时文件夹(系统)中的,不能持久化,下次加载容器会分配新的)。

这就是大致的 挂载与非挂载的区别。