小知识:docker容器的几种存储详解

写在前面

我们在上篇学习了容器网络,对容器网络驱动bridge工作原理做了较为详细的介绍,今天小作文一起看看容器中另一个关键域-存储

容器的存储可以分为两大类:

一种是与镜像相关的即我们在《docker容器技术基础之联合文件系统overlayfs》一文提到的容器层copy-on-write特性。默认情况下,在容器内创建的所有文件都存储在可写容器层上,这种直接将文件存储在容器层的方式数据难以持久化和共享,由于依赖存储驱动与使用直接写入主机文件系统的数据卷相比,这种额外的抽象会降低性能 。

另一中是宿主机存储即通过将宿主机目录绑定或挂在到容器中使用,容器停止后数据也能持久化。小作文主要介绍后者。

几种存储挂载方式

这里我们根据数据存储在 docker 主机上的不同位置绘制如下图:

%小知识:docker容器的几种存储详解-猿站网-插图

1.bind mounts

绑定挂载与卷相比,功能有限。使用绑定挂载时,主机上的文件或目录会挂载到容器中。文件或目录由其在主机上的完整路径引用。目录不需要已经存在于 docker 主机上,如果不存在,docker会帮我们创建。 注意一下,只能自动创建目录哦。

我们通过 -v 选项绑定挂载一个目录 /nginx/html 到容器中看看

?
1
docker run -dt -v /nginx/html:/usr/share/nginx/html –name nginx nginx

通过docker inspect nginx 查看容器 mounts字段

?
1
2
3
4
5
6
7
8
9
10
“mounts”: [
{
“type”: “bind”,
“source”: “/nginx/html”,
“destination”: “/usr/share/nginx/html”,
“mode”: “”,
“rw”: true,
“propagation”: “rprivate”
}
],

接着我们在docker主机上创建一个index.html并写入hello nginx,然后访问容器ip,显然我们的挂载已经生效了。

?
1
2
3
[root@localhost ~]# echo “hello nginx” >  /nginx/html/index.html
[root@localhost ~]# curl 172.17.0.4
hello nginx

这里有一个问题,我们可以通过docker主机修改文件使容器内文件生效,反过来也一样,容器可以修改、创建和删除主机文件系统上的内容。处理这个问题我们可以在创建容器的时候配置挂载目录的权限,比如下面的只读权限:

?
1
docker run -dt -v /nginx/html:/usr/share/nginx/html:ro –name nginx nginx

所以在我们使用绑定挂载的时候,你操作的是主机文件系统,你必须清楚如下:

你挂载的目录包含哪些内容,以免对其他应用造成影响。 你的容器是否应该有权操作这些目录。

2.volumes

volume存储卷由 docker 创建和管理,我们可以使用该docker volume create命令显式的创建卷,或者在容器创建时创建卷。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# docker volume create nginx_volume
nginx_volume
[root@localhost volumes]# docker inspect  nginx_volume
[
{
“createdat”: “2021-08-12t01:58:04-04:00”,
“driver”: “local”,
“labels”: {},
“mountpoint”: “/var/lib/docker/volumes/nginx_volume/_data”,
“name”: “nginx_volume”,
“options”: {},
“scope”: “local”
}
]

可以看到挂载点处于docker的根目录/var/lib/docker/volumes下

通过docker volume rm/prune 清除单个或所有未再使用的卷,可以通过docker 命令来管理卷是对比绑定挂载的一个优势。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# docker volume ls
driver    volume name
local     owncloud-docker-server_files
local     owncloud-docker-server_mysql
local     owncloud-docker-server_redis
[root@localhost ~]# docker volume prune
warning! this will remove all local volumes not used by at least one container.
are you sure you want to continue? [y/n] y
deleted volumes:
owncloud-docker-server_files
owncloud-docker-server_mysql
owncloud-docker-server_redis
total reclaimed space: 199.4mb

在创建容器时如果未指定容器挂载的源则docker会自动为我们创建一个匿名卷,同样位于docker根目录下。

