docker卷、持久化和迁移

容器中的数据与Host相互独立,随着容器的释放(删除),这些数据也将丢失.
为了避免这个问题,Docker提供了数据卷(Volume)这个数据持久化工具.
持久化后的数据,不会随着容易删除而丢失.

概述

试想这样一个场景,几年前我创建了一个mysql5.5的容器,几年后由于业务变动,需要升级到mysql5.6,这个时候需要登陆到容器里面,把mysql的表文件复制下来,再想办法迁移到新的mysql服务中.

这个手动复制的过程很容易出现意外,万一不粗心大意,没有复制data就删除了容器,那差不多可以跑路了,否则就等着全村吃席吧.

好在Docker提供了bind mountvolume两种方式来做数据持久化,先准备个mysql镜像准备演示.

docker pull mysql:5.6

bind mount

bind mount是将host上的一个目录mount到容器中,类似于一个共享文件夹.

bind mount一个目录到容器,需要在创建容器时使用-v 本地目录:容器目录参数指定

docker run  -v /Users/zhangsan/opt:/opt ......

上述例子将本地/Users/zhangsan/opt目录挂在到容器的/opt目录. 登陆容器,

docker exec -it mysql_test_volume /bin/bash
echo Hello,World  >> index.html
exit

此时本地的/Users/zhangsan/opt目录就会出现刚才创建index.html.

反之,如果在本地新增文件index2.html,容器内也会出现这个文件.

使用bind mount需要注意以下几点:

  • host路径必须为全路径,否则回和volume混淆
  • 如果host目录不存在,docker会自动创建该目录
  • 如果容器目录不存在,docker会自动创建该目录
  • 如果容器目录已有数据,那么docker会将其覆盖掉

就上面那个场景,如果使用了 bind mount,此时只需要新起一个5.6版本的容器,将目录mount到新地址即可.

docker run  -v /Users/zhangsan/opt:/opt --name mysql_test_volume -d -e MYSQL_ROOT_PASSWORD=123456  -p 3306:3306 mysql:5.6

由于bind mount本质是个共享文件夹,因而依赖于系统文件系统,不同系统间无法移植,

windowsNTFS文件系统就无法与linux常用的ext3/4兼容,windows目录为\Users\zhangsan\...格式,
ext4文件系统目录路径为/usr/...

volume

volume是容器上的一个或者多个目录,此目录可以绕过文件系统,与宿主机上的某目录绑定.

volume于容器化初始化之时即会创建,可以在不同host上移植,卷中的数据会在build image期间完成复制.

  • 数据卷可以在容器之间共享和重用
  • 对数据卷的更改是直接进行的
  • 更新镜像时,不包括对数据卷的更改
  • 即使删除容器本身,数据卷也会保持

使用docker volume create volume_name来创建一个卷

docker volume create test

test挂在到容器上

docker run  -v test:/opt --name mysql_test_volume -d -e MYSQL_ROOT_PASSWORD=123456  -p 3306:3306 mysql:5.6

查看所有卷,使用

docker volume ls

查看一个卷信息,使用

docker volume inspect volume_name
docker_volume.png

删除未使用的卷

docker volume prune

删除一个卷

docker volume rm volume_name

bind mount不同的是,

  • 如果volume是空的而容器中的目录有内容,那么docker会将container目录中的内容拷贝到volume中
  • 但是如果volume中已经有内容,则会将container中的目录覆盖
  • Mac系统的docker Desktop实际上是构建在虚拟机上的,其volume在虚拟机的var/lib/docker/volume中,本机上不存在这个路径.

volume迁移

最2的方式,登陆host/var/lib/docker/volume目录找到对应的volume,打包带走,在新hostvolume中解压.
上面部分提到过volume的特点,可以利用这点来进行迁移,假设有一个卷test需要迁移,步骤如下
1.下载一个镜像,越小越好,比如(alpine)
2.通过这个镜像创建容器A,挂在test,由于容器内容为空,test中的数据会被复制到容器目录中
3.打包这个容器A打包成镜像image-A,push或者本地快照
4.新机器上新建同名volume,然后pull或者import镜像image-A
5.通过镜像image-A启动容器B,挂载卷test,由于test是空的而容器目录有内容,docker会将container目录中的内容拷贝到volume中.
6.删除镜像image-A,容器A,容器B,由于数据卷不会被删除,因而就完成了迁移,可以给新的容器使用.
这样volume就随着容器迁移到新的host上了

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,132评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,802评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,566评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,858评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,867评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,695评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,064评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,705评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,915评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,677评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,796评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,432评论 4 322
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,041评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,992评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,223评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,185评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,535评论 2 343

推荐阅读更多精彩内容