上节讲到当容器运行期间产生的数据是不会在写镜像里面的,重新用此镜像启动新的容器就会初始化镜像,会加一个全新的读写入层来保存数据。如果想做到数据持久化,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数据持久化与容器迁移的更多相关文章

  1. Docker数据持久化及实战(Nginx+Spring Boot项目+MySQL)

    Docker数据持久化: Volume: (1)创建mysql数据库的container docker run -d --name mysql01 -e MYSQL_ROOT_PASSWORD= my ...

  2. docker数据持久化/共享---volume,bind-mount,tmpfs-mount

    一.将Docker数据挂载到容器 在Docker中,要想实现数据的持久化(所谓Docker的数据持久化即数据不随着Container的结束而结束),需要将数据从宿主机挂载到容器中.目前Docker提供 ...

  3. docker数据持久化

    转载/参考: https://www.jianshu.com/p/ef0f24fd0674 Docker的数据持久化主要有两种方式: bind mount docker managed volume ...

  4. Docker 数据卷与容器互联

    Docker是基于Go语言实现的开源容器项目,Docker让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...

  5. Docker | 数据持久化与数据共享

    数据持久化(安装MySQL) 参考另一篇Docker安装mysql: https://www.cnblogs.com/all-smile/p/16778376.html MySQL的数据持久化问题 # ...

  6. `docker数据持久化volume和bind mounts两种方式

    将数据从宿主机到容器的三种方式: ,volumes:docker管理宿主机文件系统的一部分(/var/lib/docker/volumes)保存数据的最佳方式 ,bind mounts 将宿主机上的任 ...

  7. 22. docker 数据持久化 Data Volume

    1 . 使用场景 在docker 容器被删除的时候  希望数据不丢失 2 . Volume 的使用 * 注意 在 mysql 的 Dockerfile 内 定义了 VOLUME ["var/ ...

  8. 23. docker 数据持久化 bind mounting

    1. bind mounting 和 data volume 的区别 data volume 需要在 Dockerfile 定义 Volume bind mounting 只需要 -v 指明 容器外部 ...

  9. docker 数据持久化

    confluence #!/bin/bash docker run \ --name confluence \ --volume "$PWD/data/opt":/opt \ -- ...

随机推荐

  1. 常用python机器学习库总结

    开始学习Python,之后渐渐成为我学习工作中的第一辅助脚本语言,虽然开发语言是Java,但平时的很多文本数据处理任务都交给了Python.这些年来,接触和使用了很多Python工具包,特别是在文本处 ...

  2. android setDestinationInExternalPublicDir 下载到SD卡根目录

    一:setDestinationInExternalPublicDir(“Trinea”, “MeiLiShuo.apk”);表示设置下载地址为sd卡的Trinea文件夹,文件名为MeiLiShuo. ...

  3. 搞ACM的你伤不起[转自RoBa]------(看一次,笑一次)

    RoBa原创,转载请注明出处  劳资六年前开始搞ACM啊!!!!!!!!!! 从此踏上了尼玛不归路啊!!!!!!!!!!!! 谁特么跟劳资讲算法是程序设计的核心啊!!!!!! 尼玛除了面试题就没见过用 ...

  4. ELF Format 笔记(十三)—— 段权限

    ilocker:关注 Android 安全(新手) QQ: 2597294287 一个可被系统加载的程序至少拥有一个可加载段.当系统创建可加载段的内存映像时,会根据 p_flags 赋予一定的访问权限 ...

  5. Oracle 收缩数据文件

    Oracle数据库中当某些大数据表不再需要的时候,我们可以通过以下方式来进行清理: DROP TABLE TBL_TEST PURGE; 但是对应表空间(tablespace)中的磁盘空间并没有得到释 ...

  6. MMORPG大型游戏设计与开发(服务器 游戏场景 聊天管道和寻路器)

    又快到双十一,又是不少同仁们出血的日子,首先希望大家玩的开心.我曾经想要仔细的剖析场景的的每个组件,就像这里的聊天管道与寻路器,但是仔细阅读别人代码的时候才发现元件虽小但是实现并不简单,因为有些东西还 ...

  7. 深入理解C++对象模型

    C++对象模型是比较重要的一个知识点,学习C++对象的内存模型,就可以明白C++中的多态原理.类的初始化顺序问题.类的大小问题等. 1 C++对象模型基础 1.1 C++对象中都有哪些东东 C++对象 ...

  8. libsvm简介和函数调用参数说明

    1.      libSVM简介 libSVM是台湾林智仁(Chih-Jen Lin) 教授2001年开发的一套支持向量机库,这套库运算速度挺快,可以很方便的对数据做分类或回归.由于libSVM程序小 ...

  9. 俄罗斯方块(Win32实现,Codeblocks+GCC编译)

    缘起: 在玩Codeblocks自带的俄罗斯方块时觉得不错,然而有时间限制.所以想自己再写一个. 程序效果: 主要内容: 程序中有一个board数组,其中有要显示的部分,也有不显示的部分,不显示的部分 ...

  10. python generator: next , sent(msg)区别

    对于普通的生成器,第一个next调用,相当于启动生成器,会从生成器函数的第一行代码开始执行,直到第一次执行完yield语句(第4行)后,跳出生成器函数. 然后第二个next调用,进入生成器函数后,从y ...