Docker数据管理-备份和恢复


Docker数据管理

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

将本地的目录或者文件挂载到容器内的数据卷中

数据卷是可提供容器使用的特殊目录,他绕过文件系统,可提供多种特性

  • 数据卷可一在容器直接共享和重复使用
  • 数据卷的修改会立刻生效
  • 数据更新不会影响到镜像
  • 卷一直存在,不管容器有没有使用

I. 1,挂载目录

数据卷类似于linux中的mount挂载操作

在使用docker run命令的时候使用-v标记可以在容器内创建一个数据卷,多次使用-v表姐可以创建多个

也可以在docker-compose中被调用
如:docker run d -p 80:80 --name name1 -v /nginx:/usr/local/nginx nginx
如上所示就是将/nginx目录挂载到容器卷中/usr/lcoal/nginx下,如果目录不存在则会自动创建,他默认的权限是读写(rw),用户可以使用ro指定为只读等
如:docker run d -p 80:80 --name name1 -v /nginx:/usr/local/nginx:ro nginx
如果添加了ro,容器内挂载的数据卷的数据就无法修改

II. 2.挂载本地文件作为数据卷

-v标记也可以从主机挂载单个文件到容器作为数据卷
如:docker run d -p 80:80 --name name1 -v /nginx.comf:/usr/local/nginx/nginx.conf:ro nginx
但是, 我们不推荐使用这种方式,因为在挂载容器的时候,如果容器内使用vi修改或者sed等修改会操作文件的inode改变,这在docker目前版本中可能会操作报错

III. 3,数据卷容器

通常在一些持续更新的数据,我们可以使用数据卷容器,如:

[root@localhost ~]# docker run -it -v /mydata1 --name mydata debian
root@d3bc579080cb:/# echo `www.linuxea.com` > mydata/data.txt
root@d3bc579080cb:/# echo `date +%F-%T` > mydata1/data.txt
root@d3bc579080cb:/# cat mydata1/data.txt
2016-09-01-04:14:35
root@d3bc579080cb:/# 

现在,在使用其他容器并且使用--volumes-from来挂载mydata容器中的数据卷,如:
db1挂载

[root@localhost ~]# docker run -it --volumes-from mydata --name db1 debian
root@9a42647f5a2d:/# cat mydata1/data.txt 
2016-09-01-04:14:35
root@9a42647f5a2d:/# 

db2挂载

[root@localhost ~]# docker run -it --volumes-from mydata --name db2 debian
root@8f7738f2f159:/# cat mydata1/data.txt 
2016-09-01-04:14:35
root@8f7738f2f159:/# 

此时无论在哪里进行修改都会同步,当然也可以多次使用--volumes-from参数来从多个容器挂载多个数据卷

如果删除,则需要使用docker rm -v来指定同时删除关联的容器,如果只是删除了挂载的容器,数据卷并不会被自动删除
##4,容器卷备份和恢复:

IV. 1.备份容器卷

我们沿用上面的示例,使用上面挂载的mydata容器卷

  • 在备份之前,我们先在之前挂载的mydata容器中mydata1目录下的data文件中追加一行
[root@1002797adf78 mydata1]# echo "is I was a backup`date +%c-%p`" >> data.txt
[root@1002797adf78 mydata1]# cat data.txt 
2016-09-01-16:08:24
is I was a backupThu Sep  1 16:32:40 2016-PM
[root@1002797adf78 mydata1]# 
  • 现在我们备份容器中的这个目录到本地来

docker run --volumes-from mydata -v $(pwd):/backup --name back kriation/centos7 tar cf /backup/beifen.tar /mydata1

这条命令先创建一个容器,使用--volumes-from来把mydata 容器的数据卷也就是mydata1目录挂载到backup目录下,容器启动后使用tar命令将/mydata1备份到宿主机的当前目录下:tar cf /backup/benfen.tar /mydata1


如下所示:

[root@gitlab dockerhub]# docker run --volumes-from mydata -v $(pwd):/backup --name back kriation/centos7 tar cf /backup/beifen.tar /mydata1
tar: Removing leading `/' from member names
[root@gitlab dockerhub]# ls
beifen.tar  file123
[root@gitlab dockerhub]# 

我们解压出来查看下,备份完成

[root@gitlab dockerhub]# tar xf beifen.tar 
[root@gitlab dockerhub]# cat mydata1/data.txt 
2016-09-01-16:08:24
is I was a backupThu Sep  1 16:32:40 2016-PM
[root@gitlab dockerhub]# 

V. 2.恢复容器卷

1,如果要恢复一个容器,先创建一个带有数据卷的容器ngx

[root@gitlab dockerhub]# docker run -it -v /mydata1 --name ngx kriation/centos7 /bin/bash
[root@400835c3ce88 /]# 

2,在创建一个新容器,挂载ngx容器,并使用tar xf解压到挂载的目录中

[root@gitlab dockerhub]# docker run --volumes-from ngx -v $(pwd):/backup kriation/centos7 tar xf /backup/beifen.tar

3,在回到ngx就可以看到数据已经恢复

[root@400835c3ce88 /]# cd mydata1/
[root@400835c3ce88 mydata1]# ls
data.txt

导入和到处容器

VI. 1,导入

[root@gitlab ~]# docker export b889bfd7a6ee > nginx.tar
[root@gitlab ~]# ll nginx.tar 
-rw-r--r--. 1 root root 235801600 9月   2 02:08 nginx.tar
[root@gitlab ~]# 

VII. 2,导出

[root@gitlab ~]# cat nginx.tar |docker import - marksugar/nginx:123
sha256:d236f62ae8c4ed106e00ba073877f90f19b21df0c8b3a67ca744baef9d7495af
[root@gitlab ~]# docker images
REPOSITORY                  TAG                 IMAGE ID            CREATED             SIZE
marksugar/nginx             123                 d236f62ae8c4        6 seconds ago       226 MB

1 分享

您可以选择一种方式赞助本站

支付宝扫码赞助

支付宝扫码赞助

日期: 2016-09-05分类: Docker

标签: docker

发表评论