设为首页 收藏本站
查看: 938|回复: 0

[经验分享] Docker数据持久化与容器迁移

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2016-1-4 09:04:35 | 显示全部楼层 |阅读模式
上节讲到当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。如果想做到数据持久化,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 命令来指定删除关联的容器。



三、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
wKiom1aHmizRJTH3AAALZBBhRf0914.jpg
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
wKiom1aHmtuhyu9UAAAHiNrmLo0553.jpg $ 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


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-159977-1-1.html 上篇帖子: Docker 容器间时间同步 下篇帖子: Docker Machine快速安装Docker环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表