?
1
2
3
4
5
6
7
8
[root@localhost volumes]# docker run -dt -v /usr/share/nginx/html –name nginx_with_volume nginx
d25bdfce9c7ac7bde5ae35067f6d9cf9f0cd2c9cbea6d1bbd7127b3949ef5ac6
[root@localhost volumes]# docker volume ls
driver    volume name
local     d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980
local     nginx_volume
[root@localhost volumes]# ls /var/lib/docker/volumes/
backingfsblockdev  d8e943f57d17a255f8a4ac3ecbd6471a735aa64cc7a606c52f61319a6c754980  metadata.db  nginx_volume

当我们创建挂载卷之后,此时的存储与bind mounts是一致,不过当 docker 主机不能保证具有给定的目录或文件结构时,卷可帮助我们将 docker 主机的配置与容器运行时分离。这样一来当我们需要将数据从一台 docker 主机备份、还原或迁移到另一台时,卷就很方便了,可以脱离host path的限制。

在使用绑定挂载和卷时我们要注意下面传播覆盖原则:

%小知识:docker容器的几种存储详解-1猿站网-插图

挂载一个空卷时:容器内目录的内容会传播(复制)到卷中。

绑定挂载或非空卷时:容器内目录的内容会被卷或绑定的主机目录覆盖。

3.tmpfs mount

tmpfs挂载仅适用于linux主机,当我们使用tmpfs挂载创建容器时,容器可以在容器的可写层之外创建文件。将数据保留在内存中,当容器停止时,写入的数据也将被移除。主要用于临时存储不想保留在主机或容器可写层中的敏感文件。

通过–tmpfs选项挂载一个内存块。

?
1
docker run -dt –name busybox_tmpfs –tmpfs /etc/running busybox

通过–mount的方式带上参数,指定临时存储大小。

?
1
docker run -dt –name busybox_tmpfs2 –mount type=tmpfs,tmpfs-size=2048,destination=/etc/running busybox

存储数据共享

在容器之间共享数据主要有两种方法,第一种比较简单,只需要将目录或者volume挂载到多个容器中即可。这里不做赘述,我们来看一下通过中间容器实现共享的方式。

我们创建一个中间容器,包含绑定挂载目录和一个卷。

?
1
docker create -v /share:/volume1 -v /volume2  –name volume_share  busybox

在我们需要共享的容器中通过选项–volumes-from拿过来用即可

?
1
docker run -d -t –volumes-from volume_share  –name container1  busybox

我们inspect检查一下mounts字段,此时container1已经挂载到了一个bind目录和一个volume

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
“mounts”: [
{
“type”: “bind”,
“source”: “/share”,
“destination”: “/volume1”,
“mode”: “”,
“rw”: true,
“propagation”: “rprivate”
},
{
“type”: “volume”,
“name”: “21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e”,
“source”: “/var/lib/docker/volumes/21605e49a0ba90a1b952a32c1b3f0d42735da8bfe718f0dc76c37e91f1e51c0e/_data”,
“destination”: “/volume2”,
“driver”: “local”,
“mode”: “”,
“rw”: true,
“propagation”: “”
}
],

关于docker容器存储我们先学习到这,希望这篇小作文在你需要时对你有点用。

到此这篇关于docker容器的几种存储详解的文章就介绍到这了,更多相关docker容器存储内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://juejin.cn/post/6995447432095989790

声明: 猿站网有关资源均来自网络搜集与网友提供,任何涉及商业盈利目的的均不得使用,否则产生的一切后果将由您自己承担! 本平台资源仅供个人学习交流、测试使用 所有内容请在下载后24小时内删除,制止非法恶意传播,不对任何下载或转载者造成的危害负任何法律责任!也请大家支持、购置正版! 。本站一律禁止以任何方式发布或转载任何违法的相关信息访客发现请向站长举报,会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。本网站的资源部分来源于网络,如有侵权烦请发送邮件至:2697268773@qq.com进行处理。
建站知识

小知识:浅谈Docker如何自定义host文件

2023-3-19 10:10:32

建站知识

小知识:使用Docker的NFS-Ganesha镜像搭建nfs服务器的详细过程

2023-3-19 10:25:00

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索