Docker数据持久化与容器迁移
上节讲到当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。如果想做到数据持久化,Docker提供数据卷(Data volume)或者数据容器卷来解决问题,另外还可以通过commit提交一个新的镜像来保存产生的数据。那么,来一一看下各自的使用方法。
一、数据卷
数据卷特性:
可以绕过UFS文件系统,为一个或多个容器提供访问。
完全独立于容器的生存周期,因此不会在删除容器时删除其挂在的数据卷。
数据卷特点:
数据卷在容器启动初始化时,如果容器使用的镜像在挂载点包含了数据,这些数据会拷贝到新初始化的数据卷中。
数据卷可以在容器直接共享和重用。
可以直接对数据卷里的内容进行修改。
数据卷的变化不会影响镜像的更新。
卷会一直存在,即使挂载数据卷的容器已经删除。
1.数据卷使用
创建并挂载数据卷:
$ sudo docker run -itd --name ubuntu_test1 -v /container_data:/data ubuntu
注:container_data为宿主机目录,/data是容器中目录,目录不存在会自动创建
$ sudo docker inspect ubuntu_test1
"Mounts": [
{
"Source": "/container_data",
"Destination": "/data",
"Mode": "",
"RW": true
}
],
可以看到已经挂载成功,并且容器对这个目录具有读写权限。
测试:
$ cd container_data
$ sudo touch test.txt
$ sudo docker exec ubuntu_test1 ls /data
test.txt
在宿主机目录创建的文件,同样在容器内看到。
2.删除容器,数据会一同删除吗?
$ sudo docker stop ubuntu_test1
$ sudo docker rm ubuntu_test1
$ ls container_data
test.txt
看到宿主机上数据卷目录里的文件并没有发生变化,说明删除容器不会影响数据卷。
3.重新启动一个容器,同样挂载这个数据卷试试
$ sudo docker run -itd --name ubuntu_test2 -v /container_data:/data ubuntu
$ sudo docker exec ubuntu_test1 ls /data
test.txt
文件依然存在,说明初始化时将数据拷贝到了容器中。
3.再启动一个容器,还将数据卷挂载到这里
$ sudo docker run -itd --name ubuntu_test3 -v /container_data:/data ubuntu
$ sudo docker exec ubuntu_test1 ls /data
test.txt
同样可以看到数据,说明数据卷可以共享多个容器使用。
二、 容器 数据卷
将一个正常的容器作为数据卷,让其他容器通过挂载这个容器实现数据共享。
注意:数据卷容器会降低I/O性能。
1.容器数据卷使用
创建一个dvdata的数据卷容器:
$ sudo docker run -itd -v /data --name dvdata ubuntu
注:/data是数据卷容器内共享的目录
在其他容器中挂载dvdata容器的数据卷:
$ sudo docker run -itd --name web1 --volumes-from dbdata ubuntu
$ sudo docker run -itd --name web2 --volumes-from dbdata ubuntu
分别进入web1、web2容器中,会有一个/data目录,在web1里的/data目录创建文件,web2也能看的到。
总结: 如果删除dvdata、web1、web2,时,数据卷并不会被自动删除。如果想删除需在删除最后一个挂载着它的容器时使用docker rm -v 命令来指定删除关联的容器。
博客地址: http://lizhenliang.blog.51cto.com
三、commit命令使用
commit命令作用是将已存在容器中的镜像和修改内容提交为一个新的镜像,通过这个方式同样能保存读写层内容。
1.启动一个新容器,并在容器/opt目录下创建test.txt文件
$ sudo docker run -itd --name web ubuntu
$ sudo docker exec web touch /opt/test.txt
$ sudo docker exec web ls /opt
test.txt
2.提交一个新的镜像
$ sudo docker commit web web:v2
$ sudo docker images
3.成功提交一个新的镜像,用这个新的镜像启动一个容器,看是否创建的文件存在
$ sudo docker run -itd --name web_v2 web:v2
$ sudo docker exec web_v2 ls /opt
test.txt
总结: commit命令同样能实现保存读写层数据,但不适于做数据持久化
四、数据卷容器备份和还原
备份:
$ sudo docker run --volumes-from dvdata -v /container_backup:/backup ubuntu tar cvf /backup/backup.tar /data
说明:先创建一个临时容器,并挂载dvdata容器数据卷,再挂载数据卷/container_backup目录到容器/bakcup,在容器中执行备份/data目录到/backup,也就是备份到宿主机/container_backup目录。
恢复:
#先创建一个数据卷容器
$ sudo docker run -v /data --name dvdata2 ubuntu
注意:这个数据卷目录名要与备份的一样
#再将备份文件恢复到这个数据卷容器
$ sudo docker run --volumes-from dvdata2 -v /container_backup:/backup ubuntu tar xvf /backup/backup.tar
#最后启动一个容器挂载验证/data目录数据恢复成功
$ sudo docker run -itd --volumes-from dvdata2 --name web_recover ubuntu
五、迁移容器和镜像
export与import命令使用:
#export导出容器会丢失历史记录和元数据,类似与快照
先创建测试容器:
$ sudo docker exec web touch /opt/test.txt
$ sudo docker exec web ls /opt
test.txt
执行导出:
$ sudo docker export web > web.tar
执行导入:
$ cat web.tar | sudo docker import - web:v2
$ sudo docker images
$ sudo docker run -itd --name web_v2 web:v2 /bin/bash
#启动这个镜像要加/bin/bash,否则报错Error response from daemon: No command specified
$ sudo docker exec web_v2 ls /opt
test.txt
总结: 通过export命令也可以将容器里的数据保存,并可以迁移到别的docker主机
save与load命令使用:
#一般用于迁移镜像到别处
导出:
$ sudo docker save web > web.tar
导入:
$ sudo docker load < ubuntu.tar
注:不会丢弃历史记录和元数据,并可以回滚版本。启动不用加/bin/bash
来自: http://lizhenliang.blog.51cto.com/7876557/1730892
Docker数据持久化与容器迁移的更多相关文章
- Docker数据持久化及实战(Nginx+Spring Boot项目+MySQL)
Docker数据持久化: Volume: (1)创建mysql数据库的container docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD= my ...
- docker数据持久化/共享---volume,bind-mount,tmpfs-mount
一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供 ...
- docker数据持久化
转载/参考: https://www.jianshu.com/p/ef0f24fd0674 Docker的数据持久化主要有两种方式: bind mount docker managed volume ...
- Docker 数据卷与容器互联
Docker是基于Go语言实现的开源容器项目,Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...
- Docker | 数据持久化与数据共享
数据持久化(安装MySQL) 参考另一篇Docker安装mysql: https://www.cnblogs.com/all-smile/p/16778376.html MySQL的数据持久化问题 # ...
- `docker数据持久化volume和bind mounts两种方式
将数据从宿主机到容器的三种方式: ,volumes:docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)保存数据的最佳方式 ,bind mounts 将宿主机上的任 ...
- 22. docker 数据持久化 Data Volume
1 . 使用场景 在docker 容器被删除的时候 希望数据不丢失 2 . Volume 的使用 * 注意 在 mysql 的 Dockerfile 内 定义了 VOLUME ["var/ ...
- 23. docker 数据持久化 bind mounting
1. bind mounting 和 data volume 的区别 data volume 需要在 Dockerfile 定义 Volume bind mounting 只需要 -v 指明 容器外部 ...
- docker 数据持久化
confluence #!/bin/bash docker run \ --name confluence \ --volume "$PWD/data/opt":/opt \ -- ...
随机推荐
- java实现excel模板导出
一. 准备工作 1. 点击此下载相关开发工具 2. 将poi-3.8.jxls-core-1.0两个jar包放到工程中,并引用 3. 将excel模板runRecord.xls放到RunRecordB ...
- 一个新人眼中的O2O
O2O是近几年来电商行业颇为受宠的方向.就其所代表的意思,线上线下,大部分人都耳熟能详.然而对于这样一个行业,很多人都有附势之嫌.最终是人力物力出尽,效果不佳.一直以来,喜欢互联网,梦想创业,梦想在互 ...
- 3、DNS服务器功能(正向、反向解析)
实验目的: 建立gr.org域的主名称服务器.解析: 名称 IP 用途 ns.gr.org 192.168.170.3 名称服务器 www.gr.org 192 ...
- 【Windows编程】系列第五篇:GDI图形绘制
上两篇我们学习了文本字符输出以及Unicode编写程序,知道如何用常见Win32输出文本字符串,这一篇我们来学习Windows编程中另一个非常重要的部分GDI图形绘图.Windows的GDI函数包含数 ...
- 【小白的CFD之旅】03 老蓝
第一次见到老蓝,小白都不太敢相信,对面那不修边幅的糟老头子会是自己要找的导师.嘴里叼着烟,牙都掉了好几颗,穿着还算整齐,这是小白对老蓝的第一印象,这印象并不太好,尤其是在小白发誓认真度过研究生三年时光 ...
- Java程序设计之扑克牌
这段代码的主要实现功能扑克牌的洗牌和发牌功能,一副牌,红桃,黑桃,梅花,方片,A~K,不含大小王. 构造一个class. 首先是声明花色: private String[] sign={"方 ...
- python的历史
Python的诞生 Python的创始人吉多·范罗苏姆(Guido van Rossum),在1989年12月的圣诞节期间,为了打发时间,决定开发一种新的脚本解释程序,作为ABC语言的继承. 现在,p ...
- 【笔记3】用pandas实现矩阵数据格式的推荐算法 (基于用户的协同)
原书作者使用字典dict实现推荐算法,并且惊叹于18行代码实现了向量的余弦夹角公式. 我用pandas实现相同的公式只要3行. 特别说明:本篇笔记是针对矩阵数据,下篇笔记是针对条目数据. ''' 基于 ...
- [web建站] 优课急送《零基础快速学习建站》视频+课件【价值399元】
[课程介绍]你想快速建一个网站出来吗?你想从什么都不懂到一两天出一个漂漂亮亮的站吗?你想完成领导交给你的任务找人建站吗?你想自己建站来创业吗?你想学会建站之后,利用给别人建站来赚钱吗?你想建一个跟某个 ...
- jquery 停止动画 stop的几种用法
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...