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

目录
  • 什么是容器数据卷
  • 为什么需要容器数据卷
  • 使用
  • 如何查看是否使用了数据卷
  • 具名挂载和匿名挂载
    • 指定路径挂载
    • 具名挂载
    • 匿名挂载
  • 容器与容器之间的数据共享 --volumes-from

什么是容器数据卷

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

为什么需要容器数据卷

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容器数据卷内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 浅谈Docker 容器数据卷挂载小结

    为了更直观了解数据卷挂载的操作,做个实验一一验证数据卷挂载的各种情况. 情况一.本地不存在文件挂载到容器存在文件 首先是当本地不存在该文件,而容器内存在该文件的情况,尝试把不存在的文件挂载到存在该文件的容器中.以一个 Alpine 镜像为例,这里把一个修改后的 Alpine 镜像打了新标签,叫做 volume_test: # 本地目录不存在 test 文件. $ docker run --name=test -v ~/test.txt:/etc/hosts -d volume_test 0cba

  • docker挂载本地目录和数据卷容器操作

    1.docker挂载本地目录 docker可以支持把一个宿主机上的目录挂载到镜像里. 交互模式运行 docker run -it -v /home/dock/Downloads:/usr/Downloads ubuntu64 /bin/bash 后台运行 docker run -d -v /home/dock/Downloads:/usr/Downloads --name ubuntu1 ubuntu64 通过-v参数,冒号前为宿主机目录,必须为绝对路径,冒号后为镜像内挂载的路径. 现在镜像内就

  • 详解Docker数据管理(数据卷&数据卷容器)

    生产环境中使用Docker的过程中,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 1.数据卷(Data Volumes):容器内数据直接映射到本地主机环境:如何在容器内创建数据卷,并且把本地的目录或文件挂载到容器内的数据卷中. 2.数据卷容器(Data Volume Containers):使用特定容器维护数据卷.如何使用数据卷容器在容器和主机.容器和容器之间共享数据,并实现数据的备份和恢复. 数据卷 数据卷是一个可

  • Docker 数据卷,数据卷容器详细介绍

    Docker 数据卷,数据卷容器详细介绍 引子 有些时候,我们的服务运行时必不可少的会产生一些日志,或是我们需要把容器内的数据进行备份,甚至多个容器之间进行数据共享,这必然涉及容器的数据管理操作. 容器中管理数据主要有两种方式: 数据卷 数据卷容器 数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性: - 数据卷可以在容器之间共享和重用 - 对数据卷的修改会立马生效 - 对数据卷的更新,不会影响镜像 - 卷会一直存在,直到没有容器使用 #(类似linux下的挂载(moun

  • Docker 数据卷及数据容器详细介绍及示例

    Docker 数据卷及数据容器 这两天开始学习docker,发现docker确实很强大,让网站部署和维护的效率大大提高.遂准备将手头维护的几个小站,全部docker化.整理的过程中感觉到,docker可以以功能或者进程为单位进行部署和维护,不用再花时间在繁琐的配置上面,但是docker和宿主之间的数据共享以及docker间的数据共享仍然是让人头疼和操心的地方. 几个基本概念: docker: 一种容器管理技术,这里也指既有的开发工具链. container: 容器 image: 镜像 volum

  • Docker中容器数据卷(Data Volume)和数据管理详解

    卷(Volume) 众所周知卷(Volume)是容器中的一个数据挂载点,卷可以绕过联合文件系统,从而为Docker 提供持久数据,所提供的数据还可以在宿主机-容器或多个容器之间共享.通过卷,我们可以可以使修改数据直接生效,而不必重新构建镜像. 一.数据卷 数据卷是一个可以绕过联合文件系统的,专门指定的可在一或多个容器间共享目录.卷为提供为持久化或共享数据提供了一些有用的特性. 数据卷设计的初哀是提供持久化数据,而与容器的生命周期无关.因此,在删除容器时,Docker不会自动删除卷,直到没有容器再

  • docker run -v 挂载数据卷异常,容器状态一直是restarting的解决

    出现的问题: docker run 加上 -v 参数之后,容器就一直是 restarting 状态,去掉 -v 参数就可以正常运行 查找问题: 使用 docker logs 'containerId' 这个containerId,就是docker run之后返回的containerId 可以看到,是权限拒绝的问题 解决问题: docker run时加上参数 :加上--privileged=true 例如: docker run -dit -e MYSQL_ROOT_PASSWORD=123456

  • Docker容器数据卷原理及使用方法解析

    什么是容器数据卷 如果数据都在容器中,一旦容器删除,数据就会丢失! eg : mysql容器删了,就是我们常说的删库跑路. 需求:数据可以持久化,即时删掉容器,我们的数据还在 容器直接可以有一个数据共享的技术!Docker容器产生的数据,同步到本地! 这就是卷技术!目录的挂载,将我们容器的目录挂载到linux上面! 总结:卷技术就是为了实现数据的持久化和同步操作,容器间也是可以数据共享的 使用数据卷 方式一:直接使用命令来挂载 -v # 命令 docker run -it -v 主机的目录:容器

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

    目录 什么是容器数据卷 为什么需要容器数据卷 使用 如何查看是否使用了数据卷 具名挂载和匿名挂载 指定路径挂载 具名挂载 匿名挂载 容器与容器之间的数据共享 --volumes-from 什么是容器数据卷 容器数据卷就是目录的挂载,将我们的容器的目录挂载到宿主机上,从而实现打通宿主机和容器之间的文件共享功能: 为什么需要容器数据卷 docker理念就是将应用和环境打包成一个镜像:但是数据怎么办呢?且不说数据库,一个项目在运行过程种肯定会产生大量的日志,这些日志对开发人员来说是非常重要的, 因为有

  • 详解Docker容器数据卷

    是什么 先来看看Docker的理念: 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求希望是持久化的容器之间希望有可能共享数据 Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了. 为了能保存数据在docker中我们使用卷. 一句话:有点类似我们Redis里面的RDB和AOF 能干嘛 卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系

  • Docker容器数据卷介绍及操作示例

    目录 容器数据卷介绍 什么是数据卷 数据卷能做什么? 特点 Docker 容器数据卷操作 直接命令添加数据卷 dockerfile 添加数据卷 Docker 数据卷容器 数据卷容器简介 案例演示 容器数据卷介绍 什么是数据卷 将运用与运行的环境打包形成容器运行,运行可以伴随着容器,但是我们对数据的要求是持久化的. 容器之间希望有可能共享数据. Docker 容器产生的数据,如果不通过 docker commit 生成新的镜像,使得数据做为镜像的一部分保存下载,那么当容器删除后,数据自然也就没有了

  • Docker容器数据卷技术介绍

    目录 Docker容器数据卷技术介绍 一.卷技术介绍 二.使用数据卷 Docker容器数据卷技术介绍 一.卷技术介绍 现在我们知道docker的理念就是把应用和环境打包成镜像,方便我们去运行容器. 但是现在有一个问题,比如我容器里的mysql存了好多的数据,那万一容器被删除,数据是不是就没了?这显然不合适. 于是,一个新的需求产生了:将数据存储在容器之外的地方,比如本地.对应的解决方案就是卷技术了,通过它,将容器中产生的数据同步到本地,让容器之间可以共享数据. 卷技术,说白了就是目录的挂载,将容

  • docker<容器数据卷-v>对容器内数据持久化详解(备份)

    目录 前言 正文 数据卷读写规则 数据卷的继承和共享 总结 前言 在docker创建容器,挂载目录的时候,可能会出现目录无法访问无法打开的问题(cannot open directory .: Permission denied) 只需要加一个 --privileged=true 参数即可,加上这个参数代表是以root用户权限进入容器的,不加就是以普通用户权限进入容器的 例如,test镜像创建一个容器t1 docker run -d -p 5555:5555 -v /etc/config:/tm

  • Docker容器数据卷的使用教程

    目录 前言 1.数据卷概念 2.数据卷作用 3.配置数据卷 4.多容器进行数据交换 5.数据卷容器 6.数据卷小结 总结 前言 本文是 Docker 容器的数据卷使用的简单教程,介绍了什么是数据卷.数据卷概念.以及如何使用数据卷等. 1.数据卷概念 数据卷简单来讲就是一个目录,它是由Docker daemon 挂载到容器中的,因此数据卷并不属于联合文件系统,也就是说数据卷里面的内容不会因为容器的删除而丢失.Docker启动后,容器内的文件和宿主机是隔离的,如果不使用docker commit 操

  • docker中容器数据卷volume介绍

    目录 docker 容器数据卷volume 使用数据卷 方式一:直接使用命令挂载 -v 方式二:Dockerfile 数据卷容器 总结 docker 容器数据卷volume 如果数据都在容器中,那么我们删除容器的时候数据就会丢失,所以我们希望数据可以持久化. 例如MySQL容器,我们希望数据可以存储在本地,当MySQL容器删除的时候,数据不会丢失. 容器之间可以有一个数据共享的技术,Docker容器中产生的数据,同步到本地,这就是卷技术.也就是数据挂载技术,将我们容器内的目录,挂载到Linux上

  • Docker中容器数据卷详解

    目录 什么是容器数据卷 数据的覆盖问题 使用数据卷 方式一:直接使用命令挂载 -v 测试挂载卷 方式二:Dockerfile文件 数据卷命令 查看数据卷 方式一:docker inspect 容器ID 方式二:docker volume inspect juming-nginx 挂载三种方式 扩展 什么是容器数据卷 从docker的理念说起,docker将应用和环境打包成一个镜像,运行镜像(生成容器)就可以访问服务了. 如果数据都存在容器中,那么删除容器,数据就会丢失!需求:数据可以持久化 My

随机推荐