docker——数据卷(volume)概念及使用案例

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

docker数据卷

Docker的镜像是有⼀系列的只读层组合⽽来,当启动⼀个容器时,Docker加载镜像的所有只读层,并在最上层加⼊⼀个读写层。这个设计使得Docker可以提⾼镜像构建、存储和分发的效率,节省了时间和存储空间,然⽽也存在⼀些问题:

  • 容器中的⽂件在宿主机上存在形式复杂,不能在宿主机上很⽅便地对容器中的⽂件进⾏访问。
  • 多个容器之间的数据⽆法共享
  • 当删除容器时,容器产⽣的数据将丢失。

所以引入的数据卷的概念。Volume 是存在于⼀个或多个容器中的特定⽂件或⽂件夹,这个⽬录以独⽴于联合⽂件系统的形式在宿主机中存在,并为数据的共享和持久化提供便利。

  • volume 在容器创建时就会初始化,在容器运⾏时就可以使⽤其中的⽂件。
  • volume 能在不同的容器之间共享和重⽤
  • 对volume中数据的操作会⻢上⽣效
  • 对volume中数据的操作不会影响镜像本身
  • volume的⽣存周期独⽴于容器的⽣命周期,即使删除容器,volume仍然会存在,没有任何容器使⽤的volume也不会被Docker删除。

数据卷使用

大概命令
//Create a volume
docker volume create      
//Display detailed information on one or more volumes
docker volume inspect    
//List volumes
docker volume ls  
//Remove all unused local volumes
docker volume prune      
//Remove one or more volumes
docker volume rm 
创建数据卷
#创建⼀个名为 vol_simple的存储卷
docker volume create --name vol_simple

Docker run 和 docker create 通过指定-v参数 可以为容器挂载⼀个数据卷。这样挂载的对应宿主机是一个匿名数据卷

#没有指定volume卷,只指定了容器中的挂载点/data
 docker run -d -it -v /data ubuntu /bin/bash
#查看随机创建的volume位置,查看mounts的内容
 docker inspect {ID}
 
 #创建⼀个指定名字的volume ,并挂载到容器中的/data⽬录
docker run -d -v vol_simple:/data ubuntu

#查看数据卷的信息
docker volume inspect vol_simple
挂载数据卷

使⽤docker run 或者 docker create 创建新容器是,可以使⽤-v标签为容器添加volume。可以将⾃⾏创建或者有Docker创建的volume挂载到容器中,也可以将宿主机上的⽬录或者⽂件作为volume挂载到容器中。

将宿主机中指定⽬录作为volume挂载到容器中的/data⽬录下,⽂件夹必须使⽤绝对路径,如果宿主机中不存在指定的⽬录,则会创建⼀个空⽂件夹;如果宿主机⽂件夹已经存在,容器可以通过访问挂载点/data 从⽽访问宿主机⽂件夹中的所有内容。如果容器下原本已经存在/data⽂件夹,且不为空,那么容器中⽂件夹下原有的内容将被隐藏,来保持与宿主机中的⽂件夹⼀致

挂载案例
#1.挂载方式
#创建名为vol_simple的数据卷,并挂载到容器中的/data⽬录下
docker volume create --name vol_simple
docker run -d -v vol_simple:/data ubuntu /bin/bash
#创建⼀个随机的ID的volume,并将其挂载到容器中的/data⽬录下
docker run -d -v /data ubuntu /bin/bash
#将宿主机中指定⽬录作为volume挂载到容器中的/data⽬录下,⽂件夹必须使⽤绝对路径
#如果宿主机中不存在指定的⽬录,则会创建⼀个空⽂件夹;
#如果宿主机⽂件夹已经存才,容器可以通过访问挂载点/data 从⽽访问宿主机⽂件夹中的所有内容
#如果容器下原本已经存在/data⽂件夹,且不为空,那么容器中⽂件夹下原有的内容将被隐藏,来保持与宿主机中的⽂件夹⼀致
docker run -d -v $HOME/data:/data ubuntu /bin/bash
#2.只读挂载

