docker容器数据卷之具名挂载和匿名挂载问题

 更新时间:2021年11月02日 14:56:31   作者:java叶新东老师  
容器数据卷就是目录的挂载,将我们的容器的目录挂载到宿主机上,从而实现打通宿主机和容器之间的文件共享功能,这篇文章主要介绍了docker容器数据卷 - 具名挂载和匿名挂载问题,需要的朋友可以参考下

什么是容器数据卷

容器数据卷就是目录的挂载,将我们的容器的目录挂载到宿主机上,从而实现打通宿主机和容器之间的文件共享功能;

为什么需要容器数据卷

docker理念就是将应用和环境打包成一个镜像;但是数据怎么办呢?且不说数据库,一个项目在运行过程种肯定会产生大量的日志,这些日志对开发人员来说是非常重要的, 因为有了这些日志,我们才知道运行的过程中出现了哪些问题,然后进行排查找错;

但是在容器中,项目每次更新迭代都会将容器删除,直接替换新镜像运行;那么在这种情况下,要保存这些日志文件的话,如果每次都去往容器里复制到宿主机,这个工作量会有点大,并且如果日志文件太大的话,复制的工作也是很耗时耗力的;所以这时候就需要用到容器数据卷的功能了,说白了这个功能非常地简单,就是打通宿主和容器的文件共享功能;docker容器中产生的数据文件,会实时同步到宿主机中;相反的,宿主机产生的文件叶会同步到容器中;这样就打通了双向传输的管道;

在这里插入图片描述

容器和容器之间实现数据共享之后,就没有主容器和子容器之分了,因为它们共享的数据只有一份,是保存在宿主机上面的,删除任何一个容器,都不会影响其他容器的数据同步;

在这里插入图片描述

使用

使用容器数据卷非常简单,只需要在运行的时候加上 -v 选项即可

docker run -d -v 主机目录:容器目录 tomcat

运行以上命令后,会在容器和宿主机上自动创建相应的目录,在目录下创建或者修改文件都会自动同步过去;

如何查看是否使用了数据卷

查看一个容器是否使用了容器数据卷功能,可以通过inspect 功能查看容器的详细信息

docker inspect 容器id/容器名称

执行以上命令后会打印一大堆已经格式化的json字符串,这时候我们找到key为 Mounts的项就是容器数据卷的相关配置了,

"Mounts": [
    {
        "Type": "bind",  
        "Source": "/root/dockerContainer",  # 宿主机的目录
        "Destination": "/text",  # 容器的目录
        "Mode": "",
        "RW": true,   # RW可读可写;ro为只读,只能修改宿主机的文件; 
        "Propagation": "rprivate"
    }
],

具名挂载和匿名挂载

 指定路径挂载

上面的例子中我们用的都是指定路径挂载,就是即配置宿主机路径,又配置了容器路径;

docker run -d -v 主机目录:容器目录 tomcat

具名挂载

挂载到指定名称的目录;

# /xxx 是目录, xxx是卷名,没有斜杆的就是卷名
docker run -d -v 卷名:容器目录 tomcat 

# 查找卷名所在的目录
docker volume inspect 卷名

光说无益,测试一下,先创建容器并且挂载好目录

docker run -d --name my_tomcat  -v my_folder:/data/my_folder tomcat

使用 inspect 命令查看容器信息

docker inspect my_tomcat

在打印信息中找到 Mounts 项,其中Source的目录就是宿主机的目录;Destination的目录是挂载的容器目录;

"Mounts": [
    {
        "Type": "volume",
        "Name": "my_folder",
        "Source": "/var/lib/docker/volumes/my_folder/_data",
        "Destination": "/data/my_folder",
        "Driver": "local",
        "Mode": "z",
        "RW": true,
        "Propagation": ""
    }
]

接着进入容器

docker exec -it my_tomcat /bin/bash

# 在容器内也已经创建好了这个目录
root@ef94ff8928a1:/data/my_folder# pwd
/data/my_folder

匿名挂载

匿名挂载就是只有容器目录,没有宿主机的目录,所以生成出来的目录是一个长长的加密字符串,一般情况下不建议使用匿名挂载;加密字符串会导致不易查找;

docker run -d -v \容器目录 tomcat

来,测试一下,先创建容器并且挂载好目录

docker run -d --name my_tomcat_2 -v /my_folder_2 tomcat

使用 inspect 命令查看容器信息

docker inspect my_tomcat_2

在打印信息中找到 Mounts 项,其中Source的目录就是宿主机的目录;Destination的目录是挂载的容器目录

