docker — 容器存储

这篇具有很好参考价值的文章主要介绍了docker — 容器存储。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、容器存储机制

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 Mapper CentOS 和 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 容器中持久化数据一般采用两种存储方式:

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:        是在指定路径挂载  

docker — 容器存储

参考资料:  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 到容器中

docker — 容器存储

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

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

docker — 容器存储

docker — 容器存储文章来源地址https://www.toymoban.com/news/detail-401796.html

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

到了这里,关于docker — 容器存储的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • docker 容器修改端口和目录映射

    一般在运行容器时,我们都会通过参数 -p(使用大写的-P参数则会随机选择宿主机的一个端口进行映射)来指定宿主机和容器端口的映射,例如 这里是将容器内的80端口映射到宿主机的8088端口 参数说明 -d 表示后台运行容器 -t 为docker分配一个伪终端并绑定到容器的标准输入上

    2024年04月26日
    浏览(54)
  • docker将本地目录映射到容器

    留个记录,方便回看 1.查看容器存在位置 返回的是docker容器存储的位置:/var/lib/docker 2.获取容器对应的那个较长的id 会返回一个挺长的容器id,例如9dc7dcfcc1d3d4b413a75ef6f70ddf6c6b03c3003e03916a3faadcf25e4ee813 3.进入对应容器配置文件目录 进入之后应该可以看到 config.v2.json 和 hostconfig.js

    2024年02月09日
    浏览(45)
  • 新版docker存储目录迁移教程

    前言 docker默认数据存储目录为 /var/lib/docker ,在docker的使用中随着下载镜像越来越多,构建镜像、运行容器越来越多, 数据目录必然会逐渐增大;当所有docker镜像、容器对磁盘的使用达到上限时,就需要对数据目录进行迁移。 查看磁盘大小 此处,我们可以看到, home 的存储空

    2024年02月11日
    浏览(48)
  • Docker -v 挂载主机目录到容器中(及数据卷容器)

    使用 Docker 的过程中,经常需要挂载主机上的目录或文件到 Docker 容器中,以实现数据的共享或持久化。而 docker run -v 命令便是用于挂载主机目录到 Docker 容器中的常用命令。 在创建启动容器时,使用 -v 参数设置数据卷 注意事项: 目录必须是绝对路径 如果目录不存在,会自

    2024年02月10日
    浏览(46)
  • docker给已经启动容器添加挂载目录

    1.关闭docker 2. sudo su切换到root身份 cd /var/lib/docker/containers/容器id/,进入对应容器目录 3.vim hostconfig.json 修改如下,将容器目录/import绑定到主机/data目录: \\\"Binds\\\": [\\\"/data:/import\\\"], 4.vim config.v2.json 修改如下,添加MountPoints: 5.启动docker    systemctl start docker.socket  systemctl start docker.ser

    2024年02月11日
    浏览(45)
  • windows 环境修改 Docker 存储目录

    windows 环境修改存储目录 docker 安装时不提供指定安装路径和数据存储路径的选项,且默认是安装在C盘的。C盘比较小的,等docker运行久了,一大堆的东西放在上面容易导致磁盘爆掉。所以安装前可以做些准备,让安装的实际路径不在C盘,当然安装好的的,也可以卸载了重新来

    2024年02月16日
    浏览(39)
  • Docker 对已经启动的容器添加目录映射

    需要在测试环境先进行试验,操作不当可能导致容器无法启动!!! 操作系统:CentOS 7.9.2009 x86_64 Docker 版本:20.10.12 使用 Docker 进行部署 TDengine 数据库,需要每天进行数据备份,但是创建该容器时没有添加目录映射到宿主机,如果容器异常可能导致数据无法恢复。 关闭 doc

    2024年02月04日
    浏览(53)
  • docker容器共享宿主机环境(目录挂载)

    一、背景介绍 如果开发的服务均需要将打成docker镜像,可是随着服务越来越多,镜像也越来越多。每次制作镜像的时候都需要将依赖打进容器,这样一个jre的环境就是100多M。有一天突发奇想,容器能不能共用宿主机的环境?这样每次打镜像时体积就会少不少。 二、测试 我们

    2024年02月09日
    浏览(62)
  • docker cp命令: 主机和Docker容器之间复制文件或目录

    docker cp命令是用于在主机和Docker容器之间复制文件或目录的命令。可以从容器复制文件到主机,也可以从主机复制文件到容器。 使用docker cp命令的基本语法如下: 例如,要将容器内的文件复制到主机上: 要将主机上的文件复制到容器内: 复制目录也是一样的命令 备注 :

    2024年04月29日
    浏览(45)
  • Docker容器原生健康检查机制详解

    健康检查机制是用来检查服务的可用性,当服务不可用时及时重启以恢复可用性。之前的文章《Kubernetes中配置livenessProbe、readinessProbe和startupProbe》讲解了Kubernetes中的各种健康检查类型和配置方法,本篇文章讲解一下docker容器的健康检查机制。 看过上文提到的那篇文章的同学

    2024年02月02日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包