# ro表示只读,rw表示读写,默认为rw
docker run -it -v $HOME/data:/data:ro ubuntu /bin/bash
# 通过修改⽂件验证
echo 123456abcdefg >> /data/test
#3.挂载多个数据卷
docker run -it -v $HOME/data:/data:ro -v /data1 -v /data2 ubuntu /bin/bash
docker run -v /path/to/host/volume1:/container/path1 -v /path/to/host/volume2:/container/path2 <image>
# 如果宿主机多个路径挂载到容器内同一个路径,只有最后一个挂载会生效
#4.通过dockerfile指定数据卷挂载
VOLUME /data
#指定多个数据卷的挂载点
VOLUME ["/data1","/data2"]

使⽤dockerfile VOLUME 指令,与docker run -v 不同的是,dockerfile指令不能挂载主机中指定的⽂件夹。这时为了保证Dockerfile的可移植性,因为不能保证所有的宿主机都有对应的⽂件夹。如果镜像中存在/data⽂件夹,这个⽂件夹中的内容将全部被复制到宿主机上对应⽂件夹中,并且根据容器中的⽂件设置合适的权限和所有者。

注意:在Dockerfile中使⽤VOLUME指令后的代码,如果尝试对这个volume进⾏修改,这些修改都不会⽣效。因为:volume 是独⽴于rootfs的存储,镜像构建过程,每⼀层类似docker commit 提交临时镜像为镜像层,docker commit不会对挂载的volume进⾏保存。

dockerfile挂载案例

案例一

FROM ubuntu
RUN useradd foo
VOLUME /data
# 后面对存储卷的修改都不会生效
RUN touch /data/file
RUN chown -R foo:foo /data
docker build -t test1:v1 -f Dockerfile .
docker run -d -it test1:v1 /bin/bash
//查看挂载点信息
docker inspect 容器ID
//查看宿主机存储卷⽬录
sudo ls 宿主机存储卷⽬录

案例二

由于挂载volume时,/data⽬录已经存在,所以/data中的⽂件以及它们的权限和所有者设置都会被复制到volume中。

FROM ubuntu
RUN useradd foo
RUN mkdir /data && touch /data/file
RUN chown -R foo:foo /data
VOLUME /data
docker build -t test1:v2 -f Dockerfile1 .
docker run -d -it test1:v2 /bin/bash
//查看挂载点信息
docker inspect 容器ID
//查看宿主机存储卷⽬录
sudo ls 宿主机存储卷⽬录

案例三

通过CMD和ENTRYPOINT指令,在容器启动时执⾏挂载点下⽂件的初始化

FROM ubuntu
RUN useradd foo
VOLUME /data
CMD touch /data/file && chown -R foo:foo /data

共享数据卷

在使⽤docker run 或docker create创建新容器时,可以使⽤–volumes-from 标签使得容器与已有容器共享volume。可以使⽤多个–volumes-from标签,使得容器与多个已有容器共享volume。

⼀个容器挂载了⼀个volume,即使这个容器停⽌运⾏,该volume⼈仍然存在,其他容器也可以使⽤–volume-from与这个容器共享volume。

[root@localhost example_vol]# echo $HOME
/root
[root@localhost example_vol]# mkdir $HOME/data
[root@localhost example_vol]# mkdir $HOME/readOnly_data
[root@localhost example_vol]# docker volume create vol_simple1
vol_simple1
[root@localhost example_vol]# docker volume create vol_simple2
vol_simple2
# 运行容器,挂载宿主机目录和创建的数据卷
[root@localhost example_vol]# docker run -d -it -v vol_simple1:/vol_simple1 -v $HOME/data:/data -v $HOME/readOnly_data:/readOnly_data:ro --name share_data ubuntu /bin/bash
[root@localhost example_vol]# docker run -d -it -v vol_simple2:/vol_simple2 --name share_data2 ubuntu /bin/bash