"Mounts": [
    {
        "Type": "volume",
        "Name": "df4c649772a5ae65716de8ede0607d0776f8c1e2eda1d87b3ec9eaf011b43616",
        "Source": "/var/lib/docker/volumes/df4c649772a5ae65716de8ede0607d0776f8c1e2eda1d87b3ec9eaf011b43616/_data",
        "Destination": "/my_folder_2",
        "Driver": "local",
        "Mode": "",
        "RW": true,
        "Propagation": ""
    }
]

容器与容器之间的数据共享 --volumes-from

有这么一个场景,我们需要容器A和容器B实现数据共享,就是在A容器上修改的内容我希望能在B容器上看到,那么这个功能应该要怎么做到呢?那么这时候就可以使用数据卷容器功能,数据卷容器还可以实现多个容器之间的数据同步功能,不只是2个容器共享;

1、先创建第一个容器centos_1,并将/data/centos目录挂载到宿主机上,宿主机和容器的目录都是/data/centos

docker run -it --name centos_1 -v /data/centos:/data/centos centos /bin/bash

2、创建第二个容器并且将其绑定到第一个容器;--volumes-from centos_1 选项就是将当前容器的挂载目录绑定到 centos_1 容器上,从而实现了个容器的数据同步;

docker run -it --name centos_2 --volumes-from centos_1 centos /bin/bash

3、现在我们在创建第三个容器,将其绑定到第二个容器centos_2上

docker run -it --name centos_3 --volumes-from centos_2 centos /bin/bash

接下来,我们在每个容器里面的/data/centos目录里面都创建一个文件

  • 在宿主机的/data/centos目录里面创建了main.java文件
  • 在centos_1容器的/data/centos目录里面创建了centos_1.java文件
  • 在centos_2容器的/data/centos目录里面创建了centos_2.java文件
  • 在centos_3容器的/data/centos目录里面创建了centos_3.java文件

最后在面四个环境中的/data/centos目录执行ls命令,都能看到所有容器创建的文件,这样我们就实现了各个容器之间的数据同步;

[root@259efdc362b4 centos]# ls
centos_1.java  centos_2.java  centos_3.java  main.java

到此这篇关于docker容器数据卷 - 具名挂载和匿名挂载的文章就介绍到这了,更多相关docker容器数据卷内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 详解如何优雅的给Docker配置网络代理

    详解如何优雅的给Docker配置网络代理

    有时因为网络原因,比如公司 NAT,或其它啥的,需要使用代理,这篇文章主要为大家详细介绍了如何优雅的给Docker配置网络代理,需要的小伙伴可以跟随小编一起学习一下
    2024-01-01
  • Docker不能绑定静态的外网固定ip的问题及解决办法

    Docker不能绑定静态的外网固定ip的问题及解决办法

    这篇文章主要介绍了Docker不能绑定静态的外网固定ip的问题及解决办法,需要的朋友可以参考下
    2017-01-01
  • docker启动rabbitmq以及使用方式详解

    docker启动rabbitmq以及使用方式详解

    RabbitMQ是一个由erlang开发的消息队列,下面这篇文章主要给大家介绍了关于docker启动rabbitmq以及使用的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • 解决docker搭建gitlab时容器不停重启的问题

    解决docker搭建gitlab时容器不停重启的问题

    这篇文章主要介绍了docker搭建gitlab时容器不停重启的问题,当用docker log 查看日志时,发现问题是在于配置文件没有权限创建的问题,本文给大家分享解决方案,感兴趣的朋友一起看看吧
    2022-05-05
  • Docker 隔离与限制原理介绍

    Docker 隔离与限制原理介绍

    这篇文章主要介绍了Docker 隔离与限制原理,对于 Docker 等大多数 Linux 容器来说,Cgroups 技术是用来制造约束的主要手段,而 Namespace 技术则是用来修改进程视图的主要方法,下文相关介绍,需要的朋友可以参考一下
    2022-04-04
  • Docker部署nginx并修改配置文件的实现方法

    Docker部署nginx并修改配置文件的实现方法

    这篇文章主要介绍了Docker部署nginx并修改配置文件的实现方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09
  • Docker化Spring Boot应用的实践

    Docker化Spring Boot应用的实践

    本文主要介绍了Docker化Spring Boot应用的实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-06-06
  • docker-compose:数据卷volumes挂载规则说明

    docker-compose:数据卷volumes挂载规则说明

    这篇文章主要介绍了docker-compose:数据卷volumes挂载规则说明,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • docker update 命令及用法详解

    docker update 命令及用法详解

    docker update 命令动态更新容器配置,您可以使用此命令来防止容器消耗 Docker 主机的过多资源,本文给大家介绍docker update 命令及用法,感兴趣的朋友一起看看吧
    2023-08-08
  • 详解Docker下使用Elasticsearch可视化Kibana

    详解Docker下使用Elasticsearch可视化Kibana

    本篇文章主要介绍了详解Docker下使用Elasticsearch可视化Kibana,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-04-04

最新评论