数据卷

 
六、数据卷 
 
在生产环境中使用 Docker ,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。
容器中的管理数据主要有两种方式:
口数据卷 (Data Volumes) 容器内数据直接映射到本地主机环境;
口数据卷容器(Data Volume Containers) 使用特定容器维护数据卷;
若容器在运行中出现故障,用户也不必担心数据发生丢失,只需要快速地重新创建容器即可。
另外,有些时候不希望将数据保存在宿主机或容器中,还可以使用 tmpfs 类型的数据卷,其中数据只存在于内存中,容器退出后自动删除。
 
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
  • 数据卷 可以在容器之间共享和重用
  • 对 数据卷 的修改会立马生效,无论是容器内操作还是本地操作;
  • 对 数据卷 的更新,不会影响镜像,解耦了应用和数据;
  • 数据卷 默认会一直存在,即使容器被删除;
注意:数据卷 的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的 数据卷。
 

 
基本操作
 
1、创建数据卷
快速在本地创建一个数据卷:
docker    volume    create    [选项]    [数据卷名]
创建数据卷,如果不指定数据卷名,则随机生成64位hash值;
除了 reate 子命令外, docker volume 还支持 inspect (查看详细信息)、 ls(列出已有数据卷) prune (清理无用数据卷)、 rm (删除数据卷等。
 
数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。
无主的数据卷可能会占据很多空间,要清理请使用以下命令
$ docker volume prune
 
2、绑定数据卷
除了使用 volume 子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷
 
在用 docker  run 命令的时候,可以使用 mount 选项来使用数据卷。
- mount 选项支持三种类型的数据卷,包括:
    volume:普通数据卷,映射到主机/var/ lib /docker /volumes 径下;
    bind :绑定数据卷,映射到主机指定路径下;
    tmpfs :临时数据卷,只存在于内存中;
 
比如:
docker run -d -P --name web --mount  type=bind,source=/webapp,destination=/opt/webapp training/webapp python app.py
等同于使用旧的 -v 标记可以在容器内创建一个数据卷:
docker run - d - P --name web - v /webapp: /opt/webapp training/webapp python app.py
 
本地目录的路径必须是绝对路径,容器内路径可以为相对路径,如果目录不存在, Docker 会自动创建(以前使用 -v 参数时如果本地目录不存在 Docker 会自动为你创建一个文件夹,现在使用 --mount 参数时如果本地目录不存在,Docker 会报错。)。
 
Docker 载数据卷的默认权限是读写( rw ,用户也可以通过 ro 定为只读)
$ docker run-d -P --name web -v /webapp: /opt/webapp:ro training/webapp python app.py
$ docker run-d -P --name web    --mount  type=bind,source=/webapp,target=/opt/webapp,readonly    training/webapp     python app.py
 
 
在容器内创建一个数据卷
    在用docker run命令的时候,使用-v标记可以在容器内创建一个数据卷。多次重复使用-v标记可以创建多个数据卷。
      -v /webapp
 
挂载一个主机目录作为数据卷
     使用--mount 标记可以指定挂载一个本地主机的目录到容器中去。本地目录的路径必须是绝对路径
     使用-v标记也可以指定挂载一个本地的已有目录到容器中去作为数据卷(推荐方式)。
     docker run -d -P  --name web \
     # -v /src/webapp:/opt/webapp:ro \
     --mount  type=bind,source=/src/webapp,target=/opt/webapp,readonly \
     training/webapp \
     python app.py
 
 
挂载一个数据卷到容器里
    使用 --mount 标记来将 数据卷 挂载到容器里。在一次 docker run 中可以挂载多个 数据卷。
    docker run -d -P  --name web \
    # -v my-volume:/wepapp \
    --mount source=my-volume,target=/webapp \
    training/webapp \
    python app.py
 
 
挂载一个本地主机文件作为数据卷
--mount 标记也可以从主机挂载单个文件到容器中
$ docker run --rm -it \
# -v $HOME/.bash_history:/root/.bash_history \
--mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history \
ubuntu:18.04 \
bash
 
root@2affd44b4667:/# history
1 ls
2 diskutil list
这样就可以记录在容器输入过的命令了。
如果直接挂载一个文件到容器,使用文件编辑工具,包括vi或者sed--in-place的时候,可能会造成文件inode的改变,从Docker 1.1.0起,这会导致报错误信息。所以推荐的方式是直接挂载文件所在的目录。
 

 
数据卷容器:
 
数据卷容器也是一个容器,但是它的目的是专门提供数据卷给其他容器挂载
 
--volumes-from list              Mount volumes from the specified container(s)
 
首先,创建一个数据卷容器dbdata,并创建一个数据卷(/var/lib/docker/volumes/目录下64位hash命名)挂载到容器内的/dbdata目录:
$ docker run -it -v /dbdata --name dbdata ubuntu
在其他容器中使用--volumes-from来挂载到dbdata容器中的数据卷.
例如创建db1和db2两个容器,并从dbdata容器挂载数据卷(--volumes-from  容器名):
$ docker run -it --volumes-from dbdata --name db1 ubuntu
$ docker run -it --volumes-from dbdata --name db2 ubuntu
此时,容器db1和db2都挂载同一个数据卷到相同的/dbdata目录。三个容器任何一方在该目录下的写入,其他容器都可以看到。
可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷。
使用--volumes-from参数所挂载数据卷的容器自身并不需要保持在运行状态。
如果删除了挂载的容器(包括dbdata、db1和db2),数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除最后一个还挂载着它的容器时显式使用docker rm -v命令来指定同时删除关联的容器。
 
docker    volume    prune
 

 
利用数据卷容器来迁移数据
 
1.备份
使用下面的命令来备份dbdata数据卷容器内的数据卷:
$ docker run --volumes-from dbdata -v $(pwd):/backup --name worker ubuntu tar cvf /backup/backup.tar /dbdata
首先利用ubuntu镜像创建了一个容器worker。使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷(即dbdata数据卷),使用-v  $(pwd):/backup参数来挂载本地的当前目录到worker容器的/backup目录。worker容器启动后,使用了tar cvf  /backup/backup.tar /dbdata命令来将/dbdata下内容备份为容器内的/backup/backup.tar,即宿主主机当前目录下的backup.tar。
2.恢复
如果要将数据恢复到一个容器,可以按照下面的步骤操作。
首先创建一个带有数据卷的容器dbdata2:
$ docker run -v /dbdata --name dbdata2 ubuntu /bin/bash
然后创建另一个新的容器,挂载dbdata2的容器,并使用untar解压备份文件到所挂载的容器卷中:
$ docker run --volumes-from dbdata2 -v $(pwd):/backup --name worker ubuntu bash
cd /dbdata
tar xvf /backup/backup.tar
 
 
 
 
 
 

转载于:https://www.cnblogs.com/cshaptx4869/p/10947662.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值