zoukankan      html  css  js  c++  java
  • Docker中的数据卷及数据卷容器

    文章目录

    • 前言
    • 一、数据卷
      • 1.什么是数据卷
      • 2.创建数据卷(volume create)
      • 3.挂载数据卷
    • 二、数据卷容器
      • 1.什么是数据卷容器
      • 2.数据卷容器的创建及挂载
    • 三、数据卷容器对数据的操作
      • 1.备份数据
      • 2.恢复数据
    • 总结

    前言

    在生产环境中使用Docker的时候,往往要在多个容器中进行数据共享,这就涉及到了容器的管理操作。而在Docker中,有两种数据管理的方法,就是下面将要介绍的数据卷及数据卷容器。


    一、数据卷

    1.什么是数据卷

    数据卷是一个可供容器用的一个目录,实在本地宿主机上创建的,可以挂载到所有的容器中。

    2.创建数据卷(volume create)

    命令格式:

    docker volume create [OPTIONS] [VOLUME]
    

    Options:
    -d, --driver string 指定卷驱动程序名称
    –label list 设置卷的元数据
    -o, --opt map 设置驱动程序特定选项

    这里来试一下:

    [root@localhost ~]# docker volume create vltest
    vltest
    [root@localhost ~]# ls /var/lib/docker/volumes/
    metadata.db  vltest/      
    [root@localhost ~]# ls /var/lib/docker/volumes/vltest/
    _data
    [root@localhost ~]# docker volume ls
    DRIVER              VOLUME NAME
    local               vltest
    

    创建出来的数据卷,位于宿主机/var/lib/docker/volumes/
    除此之外,volume下还支持其余子命令来管理卷,下载来一起说一下,格式:

    docker volume COMMAND
    

    Commands:
    create 创建一个卷
    inspect 显示一个或多个卷的详细信息
    ls 列出卷
    prune 删除所有未使用的本地卷
    rm 删除一个或多个卷

    3.挂载数据卷

    当我们需要在容器内挂载数据卷时,一般都是在创建容器run时添加-v选项
    例如将本地/app目录挂载到容器内的/下,一般来说,用绝对路径即可。

    docker run -it -d -v 本地目录:容器内目录 镜像iD
    docker run -it -d -v /app:/ 镜像iD
    docker run -it -d -v /app:/:ro 镜像iD   **默认权限是读写(rw),这样的话 是只读(ro)**
    

    我是不太喜欢用数据卷的,以为如果是只挂载一个文件时,若用vi修改的时候,可能会造成文件inode的改变,所以推荐是直接挂载文件所在的目录到容器内,这也是我为什么用数据卷容器多的原因。

    二、数据卷容器

    1.什么是数据卷容器

    数据卷容器其实也是容器,只不过他的作用就只是用在来提供数据卷供其他容器进行挂载。一般来说,这种情况更适合于要在多个容器之间共享一些数据来使用。

    2.数据卷容器的创建及挂载

    上面说了,所谓的是数据卷容器,其实就是个容器,单纯的做一个数据卷容器来供别人来挂载的。下面将示例一下数据卷容器的挂载及创建,可以看到示例依靠run命令,所以平时要多实践一下docker run --help看看,多练多了解下子命令,

    [root@localhost ~]# docker images            #查看本地镜像,
    REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
    newnginx            newtar              4bb46517cac3        4 weeks ago         133MB
    nginx               1.19.2              4bb46517cac3        4 weeks ago         133MB
    centos              centos7.3.1611      c5d48e81b986        18 months ago       192MB
    [root@localhost ~]# docker run -it -d -v /data --name data c5
    24afaab595ad86f0c0d7dc82b6e9f7d5044c3d510793c89626e318679eaaf41f
    [root@localhost ~]# docker ps   
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    24afaab595ad        c5                  "/bin/bash"              12 seconds ago      Up 11 seconds                           data
    [root@localhost ~]# docker attach 24        #进入容器
    [root@24afaab595ad /]# ls               #可以看到/data目录已经被创建了
    anaconda-post.log  bin  data  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@24afaab595ad /]# cd data/
    [root@24afaab595ad data]# touch test.txt
    [root@24afaab595ad data]# mkdir testdir
    [root@24afaab595ad data]# ls
    test.txt  testdir
    

    然后可以创建两个新的容器,通过--volumes-from来挂载数据卷

    [root@localhost ~]# docker run -it -d --volumes-from 24 --name db1 c5
    24f24c01b5b3040e83831ab9fb00398f570023b566f8f8fffeb4396104f19b87
    [root@localhost ~]# docker run -it -d --volumes-from 24af --name db2 c5
    22a8b32cf265067a604f1067b917bbee47ec9dd5731180ce5e37377fc53b443c
    [root@localhost ~]# docker ps
    CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
    22a8b32cf265        c5                  "/bin/bash"              40 seconds ago      Up 39 seconds                           db2
    24f24c01b5b3        c5                  "/bin/bash"              2 minutes ago       Up 2 minutes                            db1
    24afaab595ad        c5                  "/bin/bash"              10 minutes ago      Up 10 minutes                           data
    

    进入db1看看挂载的数据卷,可看到跟数据卷容器内文件是相同的

    [root@localhost ~]# docker attach db1
    [root@24f24c01b5b3 /]# ls
    anaconda-post.log  bin  data  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
    [root@24f24c01b5b3 /]# ls data/
    test.txt  testdir
    

    如果删除了挂载的容器(包括 data db 1和 db2 ),数据卷并不会被自动删除 如果删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用 docker rm -v命令来指定同时删除关联的容器。这里有一点要注意,使用 --volumes-from所挂载数据卷的容器并不需要保持在运行状态下。
    同时,使用数据卷容器可以自由的更新和移动数据卷,这也是我为什么喜欢用数据卷 容器的第二原因。

    三、数据卷容器对数据的操作

    1.备份数据

    备份数据的原理很简单,但是也有点绕。下面我先贴一下备份data数据卷容器内的数据卷。

    docker run --volumes-from data -v /back:/back --name dabaoji c5 tar cvf /back/back.tar /data
    

    我们一点点拆开来看。
    首先,我基于c5镜像创建了一个新的名叫dabaoji容器docker run --name dabaoji c5,让他挂载数据卷容器data里的数据卷--volumes-from data,然后做了个跟宿主机做了个目录映射-v /back:/back,容器启动后,将会执行打包命令tar cvf /back/back.tar /data,将包放到了容器内的/back下,即宿主机的/back下。
    由于没有加其余参数,这个容器将会在执行完打包命令后自动关闭。

    2.恢复数据

    恢复的话,就有很多种方式了,比如cp命令发送到容器内,或者新建容器时挂载数据卷容器内的数据卷。这里就不多做赘述了。


    总结

    数据无价,保护好数据责无旁贷的。数据卷的机制也是如此。这篇介绍了通过数据卷和数据卷容器对容器内的数据进行共享、备份和恢复等操作 ,通过这些机制,即使容器在运行中出现故障,用户也不必担心数据发生丢失,只需要快速地重新创建容器即可。只要保证数据卷容器不发生故障即可。
    当然,在生产环境下,最好将主机本地数据进行备份,或者用分布式文件系统,如NFS。这个云时代,注意定期快照,尽可能的将损失降到最小甚至损失为0,使我们每个运维的职责。
    另外,有些时候不希望将数据保存在宿主机或容器中,还可以使用 tmpfs 类型的数据卷,其中数据只存在于内存中,容器退出后自动删除

    本帖子也是纯手工制作,转载请标明出处-----------burukku(づ。◕ᴗᴗ◕。)づ
  • 相关阅读:
    EventBus--介绍
    EventBus--出现的问题
    File存对象--android 的File存储到SD卡();
    SharePrecences--(json+sharePrecences)存list 或对象
    缓存AsimpleCache -- 解决Android中Sharedpreferences无法存储List数据/ASimpleCache
    ViewPager--左右可滑动的
    git之win安装git和环境配置及常用命令总结
    mySql事务_ _Java中怎样实现批量删除操作(Java对数据库进行事务处理)?
    eclispe---快捷键设置
    bug_ _org.json.JSONException: End of input at character 0 of
  • 原文地址:https://www.cnblogs.com/yuan9910/p/13784550.html
Copyright © 2011-2022 走看看