Docker数据管理

Docker容器管理数据有两种方式

  • 数据卷:容器内的数据直接映射到本地主机环境

  • 数据卷容器:使用特定容器维护数据卷


数据卷

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


数据卷的特性:

  • 数据卷可以在容器之间共享和重用,容器间传递数据将变得高效方便

  • 对数据卷内数据的修改会立马生效,无论是容器操作还是本地操作

  • 对数据卷的更新不会影响镜像,解耦了应用和数据

  • 卷会一直存在,知道没有容器使用,可以安全的卸载它


容器内创建数据卷

使用 -v标记可以在容器内创建一个数据卷,多次重复使用-v标记可以创建多个数据卷

例如:

# docker run -itd --name web -v /webapp ubuntu 
e8baf9e93c2f80e22ec89be503f4de2a56b870cead2c74566aced5f3492add13

# docker ps -a  
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                    PORTS                    NAMES
e8baf9e93c2f        ubuntu              "/bin/bash"              3 seconds ago       Up 2 seconds                                       web

创建并启动一个容器,名为web,给容器创建了一个数据卷/webapp



# docker exec -it web  /bin/bash
root@e8baf9e93c2f:/# ls 
bin   dev  home  lib64  mnt  proc  run   srv  tmp  var
boot  etc  lib   media  opt  root  sbin  sys  usr  webapp

连接到容器内,可以看到/webapp目录已经创建了



挂载一个主机目录作为数据卷

# docker run -itd --name web02 -v /srv:/opt/srv ubuntu

连接到web02容器,查看/opt/srv目录下是否跟本地数据一样

# docker exec -it web02 /bin/bash

# ls /opt/srv/
apache-tomcat  guacamole-client-0.9.14.tar.gz  jdk    zabbix
cdh            guacamole-server-0.9.14.tar.gz  tools

在容器内创建test目录

# mkdir test

# ls
apache-tomcat  guacamole-client-0.9.14.tar.gz  jdk   tools
cdh            guacamole-server-0.9.14.tar.gz  test  zabbix

退出容器,可以看到/srv目录下多了test目录

# ls /srv/
apache-tomcat  cdh  guacamole-client-0.9.14.tar.gz  guacamole-server-0.9.14.tar.gz  jdk  test  tools  zabbix

注意:将本地目录挂载到容器内时,本地路径必须是绝对路径。如果本地目录不存在,会自动创建,docker挂载数据卷的默认权限是读写,用户也可以通过ro设置为只读

例如:

# docker run -itd --name web02 -v /srv:/opt/srv:ro  ubuntu


数据卷容器

如果用户希望多个容器之间共享一些持续更新数据,最简单的方式是使用数据卷容器。数据卷容器也是一个容器,它是专门用来提供数据卷供其他容器挂载的。

首先创建一个数据卷容器

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

查看/dbdata目录

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


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

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

$ root@012c3b277461:/# ls
bin  boot  dbdata  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

可以看到db1这个容器有/dbdata目录


同样的方法,创建db2容器

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


在db1容器的/dbdata目录下创建test目录

root@012c3b277461:/# cd dbdata/
root@012c3b277461:/dbdata# ls
root@012c3b277461:/dbdata# mkdir test
root@012c3b277461:/dbdata# ls
test

在db2容器中可以看到/dbdata目录下也有test目录

root@f3aab4e96507:/# cd /dbdata/
root@f3aab4e96507:/dbdata# ls
test


注意:可以多次使用--volumes-from参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器卷的容器来挂载数据卷,如

docker run -d --name db3 --volumes-from db1 ubuntu

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

删除了挂载的容器,数据卷并不会被自动删除。


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

备份

利用数据卷容器可以对其中数据卷进行备份、恢复,以实现数据的迁移。

 docker run --volumes-from dbdata -v $(pwd):/backup \
 --name worker ubuntu tar zcf /backup/backup.tar /dbdata

解析:使用Ubuntu镜像创建一个容器worker。使用--volumes-from dbdata参数来让worker容器挂载dbdata容器的数据卷,即/dbdata数据卷。

使用-v $(pwd):/backup将本机的当前目录挂载到worker容器的/backup目录。

worker容器启动后,执行tar命令,将worker容器下挂载的/dbdata目录中的数据压缩备份到/backup目录下,名为backup.tar文件,而worker容器将/backup目录挂载到宿主机的当前目录了,所以backup.tar文件

也在本机的当前目录下, 宿主机下执行ls命令,可以看到backup.tar文件

# ls
backup.tar


恢复

如果要将数据恢复到一个容器,执行下面的命令

# docker run -itd -v /data --name data1 centos:6
749852a07dedec5acb9249b3af8d0fd78783379922b048581e9734fd3c13335f

创建一个带有空数据卷的容器data1


# docker run --volumes-from data1 -v $(pwd):/backup centos:6 \
tar xvf /backup/backup.tar -C /data
mynginx/
mynginx/zabbix-agent-3.0.8-2.el7.x86_64.rpm
mynginx/Dockerfile

再次创建一个容器,挂载data1的数据卷,然后将本地的当前目录的挂载到容器的/backup目录下,执行untar解压缩命令,将本地的当前目录下的backup.tar文件解压缩到容器的/data目录下,

这样就恢复了数据卷容器中的数据

注意:很多文档里面没有将数据解压缩时,指定解压缩到/data目录,这样恢复的数据不在/data目录下。


可以创建并启动一个新的容器,挂载到data1数据卷,查看/data目录下是否有恢复过去的数据

# docker exec -it  wizardly_shockley /bin/bash

# ls
bin   dev  home  lib64       media  opt   root  selinux  sys  usr
data  etc  lib   lost+found  mnt    proc  sbin  srv      tmp  var

# ll /data
total 0
drwxr-xr-x 2 root root 65 Jun 13 03:13 mynginx






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章