zoukankan      html  css  js  c++  java
  • docker-数据管理(3)

     Docker 容器中管理数据主要有两种方式:

    • 数据卷(Data volumes)
    • 数据卷容器(Data volumes containers

    数据卷是一个可供一个或者多个容器使用的特殊目录,它绕过UFS,可以提供很多有用的特性:

    • 数据卷可以在容器之间共享和重用
    • 对数据卷的修改会立马生效
    • 对数据卷的更新,不会影响镜像
    • 数据卷默认会一直存在,即时容器被删除
    [root@server ~]# docker volume create myvolume  #创建一个数据卷
    myvolume
    [root@server ~]# docker volume inspect myvolume  #查看数据卷的信息
    [root@server ~]# docker run -d -it --name myCentos --mount src=myvolume,dst=/data centos  #创建一个myCentos容器,并将myvolume数据卷挂载到myCentos容器的/data目录
    [root@server ~]# docker exec -it myCentos /bin/bash  #进入容器
    [root@8f3094a730af /]# echo “hello” > /data/test.txt   
    #查看文件
    [root@server ~]# cd /var/lib/docker/volumes/myvolume/_data  #在另外一个终端进入到数据目录里面
    [root@server ~]# more test.txt
    View Code
    此时开启另外一个终端再次创建一个容器,并且挂载同样的数据卷,可以发现这种方式可以在容器之间共享和重用
    
    [root@server ~]# docker run -d -it --name myCentos01 --mount src=myvolume,dst=/data centos  #新开一个终端创建新的一个容器,挂载同样的数据卷
    [root@server ~]# docker exec -it myCentos01 /bin/bash
    [root@45c3ca27ddad /]# ls /data/  
    View Code

    使用 -v 参数也可以指定挂载一个本地主机的目录到容器中

    [root@server ~]# docker run -d -ti --name web -v /webapp:/opt/webapp centos  #创建一个名字叫web的容器,并且将宿主机的/webapp目录 挂载到容器的/opt/webapp目录
    [root@server ~]# ls /webapp/  #查看宿主机的目录,如果没有该目录,会自动创建
    [root@server ~]# echo "hello" >> /webapp/index.html  #追加一个文件进去
    [root@server ~]# docker exec -ti web /bin/bash   #进入容器
    [root@16c66fe42017 /]# cat /opt/webapp/index.html   #查看容器/opt/webapp目录下的数据
    View Code

    数据卷容器

    如果有一些持续更新的数据需要在容器之间共享,最好创建数据卷容器。数据卷容器其实就是一个正常的容器,专门用来提供数据卷供其它容器挂载的。

    [root@server ~]# docker run -d -v /dbdata --name dbdata centos  #创建一个数据卷容器
    
    [root@server ~]# docker run -d -it --volumes-from dbdata --name db1 centos  #创建一个db1容器, 使用 --volumes-from 来挂载 dbdata 容器中的数据卷
    [root@server ~]# docker exec -it db1  /bin/bash  #进入db1容器中
    [root@1863842f0c16 /]# ls  #查看已成功挂载dbdata数据卷
    anaconda-post.log  dbdata  etc   lib    media  opt   root  sbin  sys  usr
    bin                dev     home  lib64  mnt    proc  run   srv   tmp  var
    [root@1863842f0c16 /]# touch dbdata/file1  #在dbdata目录中创建一个文件
    
    [root@server ~]# docker run -d -it --volumes-from dbdata --name db2 centos  #再创建一个db2容器,使用 --volumes-from 来挂载 dbdata 容器中的数据卷
    [root@server ~]# docker exec -it db2 /bin/bash  #进入db2容器中
    [root@0fca0699a7c7 /]# ls  #查看也成功挂载dbdata数据卷
    anaconda-post.log  dbdata  etc   lib    media  opt   root  sbin  sys  usr
    bin                dev     home  lib64  mnt    proc  run   srv   tmp  var
    [root@0fca0699a7c7 /]# ls dbdata/  #并且还查看到了db1容器创建的file1文件,说明容器之间的数据共享了
    file1
    
    另外还可以级联创建
    [root@server ~]# docker run -d -ti --name db3 --volumes-from db1 centos  #创建一个db3容器,通过 --volumes-from 级联挂载上面的db1容器
    
    级联删除:
    View Code

    注意:如果删除了挂载的容器(包括dbdata、db1和db2),数据卷也不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时使用 docker rm -v 命令来指定同时删除关联的容器。

  • 相关阅读:
    第二章作业
    算法第五章作业及学期总结
    71 最大子列和问题 | 采用二分法+递归
    算法第一章作业
    算法第四章作业
    算法第三章作业
    Windows charles安装、配置及Android手机ca证书
    git出现fatal: Authentication failed for 'http:xxxx.git/''错误的解决办法
    如何用c#将十六进制转换成字符串?
    系统配置win7(64位),vs2010,没有注册类别 (异常来自 HRESULT:0x80040154 (REGDB_E_CLASSNOTREG))
  • 原文地址:https://www.cnblogs.com/topass123/p/12567058.html
Copyright © 2011-2022 走看看