zoukankan      html  css  js  c++  java
  • Docker(5)---数据卷

    在这里插入图片描述

    上一篇:Docker(4)—镜像

    1. 如何保证数据持久化?

      到这里我们应该知道,docker技术就是使用下载好的镜像文件生成运行实例—容器,也就是说镜像文件相当于是一个模板,比如mysql的镜像文件,无论在docker上面运行多少次mysql,使用的始终是下载好的同一个mysql镜像文件。那我运行期间产生的数据怎么保存?第二次运行的时候想使用第一次运行期间产生的数据怎么办?

      在Docker中,数据卷提供数据持久化功能。数据卷呈现为一种目录或者文件的形式存在于一个或者多个容器中,由docker挂载到容器,但是不属于联合文件系统的一部分,所以当docker关闭或者删除容器的时候,不会影响到数据卷中的数据。数据卷可以用于存储数据,也可以用来在容器间进行数据共享。

    2. Dockerfile保留字指令

    指令 描述
    FROM 基础镜像,当前新镜像是基于哪个镜像的
    MAINTAINER 镜像维护者的姓名和邮箱地址
    RUN 容器构建时需要运行的命令
    EXPOSE 当前容器对外暴露出的端口
    WORKDIR 指定在创建容器后,终端默认登录进来工作的目录,一个落脚点
    ENV 用来在构建镜像过程中设置环境变量
    ADD 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
    COPY 类似ADD,拷贝文件和目录到镜像中。将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置 {COPY src dest}
    VOLUME 容器数据卷,用于数据保存和持久化工作
    CMD 指定一个容器启动时要运行的命令。Dockerfile中可以有多个CMD指令,但只有最后一个生效,CMD会被docker run之后的参数替换。
    ENTRYPOINT 指定一个容器启动时要运行的命令。ENTRYPOINT的目的和CMD一样,都是在指定容器启动程序及参数。
    ONBUILD 当构建一个被继承的Dockerfile时运行命令,父镜像在被子继承后父镜像的onbuild被触发。

    3. 数据卷特点?

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

    3. 实现宿主机与容器之间的数据共享?

      在这里需要明确两个概念:
    1. 宿主机:
      宿主机指的就是我们通过VMWare-----》CentOs的方式进入的Linux系统就是我们的宿主机。
    2. 容器
      就是宿主机上拉取的镜像文件生成的运行实例~

    需求:
      现在我有一个centos镜像,希望centos镜像运行起来的时候其containerdata目录与宿主机的mydata两个目录之间能够进行数据共享;

    命令:
      docker run -it -v 宿主机中的共享目录(mydata)路径:容器中的共享目录(containerdata)的路径 容器名

    示例:
      比如mydata在宿主机的根目录下(/mydata),containerdata在容器的根目录下(/containerdata

    下图是宿主机的根目录,现在没有mydata文件夹
    在这里插入图片描述
    下图是容器centos的根目录,现在也没有containerdata文件夹
    在这里插入图片描述
    1.首先进行目录绑定:

    docker run -it -v /mydata:/containerdata centos
    

    2.查看宿主机和容器的绑定关系

    docker inspect 容器ID
    

    在这里插入图片描述
    3.查看宿主机和容器中是否分别有mydatacontainerdata文件夹

    宿主机:
    在这里插入图片描述
    容器:
    在这里插入图片描述
    现在在mydata目录中创建一个文档:

    [root@bogon mydata]# touch file.txt
    [root@bogon mydata]# ll
    总用量 0
    -rw-r--r--. 1 root root 0 3月  22 14:57 file.txt
    [root@bogon mydata]# 
    

    既然mydata目录和centos的容器中的containerdata目录进行了数据共享,那么现在containerdata目录下应该也有一个file.txt文档。查看containerdata目录:

    [root@7453e78d6615 /]# cd containerdata/
    [root@7453e78d6615 containerdata]# ls -l
    total 0
    -rw-r--r--. 1 root root 0 Mar 22 06:57 file.txt
    [root@7453e78d6615 containerdata]# 
    
    

    发现containerdata目录下确实有file.txt文档,现在通过容器编辑该文档:
    在这里插入图片描述
    在该文档中输入一段话,按照数据共享的原理,在宿主机的mydata目录下的file.txt文档中应该也会有这样一句话:
    在这里插入图片描述
    此时再次查看宿主机的containerdata下的file.txt
    在这里插入图片描述
    到这里就实现了宿主机与容器之间的数据共享~

    注意:

      通过上面的绑定操作之后,即使我们的容器关闭运行了,但是如果我们在宿主机的mydata目录下进行的操作依然会被同步到与其绑定的centos镜像中的containerdata目录下:

    示例:

      关闭centos的运行并退出:`

    在这里插入图片描述
    查看此时运行的镜像文件:
    在这里插入图片描述
    确认上面的centos镜像文件已经退出运行了~
    此时在宿主机的mydata目录下创建一个file001.txt文件,并添加内容:this content is edited in the host
    在这里插入图片描述
    此时再运行centos镜像文件,到containerdata目录下查看:
    查看上次关闭的centos镜像ID:docker ps -l
    在这里插入图片描述
    重新启动上次关闭的centos镜像文件:docker start 镜像ID

    在这里插入图片描述

    进入处于运行状态的centos容器:docker attach 镜像ID
    在这里插入图片描述
    查看containerdata目录下是否有新增的file001.txt文档:

    [root@e2fde7599c8b /]# cd containerdata/
    [root@e2fde7599c8b containerdata]# ls -l
    total 8
    -rw-r--r--. 1 root root 38 Mar 22 07:22 file.txt
    -rw-r--r--. 1 root root 35 Mar 22 07:13 file001.txt
    [root@e2fde7599c8b containerdata]# cat file001.txt 
    
    this content is edited in the host
    
    [root@e2fde7599c8b containerdata]# 
    
    

    发现我们在宿主机上新建的file001.txt文档以及里面的数据同步到了centos容器相应的绑定位置;

    4. 宿主机与容器数据共享的时候添加权限

    宿主机与容器进行数据共享的目录绑定命令:

    docker run -it -v /宿主机共享文件的绝对路径:/容器共享文件的绝对路径 :ro 镜像名
    

    注:ro就是read only(只读权限)

    通过以上命令进行共享数据目录绑定之后,我们可以从宿主机上写数据(增删改),而容器上只能读数据

  • 相关阅读:
    JQ-动画合集(ing...)
    CSS-各种cs样式之浏览器兼容处理方式汇总大全(更新中...)
    CSS-用伪元素制作小箭头(轮播图的左右切换btn)
    CSS-垂直|水平居中问题的解决方法总结
    JS-自制提速小工具:开发页面时需要按比例计算宽高值的快速计算器
    canvas-渐变文字
    HTML-一个网页的头部的大概框架(完善ing)
    JS-面向对象
    CSS-border属性制作小三角
    JS事件-事件处理程序-笔记总结ing...
  • 原文地址:https://www.cnblogs.com/wgty/p/12810399.html
Copyright © 2011-2022 走看看