Docker 为容器提供了两种存放数据的资源:由 storage driver 管理镜像层和容器层,为无状态容器提供数据存储;由 Data volume管理应用数据,为有状态容器提供数据存储。
无状态容器:指容器在运行过程中不需要保存数据(数据非持久化保存),每次访问的结果不依赖上一次访问,如提供静态页面的web服务器;
有状态容器:指容器需要保存数据(数据持久化保存),而且数据会发生变化,访问的结果依赖之前请求的处理结果,最典型的就是数据库服务器。
1. storage driver
storage driver 实现了镜像的多层数据的堆叠(镜像的分层结构)并为用户提供一个单一的合并之后的统一视图。
Docker 安装时会根据当前系统的配置选择默认的 driver ,默认driver是overlay2,底层文件系统是xfs(docker-ce版本:20.10.5)
2. Data volume
Data Volume 本质上是 Docker Host 上文件系统中的目录或文件(而不是没有格式化的磁盘),是docker host文件系统的一部分(容量取决于挂载的目录或者文件),能够直接被 mount 到容器的文件系统中,容器可以直接读写 volume 中的数据,并且数据也可以被永久地保存,即使使用它的容器已经销毁。
docker 提供了两种类型的 volume : bind mount、docker managed volume。
- bind mount
bind mount 是将 host 上已存在的、指定的目录或文件 mount 到容器的目录或文件上,所以原目录或文件内容会被覆盖,由host上的目录或文件取代;bind mount 需要指定 host文件系统的特定路径,这就限制了容器的可移植性;docker 不会销毁 bind mount,删除数据的工作只能由 host 负责。
bind mount 时还可以指定数据的读写权限,默认是可读可写,可指定为只读(此时只有host才有权限修改)来提高数据安全性;可以将共享数据放在 bind mount 中,然后将其 mount 到多个容器来实现容器之间数据共享。
指定 -v <MOUNT_POINT>:
#将本地的~/htdocs目录挂载到apache首页目录下
[root@node1 ~]# docker run -d -P --name web1 \
-v ~/htdocs:/usr/local/apache2/htdocs httpd:2.4
[root@node1 ~]# docker run -d -P --name web2 \
-v ~/htdocs:/usr/local/apache2/htdocs httpd:2.4
[root@node1 ~]# docker run -d -P --name web3 \
-v ~/htdocs:/usr/local/apache2/htdocs httpd:2.4
#修改本地~/htdocs/index.html文件以验证应用首页内容也随之修改,且web集群共享该首页
[root@node1 ~]# echo "This is a new index for web cluster" > htdocs/index.html
[root@node1 ~]# curl 192.168.154.11:49153
This is a new index for web cluster
[