• docker数据卷



    前面我们介绍了镜像和容器,通过镜像我们可以启动多个容器,但是我们发现当我们的容器停止获取删除后,我们在容器中的应用的一些数据也丢失了,这时为了解决容器的数据持久化,我们需要通过容器数据卷来解决这个问题

    数据卷是什么

    Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来,那么当容器删除后,数据自然也就没有了。为了能保存数据在docker中我们使用卷。简单来说,容器卷就相当于Redis中持久化方式的RDB和AOF。

    解决了什么问题

    卷就是目录或文件,存在于一个或多个容器中,由docker挂载到容器,但不属于联合文件系统,因此能够绕过Union File System提供一些用于持续存储或共享数据的特性:
    卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷
    特点:

    1. 数据卷可在容器之间共享或重用数据
    2. 卷中的更改可以直接生效
    3. 数据卷中的更改不会包含在镜像的更新中
    4. 数据卷的生命周期一直持续到没有容器使用它为止

    持久化,容器间继承和共享数据

    数据卷使用

    docker run 挂载目录

    案例:tomcat资源目录挂载到宿主机

    docker run -it -v /宿主机绝对路径:/容器内目录 镜像名
    docker run -d -v /home/czy/tomcat/webapps/ROOT:/usr/local/tomcat/webapps/ROOT -p 8080:8080 tomcat
    
    • 1
    • 2

    1.启动tomcat容器后,进入宿主机目录/home/czy/tomcat/webapps/ROOT
    2.创建 index.html,并写入hello world
    3.访问 http://192.168.0.132:8080/
    在这里插入图片描述

    4.宿主机中重新编辑index.html,换行写入hello docker

    5.重新访问http://192.168.0.132:8080/
    在这里插入图片描述
    通过inspect命令可以查询容器的详情,可以看到容器和宿主机绑定的目录

    docker inspect 容器id
    
    • 1

    在这里插入图片描述

    从案例中可以看到数据共享的操作,宿主机添加或修改对应的文件,容器内也会随之改变,反正容器内修改,宿主机对应也会改变
    可以权限控制:不允许在容器中修改
    docker run -it -v /宿主机绝对路径:/容器目录:ro 镜像名
    docker run -d -v /home/czy/tomcat/webapps/ROOT:/usr/local/tomcat/webapps/ROOT:ro -p 8080:8080 tomcat
    启动容器后,容器内只有只读权限了

    dockerfile 挂载目录

    1.宿主机目录下创建一个dockerfile文件夹,并在该目录下创建一个文件dockerfile1,内容如下:

    FROM tomcat
    VOLUME ["/usr/local/tomcat/webapps/ROOT"]
    #端口
    EXPOSE 8080
    ##设置启动命令
    ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
    CMD echo "finished,--------success1"
    CMD /bin/bash
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2.根据这个DockerFile构建我们的镜像文件

    docker build -f dockerfile1 -t tomcat1 .
    
    • 1
    参数说明
    -fDockerFile文件的路径
    -t构建后的镜像名
    .当前路径

    在这里插入图片描述
    3.根据新创建的镜像文件创建一个容器

    docker run -d -p 8080:8080 tomcat1
    
    • 1

    4.查看容器内挂载数据的目录
    这容器目录和宿主机的映射目录在哪呢?这时我们可以通过 inspect命令查看

    docker inspect 容器id
    
    • 1

    在这里插入图片描述
    在这里插入图片描述
    5.宿主机修改挂载的目录,创建index.html
    Source就是宿主机对应的目录,复制后进入,创建index.html,写入hello dockerfile
    在这里插入图片描述
    6.浏览器访问 http://192.168.0.132:8080/
    在这里插入图片描述
    注意事项

    无法通过 VOLUME 挂载主机目录
    为了镜像的可移植性,VOLUME 指令不支持指定主机目录参数(像 docker run -v <主机目录>:<容器目录> 是可以指定主机目录的)
    如果要指定,还是要通过 docker run -v 来指定主机目录

    数据卷容器

    命名的容器挂载数据卷,其他容器通过挂载这个容器实现数据共享,挂载数据的容器,称之为数据卷容器。
    1.启动一个父容器

    docker run -d --name tomcat1 -v /home/czy/tomcat/webapps/ROOT:/usr/local/tomcat/webapps/ROOT -p 8081:8080 tomcat
    
    • 1

    2.创建两个子容器指定父容器为tomcat1

    docker run -d --name tomcat2 --volumes-from tomcat1 -p 8082:8080 tomcat
    docker run -d --name tomcat3 --volumes-from tomcat1 -p 8083:8080 tomcat
    
    • 1
    • 2

    3.访问三个tomcat,如下
    在这里插入图片描述
    4.修改宿主机挂载目录下的index.html,写入hello tomcat123
    在这里插入图片描述

    注意:
    创建了两个子容器后,首先都可以看到tomcat1中的共享资源。在tomcat1中修改了共享资源文件后,在两个容器中也是可见的
    删除tomcat1后,tomcat2和tomcat3之间数据还是共享的
    容器之间配置信息的传递,数据卷的生命周期一直持续到没有容器使用它为止。

  • 相关阅读:
    Mac m1 上编译阿里 OSS c++ 供 UE 使用
    服务器——SSL/TLS协议信息泄露漏洞(CVE-2016-2183)修复办法
    Linux与Windows下编译工具
    Python中的用法与常见问题解析
    Asp.Net 6.0集成 Log4Net
    基于STC12C5A60S2系列1T 8051单片机的数模芯片DAC0832实现数模转换应用
    【Android】如何使用模拟器调试安卓项目
    策略模式在不同情况下的使用方法
    一、初识 Elasticsearch:概念,安装,设置分词器
    程序员公司合作保密协议范本
  • 原文地址:https://blog.csdn.net/weixin_45240169/article/details/126676770