云计算
Docker为容器提供了两种存储数据的资源:
镜像层和容器层由存储驱动管理。
数据量.
存储驱动程序
docker的镜像层次结构如下:
Docker图像中引入了图层的概念,图像制作过程中的每一步都会生成一个新的图像图层。
容器由顶部的可写容器层和几个只读镜像层组成,容器的数据存储在这些镜像层中。这种分层结构的最大特点是写入时拷贝:
新数据将直接存储在顶层容器层。
修改现有数据会先将数据从镜像层复制到容器层,修改后的数据会直接保存在容器层,镜像层保持不变。
如果多个层中存在同名文件,用户只能看到顶层的文件。
由于Docker存储驱动程序,分层结构使得图像和容器的创建、共享和分发非常高效。正是存储驱动实现了多层数据的堆叠,并在合并后为用户提供单一的统一视图。
Docker支持多种存储驱动,包括AUFS、设备映射器、Btrfs、OverlayFS、VFS和ZFS。它们都可以实现分层架构,同时又各有特色。
Docker会优先考虑Linux发行版的默认存储驱动。
Docker在安装时会根据当前系统配置选择默认驱动。默认驱动程序具有最好的稳定性,因为它已经在发行版中经过严格测试。
运行Docker info查看系统当前使用的存储驱动程序。
centos的默认驱动是overlay2,底层文件系统是xfs,各层的数据存储在/var/lib/docker。
对于一些容器,比如busybox,它只是一个工具箱,并不需要保存数据以备后用。删除容器时,存储在容器层中的工作数据也将被删除。
Docker数据管理
docker容器中的持久数据一般采用两种存储方式:
卷
绑定安装
卷和绑定装载本质上都是主机文件系统中的目录或文件。
无论是卷还是绑定挂载,其上存储的数据的生命周期都与容器相反,即删除容器后,卷或绑定挂载上的数据仍然存在。
卷
卷实质上是Docker主机文件系统中的一个目录或文件,它可以直接挂载到容器的文件系统中。成交量有以下特点:
卷是目录或文件,而不是未格式化的磁盘(块设备)。
容器可以读写卷中的数据。
卷数据可以永久保存,即使使用它的容器已被销毁。
因为卷实际上是docker主机文件系统的一部分,所以卷的容量取决于文件系统当前未使用的空间。
体积使用注意事项:
该卷的内容存在于容器的生命周期之外;删除后依然存在。
挂载卷时,不需要指定挂载源,只需指定一个挂载点。Docker将在/var/lib/docker/volumes路径下为每个卷生成一个目录作为挂载源。
如果装入点指向容器中的现有目录,则该目录中的数据将被复制到卷中。
如果挂载点指向容器中的一个空目录,将自动创建所需的目录。
如果您启动的容器装载了一个不存在的卷,Dokcer将自动创建该卷。
重用卷时,可以通过ro参数将容器戳卷的权限设置为只读。
绑定安装
绑定装载是将主机上的现有目录或文件装载到容器。
绑定装载实际上是一个信息节点替换过程。
绑定挂载机制的主要作用是允许在指定的目录下挂载一个目录或文件(不是整个设备),在这个挂载点上的任何操作都只发生在挂载的目录或文件上,而原挂载点的内容将被隐藏,不受影响。
使用bind mount的注意事项:
在容器操作期间,将保存在绑定挂载目录中更改的数据。删除容器后,bind mount中的数据仍然存在。
Bind mount可以从目录挂载到容器,也可以从文件挂载到容器,但是必须指定目录或文件的路径,即挂载源,当然也必须指定挂载点,这也限制了容器的可移植性。
如果bind mount也绑定到容器上的非空目录,则容器目录中的现有内容将被隐藏。如果不想覆盖容器的整个目录,可以单独挂载一个文件。
如果主机上不存在装载源指向的文件或目录,将自动创建该文件或目录。
绑定挂载时,容器对数据的权限可以通过ro参数设置为只读。设置ro参数后,容器不能修改数据,但主机仍有权修改其内容。
bind mount的用法是使用-v选项将主机已经存在的目录或文件挂载到容器。
如下所示:
-v的格式是主机路径:容器路径。/usr/local/apache2/htdocs是apache服务器保存静态文件的地方。由于/usr/local/apache2/htdocs已经存在,所以原始数据将被隐藏,并被host $HOME/htdocs/中的数据替换,这与linux mount命令的行为一致。
数据共享
数据共享是卷的一个关键特性。主机和容器共享数据:
绑定挂载:将主机上的目录或文件挂载到容器。
卷:将主机上的数据复制到容器的卷中。
容器之间的数据共享:
绑定挂载:将主机上的目录或文件挂载到多个容器。
卷:将卷装入多个容器。
卷容器(Volume container):首先通过Volume或bind mount将数据挂载到一个容器中,然后其他容器引用这个容器中的数据。
容积容器是为其他容器提供容积的容器。
卷生命周期管理
支持
因为卷实际上是主机文件系统中的目录和文件,所以卷的备份实际上是文件系统的备份。
恢复
体积的恢复也很简单。如果数据损坏,直接用之前备份的数据复制。
移动
如果您使用较新版本的Registry,这涉及通过以下方式进行数据迁移:
Docker停止当前注册表容器。
启动容器的新版本,并挂载原始卷。
破坏
删除卷后,无法检索数据。请注意。
Docker不会销毁bind mount,删除数据的工作只能由主机承担。当docker rm删除容器时,它可以带-v参数,docker将一起删除该容器使用的卷,但前提是没有其他容器挂载该卷。
操作实验
卷装载操作
创建一个卷并挂载一个httpd容器。
docker run-d-p 8080:80-v/usr/local/Apache 2/htdocs httpd
-v将其安装到httpd容器。
-v格式是主机路径:容器路径。/usr/local/apache2/htdocs是apache服务器保存静态文件的地方。
因为/usr/local/apache2/htdocs已经存在,所以原始数据将被隐藏,并被host $HOME/htdocs/中的数据替换。
检查音量信息。
docker卷ls
检查容器的卷装载信息并获取卷路径,Type=volume。
码头工人检查d5db6a048612
查看卷中的数据
CD/var/lib/docker/volumes/6189 c 90831d 019229 a2 e 8593453 Fe 1c 334 faec 1c 56 db 80 b 9 f 99773d 21 C9 c 55/_ data
检查容器中的相应数据。结果:容器中的数据=体积中的数据。
输入容器以更新index.html文件的内容。
docker exec -it d5db6a048612 bash
cd htdocs echo更新索引index.html
再次检查卷中的内容,它已经与新卷同步。
从而实现容器和主机之间的数据共享。
强行删除容器,再看卷内数据,可以看到它还存在。
文档编号rm -f d5db6a048612
绑定安装
以只读方式将主机的/root/htdocs目录挂载到名为httpd1的httpd容器,并映射端口8081。
docker运行名httpd 1-d-p 8081:80-v/root/htdocs:/usr/local/Apache 2/htdocs:ro httpd
查看容器装载信息。类型=绑定
码头工人检查httpd1
有了主机上的新index.html文件数据,可以确认httpd1容器中的数据也有了新的。
从而实现了容器和主机之间的数据共享。
输入httpd1容器以更新index.html文件数据,提示只读。
将host /root/htdocs挂载到名为httpd2的http容器,映射端口8082,并且不要设置ro。
docker运行名httpd 2-d-p 8082:80-v/root/htdocs/:/usr/local/Apache 2/htdocs httpd
输入httpd2容器以更新index.html。
docker exec -it httpd2 bash
分别检查主机、HTTP 1和HTTP 2中的数据,三者的数据一致。
这时候就证明了容器之间的数据是共享的。
更多关于云服务器,域名注册,虚拟主机的问题,请访问西部数码代理官网:www.chenqinet.cn。