docker — 容器存储

news/2024/12/5 6:36:04/

目录

一、容器存储机制

1、Storage Driver

2、查看Storage Driver

3、Docker 数据管理

4、volume 及 示例

1. 创建一个卷,挂载给一个 httpd 容器

2. 使用 docker volume ls 命令查看卷信息

3. 使用 docker volume inspect 命令查看卷挂载信息

4. 使用 docker inspect 命令查看容器中的 Mounts 信息

5. 查看 volume 中的内容,与容器中的内容一样

6. 在宿主机上更新 volume 内容,发现容器上也同时更新了

7. 销毁容器后,volume 依旧存在,其数据可持久化保存

8. 删除volume

5、bind mount 机制 及 示例

1. bind mount 是将宿主机上已有的目录或文件mount 到容器中

2. 将 /root/htdocs 目录下的 index.html 文件挂载给一个 httpd 容器

3. 分别查看宿主机和容器中的 index.html 文件,发现两者的内容是一样的

4. 销毁容器后

二、数据共享

1、数据共享 — — 主机与容器间

1. 主机与容器数据共享:

2、数据共享 — — 容器与容器间

3、bind mount 实现容器间数据共享

1. 启动两个 httpd 容器,分别命名为 h1 和 h2,并同时挂载 /root/htdocs 目录

2. 查看两个容器的 index.html 内容,是一致的

3. 在宿主机上更新 index.html 内容后,再次查看容器 index.html 文件内容,已同步更新

4、volume container 实现容器间的数据共享

1. 创建一个 volume container

2. 创建两个 httpd 容器,并引用 vc 中的数据

3. 使用 docker inspect 命令查看 vc、h3、h4 容器的挂载信息,三者的卷的挂载是一致的

4. 更新 bind mount 中的数据,并访问 h3 和 h4 验证数据共享


一、容器存储机制

1、Storage Driver

1. Storage driver:管理镜像层和容器层

        Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户               提供了多层数据合并后的统一视图

        所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略

        docker info 命令可查看当系统上的 storage driver

Storage Driver 类型       功能
overlay2            所有当前 Linux 发行版,都支持的首选存储驱动程序
AUFS仅在 ubuntu 和 Debian 上支持
Device MapperCentOS 和 RHEL 的推荐存储驱动程序。但当前版本的 CentOS 和 RHEL 现在都支持overlay2
Btrfs仅在S LES 上支持
ZFS仅支持ubuntu 14.04 或更高版本
VFS

主要用于测试目的,不建议用于生成环境

 参考资料: Docker storage drivers | Docker Documentation

2、查看Storage Driver

1. 使用 docker info 可查看当前系统使用的 Storage driver

3、Docker 数据管理

1. Docker 容器中持久化数据一般采用两种存储方式:

参考资料: Use volumes | Docker Documentation 

4、volume 及 示例

