zoukankan      html  css  js  c++  java
  • docker数据卷volume功能特性

    制作镜像的俩种方法
    Commit制作镜像基于一个现有的容器
    dockerfile基于镜像制作镜像

    容器底层技术:
    1.cgroup
    实现了资源的使用限额,CPU,内存,以及磁盘
     [root@zxw99 ~]# docker run -d -m 64M -c 512 httpd:v1
    [root@zxw99 ~]# cat /sys/fs/cgroup/cpu/docker/981a911ba02f5f4b8fb06052271de813521a94012f05922f5ee09ee2636d8626/cpu.shares
    512


    2,namespace
    实现了资源隔离
    PID,UTS,USER,NETWORK,MOUNT,IPC
     
     
     
    数据卷volume功能特性
     
    数据卷 是一个可供一个或多个容器使用的特殊目录,实现让容器中的一个目录和宿主机中的一个文件或者目录进行绑定。数据卷 是被设计用来持久化数据的
    对于数据卷你可以理解为NFS中的哪个分享出来的挂载点,指宿主机共享的目录。
    主要有如下的功能和特性
    • 容器中数据的持久存储
    • 容器间的资源共享
    • 容器的迁移(分布式)
    • 对数据卷的修改会立马生效
    • 对数据卷的更新,不会影响镜像
    • 数据卷默认会一直存在,即使容器被删除 (注意docker自主管理的会被删除,容器删除前一定要对数据卷进行备份)
     
     
     
     
    实现数据卷
    三种方式
    1.绑定本机的特定目录
    2.docker 自管理,docker会随机绑定主机的一个目录
    3.基于一个现有的容器
     
    1.绑定本机的特定目录 bind mount volume
    [root@ken1 ~]# docker run -v /ken1:/var/www/html -d -P httpd
    -v   指定使用数据卷
    /ken1:/var/www/html 
     #/ken1是宿主机的一个目录,
    /var/www/html是容器内的一个目录,如果说容器内的这个目录不存在的话,shi是会自动创建!
     
    优势:
    1.易于管理
    2.可以实现数据的持久化
    3.如果宿主机宕了,容器还是无法访问,可以使用NFS进行共享,多个宿主机进行负载均衡。
     
    2.docker自管理的 docker manaagerment volume
    这个和bind mount volume区别是用户无法再去管理本地的一个目录。docker会自己绑定宿主机下的一个目录
    [root@ken1 ken1]# docker run -d -v /usr/local/apache2/htdocs -d -P httpd
     
    可以通过下面的命令进行查看
    [root@ken1 ken1]# docker container inspect 1365d65ead56
     
    注意:
    1.在删除容器的时候,是默认不会删除docker managerment volume中的数据卷的,如果想要在删除容器的时候顺带删掉相关的数据卷,需要加上选项-v
    2.如果在删除容器的时候没有使用-v就会遗留下来数据卷,这样的数据卷叫做孤儿卷,即每人管理的卷
     
    如果处理孤儿卷?
    解决方案:
    第一步:查看卷
    root@zxw99 _data]# ls /var/lib/docker/volumes/
    034d0d7b346db801f7f0c92c3bb879acebc28d0e17ba6e6eb91d08802a03d152
    0fc92d717a2bc87384b52c8e3f6ebb4e842be857106410364a4c7be793653509
    3aab6aa51cd795b932769a2479104b02585d79da87b7f554d96c45b809e8a5f1
    950d114e4f29feaeeb5560f2666e7ce4e03794e812cfdd11ac680dbb63f9286f
    a4a83390a954fe8c79bba7a0de157690c47900a354229e3f513bebc99cd7b461
    f4f82f58cb91d555d17f230a4bdc52c61ca0b6910538c3ddf1870ccc62bd6346

    [root@ken1 ken1]# docker volume ls
    DRIVER VOLUME NAME
    local 986d19ec31801a630dc5209724560b074b025eacdb7cdf4fbbe3d5e6cc7f0771
    local d846455965a7bc208478bf7f6cf2f178263fe455c573504572d4a87f299800a1
    local f0d96791e2a60a6edf9b6550625bf568520988ffbaffcfa6353e924b4530dc1c
    local fa7bcf028a50a168d8b531eaff2dc74e6207421a5b3347430909d75eb4ad76a4
     
    第二步:删除相应的孤儿卷
    [root@ken1 ken1]# for i in `docker volume ls | grep -v "DRIVER" | awk '{print $2}'`; do docker volume rm $i ;done
     
    在删除容器的时候加上-v
    [root@ken1 ken1]# docker container rm -f -v a5e91fa77abe1a5
     
    注意:
    如果使用-v, 相应的数据卷也会被删掉,如果是在生产环境当中,应当做好数据备份工作!
     
     
    3.基于一个容器
    [root@ken1 ken1]# docker run -d --volumes-from 1e9a4c3b0bc30295d httpd
    –volumes-from是基于一个现有的容器进行数据共享,这个参数后面应当跟上相应的容器ID或者容器名
     
    数据卷的生命周期管理
     
    1.备份
    2.迁移
    3.恢复
    4.销毁
     
    1.备份
    备份只需要备份相应的数据卷即可,例如:
    [root@ken1 ken1]# docker run -d -v /ken:/var/www/html httpd
    再上面的额例子中我们只需要做好/ken这个目录下的文件备份即可!
     
    2.恢复
    只需要重启一个容器,并且绑定ken下面备份的数据即可
     
    3.迁移
    把ken下面备份好的数据,发送到相应的节点即可,并使用bind mount volume方式运行容器即可
     
    4.销毁
    情况一:bind mount volumes
    这种情况是绑定宿主机的一个目录,如果想要删除数据,只需要删掉宿主机的目录即可
     
    情况二:docker managerment volume
    需要在删除容器的时候加上选择-v
     
    情况三:基于一个容器
     
    分为两种情况:
    1,如果是docker自管理,删除容器时使用-v
    2.宿主机特定目录,需要删除宿主机上的特定目录
     
     
     
    验证:数据卷被其他容器使用是否能够删掉
    第一步:创建一个新的容器
    [root@ken1 ken1]# docker run -d -v /data httpd
     
    第二步:查看数据卷
    [root@ken1 ken1]# docker inspect 3b1ce4b5f96150e866f322a600f93cd
    ...
    /var/lib/docker/volumes/b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e/_data
     
    第三步:基于现有容器在创建一个容器并绑定数据卷
    [root@ken1 ken1]# docker run -d --volumes-from 3b1ce4b5f96150e866 httpd
     
    第四步;查看第二个容器的数据卷
    发现数据卷和第一个容器使用的数据卷是一致,说明两个容器现在共用一个数据卷
    "Name": "b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e",
     
     
    第五步:查看数据卷
    [root@ken1 ken1]# docker volume ls
    DRIVER VOLUME NAME
    local b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e
     
    第六步:删除第一个容器并加上-v选择
    [root@ken1 ken1]# docker rm -f -v 3b1ce4b5f961
    3b1ce4b5f961
    [root@ken1 ken1]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    70df334b3f25 httpd "httpd-foreground" 2 minutes ago Up 2 minutes 80/tcp wonderful_shamir
    39d5f620493b httpd "httpd-foreground" 9 minutes ago Up 9 minutes 80/tcp goofy_herschel
    c42a2a22c533 httpd "httpd-foreground" 12 minutes ago Up 12 minutes 80/tcp admiring_wilbur
    1e9a4c3b0bc3 httpd "httpd-foreground" 24 minutes ago Up 23 minutes 80/tcp blissful_haslett
    a6304e984f93 httpd "httpd-foreground" About an hour ago Up About an hour 0.0.0.0:32778->80/tcp brave_varahamihira
    [root@ken1 ken1]# docker volumes ls
    docker: 'volumes' is not a docker command.
    See 'docker --help'
    [root@ken1 ken1]# docker volume ls
    DRIVER VOLUME NAME
    local b0cfa7ae0abe933392c3e649f3d0bec0185c8357c9673ebc0322920cdab8235e
     
    验证总结:
    两个容器如果共享了一个数据卷的话,删除一个容器的时候即使加上-v选线的话,即使删除源容器的话数据卷并不会被删除。

     

  • 相关阅读:
    PLSQL Developer使用技巧整理
    PLSQL DEVELOPER 使用的一些技巧【转】 .
    MYEclipse Available Memory is low 警告 解决方法
    myeclipse安装svn插件的多种方式
    MySql的存储过程和触发器
    springmvc学习及源码地址
    spring源码下载链接
    struts2源码下载链接
    个人总结的常用java,anroid网站
    Java生成扫描可以生成手机号名片的二维码
  • 原文地址:https://www.cnblogs.com/itzhao/p/11354213.html
Copyright © 2011-2022 走看看