Docker数据管理
容器中管理数据主要有两种方式:数据卷和数据卷容器
将本地的目录或者文件挂载到容器内的数据卷中
数据卷是可提供容器使用的特殊目录,他绕过文件系统,可提供多种特性
- 数据卷可一在容器直接共享和重复使用
- 数据卷的修改会立刻生效
- 数据更新不会影响到镜像
- 卷一直存在,不管容器有没有使用
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,容器内挂载的数据卷的数据就无法修改
2.挂载本地文件作为数据卷
-v标记也可以从主机挂载单个文件到容器作为数据卷如:docker run d -p 80:80 --name name1 -v /nginx.comf:/usr/local/nginx/nginx.conf:ro nginx
但是, 我们不推荐使用这种方式,因为在挂载容器的时候,如果容器内使用vi修改或者sed等修改会操作文件的inode改变,这在docker目前版本中可能会操作报错
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,容器卷备份和恢复:
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]#
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
导入和到处容器
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 ~]#
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