# 通过--volumes-from 共享容器share_data和share_data2的数据卷
[root@localhost example_vol]# docker run -d -it --volumes-from share_data --volumes-from share_data2 --name volume_from1 ubuntu /bin/bash
97b43a8a0851450e08737c5c108742e51dc1902a04c798cd5e1fe5a022f894fc
[root@localhost example_vol]# docker run -d -it --volumes-from share_data --volumes-from share_data2 --name volume_from2 ubuntu /bin/bash
472a7e7fd1de6d19fb05c8d87d7f3bc5da6090160e2d4efb00c65ca8acb701da
#docker inspect查看一下。可以看到都挂载了哪些数据卷或者绑定目录
[root@localhost example_vol]# docker inspect 472a7e7fd1de
...
 "Mounts": [
            {
                "Type": "bind",
                "Source": "/root/readOnly_data",
                "Destination": "/readOnly_data",
                "Mode": "",
                "RW": false,
                "Propagation": "rprivate"
            },
            {
                "Type": "volume",
                "Name": "vol_simple2",
                "Source": "/var/lib/docker/volumes/vol_simple2/_data",
                "Destination": "/vol_simple2",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "vol_simple1",
                "Source": "/var/lib/docker/volumes/vol_simple1/_data",
                "Destination": "/vol_simple1",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "bind",
                "Source": "/root/data",
                "Destination": "/data",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],

...

删除数据卷

如果创建容器时从容器中挂载了volume,在/var/lib/docker/volumes下会⽣产与volume对应的⽬录(可使⽤docker inspect 命令查看容器信息找到对应的信息)。

使⽤docker rm 删除容器并不会删除与volume对应的⽬录,这些⽬录会占据不必要的存储空间。

删除volume的方式

  • 使⽤docker volume rm <volume_name> 删除数据卷
  • 使⽤docker rm -v <container_name> 删除容器时⼀并删除它挂载的数据卷
  • 在运⾏容器时使⽤docker run --rm 标签会在容器停⽌运⾏时删除容器以及容器所挂载的volume

注意:

  • 在使⽤第⼀种docker volume rm 删除时,只有当没有任何容器使⽤该volume的时候,才能被删除成功

  • 另外两种删除⽅式,只会对挂载在该容器上的未指定名称(匿名的)的volume进⾏删除,⽽会对⽤户指定名称的(具名的)volume进⾏保留

  • 如果volume 是在创建容器时从宿主机中挂载的,⽆论对容器进⾏任何操作都不会导致其在宿主机中被删除,如果不需要这些⽂件,只能⼿动删除。(从宿主机中挂载是指 docker run -v dir:dir 这种模式

备份和迁移数据卷

volume 作为数据的载体,在很多情况下需要对其中的数据进⾏备份、迁移,或是从已有数据恢复。我们最容易想到⼀个备份还原的⽅式,那就是通过inspect 命令查看容器信息,找到对应的数据卷,⼿动打包数据;同样的还原那就是把打包好的数据解压到对应的数据卷。

同时可以采用–volumes-from实现备份和还原

备份

启动另外⼀个临时容器,共享挂载数据容器share_data,同时挂载当前⽬录到容器的/backup。启动容器时执⾏打包命令,将/data挂载点下的数据打包到/backup/data.tar ⽂件中。–rm 表示该容器停⽌后会删除该容器和该容器的数据卷

docker run --rm --volumes-from share_data -v $(pwd):/backup ubuntu tar cvf /backup/data.tar /data
恢复
# 创建需要迁移的目标容器
docker run -d -it --name vol_bck -v /data ubuntu /bin/bash

创建临时容器,通过共享存储的⽅式与⽬标容器共享存储,同时挂载当前⽬录到容器的/backup。启动容器时从backup挂载点下的data.tar 解压⽂件到容器的根⽬录。文章来源地址https://www.toymoban.com/news/detail-770445.html

docker run --rm --volumes-from vol_bck -v $(pwd):/backup ubuntu tar xvf /backup/data.tar -C /

到了这里,关于docker——数据卷(volume)概念及使用案例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【云原生】Docker的端口映射、数据卷、数据卷容器、容器互联

    目录 一、端口映射(相当于添加iptables的DANT) 二、数据卷创建(宿主机目录或文件挂载到容器中) 三、数据卷容器(多个容器通过同一个数据卷容器为基点,实现所有容器数据共享) 四、容器互联(可以通过容器名称或连接别名通信) 在启动容器的时候,如果不指定对应

    2024年01月25日
    浏览(32)
  • 【云原生】Docker的数据管理(数据卷、容器互联)

    目录 一、数据卷(容器与宿主机之间数据共享) 二、数据卷容器(容器与容器之间数据共享) 三、 容器互联(使用centos镜像) 总结 用户在使用Docker的过程中,往往需要能查看容器内应用产生的数据,或者需要把容器内的数据进行备份,甚至多个容器之间进行数据的共享,

    2024年02月11日
    浏览(36)
  • 五、容器数据卷(Volume)

    先来看看Docker的理念: 将运用与运行的环境打包形成容器运行 ,运行可以伴随着容器,但是我们对数据的要求希望是持久化的 容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后

    2024年02月05日
    浏览(24)
  • 【云原生】第八篇--Docker容器数据持久化存储机制

    物理机或虚拟机数据持久化存储 由于物理机或虚拟机本身就拥有大容量的磁盘,所以可以直接

    2023年04月09日
    浏览(29)
  • 解决docker通过volumes挂载文件,宿主机修改后容器内不同步,重启服务才能同步

    将文件的权限改为777,即 chmod 777 filename 。 详细解释在该文章: https://huaweicloud.csdn.net/633114e5d3efff3090b51a5a.html 说明: 这是由于linux系统文件挂载机制导致的。 docker通过volumes挂载文件到容器中,有以下两种方式: 1、挂载目录 2、挂载具体文件:并不是挂载了某个文件的路径,

    2024年03月10日
    浏览(46)
  • 云原生系列之管理docker容器中的数据管理实战

    在生产环境中使用docker,一方面需要对数据进行保存或者在多个容器之间进行数据共享; 另一方面在docker的容器被删除之后,并不会保留容器的状态信息。 想要实现docker容器的信息持久化,就涉及到docker的数据管理,今天我们就来聊聊docker数据管理那些事。

    2024年02月12日
    浏览(28)
  • 【云原生】监视Docker桌面的容器内存和CPU使用情况

    目录 一、如何监视Docker桌面的容器内存和CPU使用情况 1、stats命令 2、Docker 统计命令stats是如何工作的 2.1、命令与描述 2.2、OPTIONS 2.3、例子 2.4、格式化 3、满足资源使用扩展 4、如何安装“资源使用情况”扩展插件? 5、总结     Docker 有一个内置的 stats 命令,可以简单地查看

    2023年04月09日
    浏览(27)
  • Docker和容器化:简介和使用案例

    容器化技术在近年来变得越来越流行,为开发人员和运维团队提供了更加灵活、高效的软件部署和管理方式。其中,Docker是最为知名和广泛使用的容器化平台之一。本篇博客文章将介绍Docker和容器化的基本概念,并提供一些使用案例,帮助读者更好地理解和应用这一技术。

    2024年02月07日
    浏览(25)
  • Docker容器:docker数据管理、镜像的创建及dockerfile案例

    因为数据写入后如果停止了容器,再开启数据就会消失,使用数据管理的数据卷挂载,实现了数据的持久化,重启数据还会存在;还有一种方式,容器之间共享文件即相当于有个备份,也会解决停止容器后数据消失的问题。 管理 Docker 容器中数据主要有两种方式:数据卷(

    2024年02月12日
    浏览(37)
  • 云原生之深入解析Docker容器的核心Cgroups的相关概念和使用实现

    Cgroups 是 Linux 系统内核提供的一种机制,这种机制可以根据需求将一些列系统任务机器子任务整合或分离到按资源划分登记的不同组内,从而为系统资源管理提供一个的框架。简单地说,Cgroups 可以限制、记录任务组所使用的物理组员(比如 CPU、Memory、IO等),为容器实现虚

    2024年02月12日
    浏览(29)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包