Docker数据管理

Docker 2020-09-08 1008

在生产环境中使用Docker,往往需要对数据进行持久化,或者需要在多个容器之间进行数据共享,这必然涉及容器的数据管理操作。

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

  • 数据卷(Data Volumes):容器内数据直接映射到本地主机环境
  • 数据卷容器(Data Volume containers):使用特定的容器维护数据卷

1.数据卷 

数据卷:是一个可供容器使用的特殊目录,它将主机操作系统目录直接映射进容器,类似于Linux中的mount行为。

特性:

  • 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效与方便
  • 对数据卷内数据的修改,将立马生效,无论是容器内操作还是本地操作
  • 对数据卷的更新不会影响镜像,解耦开应用和数据
  • 卷会一直存在,直到没有容器使用,可以安全的卸载它

1.1创建数据卷

Docker提供了volume子命令来管理数据卷,如下命令可以快速在本地创建一个数据卷:

$ docker volume create -d local test
test

此时,查看/var/lib/docker/volumes路径下,会发现所创建的数据卷的位置:

$ ls -l /var/lib/docker/volumes
drwxr-xr-x 3 ....  test

除了create命令外,docker volume还支持inspect (查看详细信息)、ls(列出已有数据卷)、prune(清理无用数据卷)、rm(删除数据卷)等命令

2.绑定数据卷

除了使用volume子命令来管理数据卷外,还可以在创建容器时将主机本地的任意路径挂载到容器内作为数据卷,这种形式创建的数据卷称为绑定数据卷。

在使用docker [container] run命令的时候,可以使用-mount选项来使用数据卷。

-mount选项支持三种类型的数据卷,包括:

  • volume: 普通数据卷,映射到主机/var/lib/docker/volumes路径下
  • bind:绑定数据卷,映射到主机指定路径下
  • tmpfs:临时数据卷,只存在于内存中

下面使用training/webapp镜像创建一个Web容器,并创建一个数据卷挂载到容器的/opt/webapp目录:

$ 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会自动创建

docker挂载数据卷的默认权限是读写,用户可以通过ro指定为只读

$ docker run -d -p --name web -v /webapp:/opt/webapp:ro training/webapp python app.py 

加了:ro后,挂载数据卷内的数据将无法修改。 

2.数据卷容器

如果用户需要在多个容器间共享数据,那么可以使用数据卷容器,其本质上也是一种容器,但是专门提供数据卷给其他容器挂载。

创建一个数据卷容器dbdata,并在其中创建一个数据卷挂载到/dbdata:

$ docker run -it -v /dbdata --name dbdata ubuntu

查看/dbdata目录:

root@5f318fe99a6a:/# ls
bin   dbdata  etc   lib    lib64   media  opt   root  sbin  sys  usr
boot  dev     home  lib32  libx32  mnt    proc  run   srv   tmp  var

如果你想退出容器环境,可以按crtl+d

然后,可以在其他容器中使用--volumes-from来挂载dbdata容器中的数据卷,例如创建db1和db2两个容器,并从dbdata容器挂载数据卷:

$ docker run -it --volumes-from dbdata --name db1 ubuntu
$ docker run -it --volumes-from dbdata --name db2 ubuntu

此时db1和db2都挂载到了/dbdata目录,当我在db2中使用mkdir在dbdata下创建了一个test目录

在进入db1容器中查看dbdata下,可以看到test目录

root@VM-0-7-ubuntu:/home/hy# docker restart c2a5113990cb
c2a5113990cb
root@VM-0-7-ubuntu:/home/hy# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                          PORTS               NAMES
10a7fb7fddf8        ubuntu              "/bin/bash"         2 minutes ago       Exited (0) About a minute ago                       db2
c2a5113990cb        ubuntu              "/bin/bash"         4 minutes ago       Up 11 seconds                                       db1
5f318fe99a6a        ubuntu              "/bin/bash"         27 minutes ago      Exited (127) 21 minutes ago                         dbdata
root@VM-0-7-ubuntu:/home/hy# docker attach c2a5113990cb
root@c2a5113990cb:/# ls
bin  boot  dbdata  dev  etc  home  lib  lib32  lib64  libx32  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
root@c2a5113990cb:/# cd dbdata/
root@c2a5113990cb:/dbdata# ls
test

注意:使用--volumes-from参数所挂载数据卷的容器自身并不需要保持运行状态

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

3.利用数据卷容器来迁移数据

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 容器启动 后, 使 用 t a r 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 busybox tar xvf
/backup/backup.tar

 

标签:Docker

文章评论

评论列表

已有0条评论