您的位置:首页 > 运维架构 > Docker

Docker数据持久化与容器迁移

2016-01-06 13:59 886 查看
上节讲到当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。如果想做到数据持久化,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 /datatest.txt在宿主机目录创建的文件,同样在容器内看到。2.删除容器,数据会一同删除吗?$ sudo docker stop ubuntu_test1$ sudo docker rm ubuntu_test1 $ ls container_datatest.txt看到宿主机上数据卷目录里的文件并没有发生变化,说明删除容器不会影响数据卷。3.重新启动一个容器,同样挂载这个数据卷试试$ sudo docker run -itd --name ubuntu_test2 -v /container_data:/data ubuntu $ sudo docker exec ubuntu_test1 ls /datatest.txt文件依然存在,说明初始化时将数据拷贝到了容器中。3.再启动一个容器,还将数据卷挂载到这里$ sudo docker run -itd --name ubuntu_test3 -v /container_data:/data ubuntu
$ sudo docker exec ubuntu_test1 ls /datatest.txt同样可以看到数据,说明数据卷可以共享多个容器使用。
二、[b]容器数据卷[/b]将一个正常的容器作为数据卷,让其他容器通过挂载这个容器实现数据共享。注意:数据卷容器会降低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 /opttest.txt2.提交一个新的镜像$ 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 /opttest.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 /opttest.txt总结:通过export命令也可以将容器里的数据保存,并可以迁移到别的docker主机 save与load命令使用:#一般用于迁移镜像到别处导出:$ sudo docker save web > web.tar导入:$ sudo docker load < ubuntu.tar注:不会丢弃历史记录和元数据,并可以回滚版本。启动不用加/bin/bash
本文出自 “李振良的技术博客” 博客,请务必保留此出处/article/4398415.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: