• Docker-使用数据卷在宿主机和容器间的数据共享


    场景一:现在用Docker创建了N个容器,但是这些容器之间需要数据共享,这个时候我们应该怎么办?[参考第四步]

     

    场景二:docker创建了一个容器并进入容器,添加了一些定制功能,此时除了用docker commit去生成一个新的镜像,使数据作为镜像的一部分进行保存以外,我们还能通过什么方式去保持数据?[参考第三步]

     

    一、数据卷

    数据卷听起来很陌生,但是我们换种方式大家可能就觉得简单理解了。数据卷可以理解为容器中的一个目录。

    容器数据卷:命名的容器挂载数据卷,其他容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器。简单点来说,就是活动硬盘对接活动硬盘。

    所以为了保存数据,我们在docker中使用卷,即数据卷。

     

    二、容器卷的作用

    数据卷的作用:

      a.容器的持久化

      b.容器间继承+共享数据

    目前我们也可以通过命令去做这个动作,从容器内拷贝文件到主机,命令如下:

    docker cp 容器id:容器内路径 目录主机路径

    //比如目录主机路径为根目录/,容器内路径为/volumecontainer

    //命令可以写为:docker cp 容器id:/volumecontainner /

     

    三、创建数据卷[数据卷容器的添加方式]

    数据卷容器有2中添加方式,一种是直接命令添加,一种是dockerfile文件添加。

    1、直接命令添加:

    1. docker run -it -v /宿主机绝对路径目录:/容器内目录 镜像名id
    2. 查看数据卷是否挂载成功
    3. 容器和宿主机之间数据共享
    4. docker run -it -v /宿主机绝对路径目录:/容器内目录:ro 镜像名

        //直接运行命令 docker run -it -v /:/volumeContainer [imageid]

        //在本机的根目录下,volumeContainer 指的是在容器内的目录

    Ps:ro是只读,在容器内不能对容器卷进行编辑

     

    在命令添加时可能会涉及到的一些命令:

    docker ps:显示当前运行中的容器

    docker ps -l:显示上一次运行的容器

    docker start 容器id:启用容器

    docker inspect 容器id:查看数据卷是否挂载成功

    cat 文件名称:显示文件中的内容

    2、Dockerfile添加

      dockerfile文件的使用,具体可以参考另外一篇博文:https://www.cnblogs.com/wendyw/p/9728381.html

     dockerfile文件添加数据卷容器大致步骤如下:

      2.1 根目录下新建mydocker文件夹并进入

      2.2 可在dockerfile中使用Volume指令来给镜像添加一个或多个数据卷

        //比如:VOLUME[“/dataVolumeContainer1”,”/dataVolumeContainer2”,xxx]

        //在dockerfie文件中添加如上命令就可以一次生成多个数据卷

      2.3 File构建

      2.4 Build后生成镜像-获得一个新镜像 xxx/centos

      2.5 run容器

    在完成Dockefile文件的运行后,查看是否添加成功,可以执行如下命令:

      Docker inspect 容器id:查看本机默认路径下的容器卷

     

    四、实战-不同容器之间共享容器卷

    比如用centos镜像生成容器test1、test2、test3,已经是生成容器卷,/VolumeContainer是容器内数据卷

    1、 打开虚拟机centos7终端,执行docker images出现错误:【Failed to restart dock.service: Unit not found.】,执行如下代码:

     

    systemctl unmask docker.service
    systemctl unmask docker.socket
    systemctl start docker.service
    docker 服务开启

     

    2、登录阿里云,把已经创建好数据卷的镜像pull下来

    Ps:如果使用你本地的镜像,这一步就忽略

    docker login --username=xxx registry.cn-hangzhou.aliyuncs.com

    //xxx是阿里云账号登录名称[登录你自己的账号,去拉取你的镜像]

    docker pull registry.cn-hangzhou.aliyuncs.com/abc/mycentos:1.4.1

    //从阿里云上去下载mycentos

    //abc是命名空间[需要自己去创建对应的命名空间,且已经创建好镜像],拉下来的代码中已经有数据卷

     

    3、找到对应镜像的imageid,先启动一个父容器test001

    docker images //找到mycentos对应的imageid

    docker run -it [imageid] //进入容器,并且容器名字命令为test001

     另外打开一个终端,查看正在运行中的代码:

    docker ps  //查看正在运行中的代码

     

    4、容器间传递共享,容器test002、test003继承与test001

    //--name 给容器命名,B --volume-from A是指容器B继承与容器A

     docker run -it --name test002 --volumes-from test001 [imageid]

    //test002容器继承与test001

    docker run -it --name test003 --volumes-from test001 [imageid]

    docker run -it --name test004 --volumes-from test003 [imageid]

      

    5、分别删除、增加、修改test002、test003中的文件内容,都能进行同步更新。

     

    总结:容器之间配置信息的传递,任何一个容器的删除,不影响其他容器的使用,数据卷的生命周期一直持续到没有容器使用它为止。

     

     

  • 相关阅读:
    MySQL之汇总数据(AVG,COUNT,MAX,MIN,SUM)
    查询两门及两门以上不及格同学的平均分
    百度乐播音乐真实地址查找api接口
    腾讯云服务器无法ssh登陆问题
    ubuntu搭建php运行环境
    阿里云腾讯云服务器ubuntu多域名配置
    PHP 快速排序算法详解
    PHP7.x新特性
    PHP的钩子实现解析
    PHP 二维数组根据某个字段排序 复制代码 array_multisort
  • 原文地址:https://www.cnblogs.com/wendyw/p/9736783.html
Copyright © 2020-2023  润新知