1. volume 由 Docker 管理,是将特定目录挂载给容器

        ① docker 会在指定路径下为每个 volume 生成一个目录,作为 mount 源

                · 路径: /var/lib/docker/volumes        (若路径不存在会自动创建

        ② 可通过 -v 将 volume 挂载给一个容器(只要有-v就是持久存储

                · -v格式<host:path> : <container path>      (若路径不存在会自动创建

注:若不使用-v选项,数据是在内存中,数据不会持久保存

参考资料: Use volumes | Docker Documentation

1. 创建一个卷,挂载给一个 httpd 容器

# docker run -d -p 8080:80 -v /usr/local/apache2/htdocs httpd    #使用容器中的目录作为卷
'容器中的目录 /usr/local/apache2/htdocs 挂载到本地方法1:目录可以通过https://hub.docker.com/  查看对应镜像查看详细信息方法2:可以先运行起来,进入容器通过查看配置文件,过滤^DocumentRoot就是需要的目录'

2. 使用 docker volume ls 命令查看卷信息

# docker volume ls
DRIVER    VOLUME NAME
local     cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523

3. 使用 docker volume inspect 命令查看卷挂载信息

        自动生成了一个带有volume name 的文件夹作为 mount 源

# docker volume ls
DRIVER    VOLUME NAME
local     cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523
root@k8s-master:~# docker volume inspect cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523 
[{"CreatedAt": "2022-10-27T00:40:34Z","Driver": "local","Labels": null,"Mountpoint": "/var/lib/docker/volumes/cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523/_data", #此目录为宿主机实际目录"Name": "cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523","Options": null,"Scope": "local"}
]

4. 使用 docker inspect 命令查看容器中的 Mounts 信息

注意 Type 字段的值是 volume

# docker inspect 11603a249d4a| grep -wA 11 "Mounts""Mounts": [{"Type": "volume","Name": "cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523","Source": "/var/lib/docker/volumes/cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523/_data","Destination": "/usr/local/apache2/htdocs","Driver": "local","Mode": "","RW": true,"Propagation": ""}],

5. 查看 volume 中的内容,与容器中的内容一样

容器中的数据被 copy 到了 volume 中

'查看容器中的内容'
# docker exec -it 11603a249d4a cat /usr/local/apache2/htdocs/index.html
<html><body><h1>It works!</h1></body></html>'查看volume中的内容'
# cat /var/lib/docker/volumes/cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523/_data/index.html 
<html><body><h1>It works!</h1></body></html>

6. 在宿主机上更新 volume 内容,发现容器上也同时更新了

# echo hello-world > /var/lib/docker/volumes/cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523/_data/index.html# docker exec -it 11603a249d4a cat /usr/local/apache2/htdocs/index.html
hello-world

7. 销毁容器后,volume 依旧存在,其数据可持久化保存

~# docker stop 11603a249d4a    #停止容器
11603a249d4a
root@k8s-master:~# docker rm 11603a249d4a    #删除容器
11603a249d4a# docker volume ls        #volume依然存在
DRIVER    VOLUME NAME
local     cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523# cat /var/lib/docker/volumes/cac2081115360ff43ce5c2c8db0ca1666acb707182dd81d77e0dfd9ffae3b523/_data/index.html 
hello-world

8. 删除volume

# docker volume rm 卷名    #若确定volume不在需要,可以手动删除

5、bind mount 机制 及 示例

1. bind mount 是将宿主机上已有的目录或文件mount 到容器中

区别:bind mount:  是在自定义目录挂载

           volume:        是在指定路径挂载  

参考资料:  Use bind mounts | Docker Documentation

2. 将 /root/htdocs 目录下的 index.html 文件挂载给一个 httpd 容器

# docker run -d -p 8081:80 -v /root/htdocs:/usr/local/apache2/htdocs/ httpd
f789db02964cdbbb8848ee7473b5c56e117d5f778fece0d4e5aca242c5a7f2ef'发现是空的,因为原本没有这个目录,是创建容器时创建出来的'
# ls /root/htdocs/ 
# curl localhost:8081
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN">
<html><head><title>Index of /</title></head><body>
<h1>Index of /</h1>
<ul></ul>
</body></html>

3. 分别查看宿主机和容器中的 index.html 文件,发现两者的内容是一样的

'写入index文件到挂载路径,发现已同步到容器内'
# echo haha > /root/htdocs/index.html
# curl localhost:8081
haha

4. 销毁容器后

再次查看 /root/htdocs/index.html 文件内容,数据依旧存在,可持久化保存

# docker stop f789db02964c
f789db02964c
# docker rm f789db02964c
f789db02964c
# cat /root/htdocs/index.html 
haha

二、数据共享

1、数据共享 — — 主机与容器间

1. 主机与容器数据共享:

volume:将Host 上的数据 copy 到容器的 volume

        · 使用 docker cp 命令在容器与 Host 之间复制数据

bind mount:将Host 上的目录或文件 mount 到容器中

第一次是容器到主机,再之后都是主机到容器;即数据的持久保存

2、数据共享 — — 容器与容器间

3、bind mount 实现容器间数据共享

1. 启动两个 httpd 容器,分别命名为 h1 和 h2,并同时挂载 /root/htdocs 目录

'注意宿主机端口不要和已有端口冲突'
# docker run --name h1 -d -p 8080:80 -v /root/htdocs:/usr/local/apache2/htdocs httpd
3c4c6cfc05a6b0a61003171c30657841b426e03c489a66c1c21ba72bfe6c7284# docker run --name h2 -d -p 8082:80 -v /root/htdocs:/usr/local/apache2/htdocs httpd
95dfdd74321788ad8b682ac8219070beacb715f48bb89cd7485e3d2fe5527234

2. 查看两个容器的 index.html 内容,是一致的

# curl localhost:8080
haha
# curl localhost:8082
haha

3. 在宿主机上更新 index.html 内容后,再次查看容器 index.html 文件内容,已同步更新

# echo heihei > /root/htdocs/index.html 
# curl localhost:8080
heihei
# curl localhost:8082
heihei

4、volume container 实现容器间的数据共享

1. 创建一个 volume container

# docker run -d --name vc -v /root/htdocs/:/usr/local/apache2/htdocs httpd
aad6773c0caa9a543b6b078fbd6d0687648dc48f3e0cfb87ed2eaeed45a222b8

2. 创建两个 httpd 容器,并引用 vc 中的数据

# docker run -d --name h3 -p 1001:80 --volumes-from vc httpd
084bac317323b0d95c5756734f7a36c9cdeee59bb2de1159df8848b7fdd08863# docker run -d --name h4 -p 1002:80 --volumes-from vc httpd
bef30117924211df865dc8d01109278839ff3c282c8cde62b0466c1637654aa9

3. 使用 docker inspect 命令查看 vc、h3、h4 容器的挂载信息,三者的卷的挂载是一致的

# docker inspect vc | grep -A 8 "Mounts""Mounts": [{"Type": "bind","Source": "/root/htdocs","Destination": "/usr/local/apache2/htdocs","Mode": "","RW": true,"Propagation": "rprivate"}
# docker inspect h3 | grep -A 8 "Mounts""Mounts": [{"Type": "bind","Source": "/root/htdocs","Destination": "/usr/local/apache2/htdocs","Mode": "","RW": true,"Propagation": "rprivate"}
# docker inspect h4 | grep -A 8 "Mounts""Mounts": [{"Type": "bind","Source": "/root/htdocs","Destination": "/usr/local/apache2/htdocs","Mode": "","RW": true,"Propagation": "rprivate"}

4. 更新 bind mount 中的数据,并访问 h3 和 h4 验证数据共享

# echo new-data > /root/htdocs/index.html 
# curl localhost:1001
new-data
# curl localhost:1002
new-data

http://www.ppmy.cn/news/112660.html

相关文章

温度敏感性药品不同储运容器的温度监测方法

——LIBERO CE在液氮罐、干冰运输箱、冷冻柜&#xff0c;冷藏箱、冰箱等的应用举例 一、温度敏感性药品的不同储运方式 药品不在运输就是在贮存过程中&#xff0c;温度敏感性药品指的是由于温度的变化引起如含量、有关物质、效价等质量指标发生明显改变的药品&#xff0c;对药品…

冻肉进口报关注意事项及进口企业都应该具备哪些资质?

接单实操 接到一票单子 首先要审查进口企业是否有进口此产品的资质 其次要审核单据是否单证相符 单单相符 单货相符 最后整理资料。 一、进口企业需要具备哪些资质及进口这类产品都有哪些条件&#xff1f; 进口收货人需具备的资质&#xff1a; 1.经营食品资质或食品流通许可证…

docker容器的存储管理

系列文章目录 第一部分 基于devicemapper 文件存储驱动的docker根卷扩容 第二部分 基于overlay2 文件存储驱动的docker卷管理 文章目录 系列文章目录前言一、背景信息二、扩容的方法1.定位块设备布局2.扩容loop块设备3.扩容块设备pool池4.扩容容器块设备5.扩容容器的文件系统 …

Docker容器管理

一、Docker的基本信息 1、系统环境 [rootDocker ~]# uname -r #显示操作系统的发行版号 3.10.0-693.el7.x86_64 [rootDocker ~]# cat /etc/redhat-release #查看centos 版本 CentOS Linux release 7.4.1708 (Core) 2、Docker版本 [rootDocker …

containerd和docker的区别

CNI网络 对比项dockercontainerd谁负责调用CNIkubelet内部的docker-shimcontainerd内置的cri-plugin(containerd 1.1以后)如何配置CNIkubelet参数 --cni-bin-dir 和 --cni-conf-dircontainerd配置文件(toml)&#xff1a;plugins.cri.cni bin_dir “/opt/cni/bin” conf_dir …

如何进行温度分布验证?概念、原理与方法

一、什么是温度分布验证&#xff1f; 温度分布验证是通过在规定的研究时间内测量定义区域内的多个点来确定特定温度控制环境或过程&#xff08;如冷冻柜、冰箱、培养箱、稳定室、仓库或高压灭菌器&#xff09;的温度分布的过程。 温度分布验证的目标是确定每个测量点之间的差…

基于TEC1-12706半导体制冷片的微型“小冰箱”

炎炎夏日&#xff0c;相信大家或多或少都会这样一种经历&#xff1a;上下班或者外出时&#xff0c;走在烈日当空的路上&#xff0c;仿佛整个人都快要被太阳给晒化了&#xff0c;迫不及待想跑进有空调的地方&#xff0c;来瓶冰镇饮料&#xff0c;甚至来点冰镇水果&#xff0c;那…

集成灶/小家电语音提示芯片方案-WTN6040-8S唯创知音自主研发

集成灶一直是厨房中常用设备之一&#xff0c;而现代技术的不断发展&#xff0c;为集成灶的升级提供了更多的可能性。深圳唯创知音为了让家用电器更加便民&#xff0c;专门为集成灶开发了一款语音IC方案——WTN6040语音芯片方案&#xff0c;这款芯片可以满足集成灶对语音提示功能…