Docker数据管理简介

以往我们想安装某个服务器应用,需要提前安装各种依赖包,然后安装目标应用,然后是各种设置。。。幸运的话,也许1,2个小时后,就能看到期待的画面,但事实经常是半天过去了,还在排查各种ERROR,你感到挫折,也许你很坚强,不达目的不罢休,也许有人就放弃了,比如本人就经常这样,于是丢失潜在宝贵用户。。。
容器技术在我看来是一种革命性的应用分发,运行服务器应用,你只需1步
docker run app-img-name
比如 docker run -p 80:80 nginx 然后你就可以http://localhost了。
这个命令做了什么事情呢?

  • 查看本地是否存在nginx镜像,若没有就下载→PULL
  • 创建Contianer for nginx,然后载入内存并运行(本例还把主机端口80同容器端口80做了映射)→Deploy
image.png

因为容器技术,重新构建并运行应用变得容易且快速,容器化应用基本是无需进一步配置的(已经打包好所有依赖并且已配置),只需PULL,然后Deploy(也许还需要一份docker-compose.yml)就好。我们无需太担心硬件,OS,库以及应用本身的潜在Bug导致应用挂掉,挂掉就挂掉吧,销毁然后重新运行一个新的就好,而且马上就可Ready。需要重点关心的是如何保存,备份,恢复应用产生的数据,本文记录了容器管理数据的一些调查。

数据存放的位置

大体可分2类

  • 容器层(Container layer)
  • 数据卷(data volume)

容器层(Container layer)

image.png

这是一个薄的可读写层,何为薄?因为对应用可见的文件系统,基本都存在于底层镜像,只在需要修改时,才会CoW(copy-on-write)到这一层,另外还保存一些运行时生成的配置(例如Dockers Engine Daemon分配的IP和DNS设置等)和log。在没有定义Volume时,容器内部运行时生成的数据会写到这一层,因为Container layer是容器的一部分,伴随容器的生命周期死亡,销毁,所以关键数据不能放在这里,不过可以用作缓存,另外如果stop&start或者restart容器,数据不会丢失,因为容器没有销毁。在容器外获取这一层数据的方式似乎只有docker cp命令,并且为了安全copy还可以被禁止。

数据卷(data volume)

Data volumes are designed to persist data, independent of the container’s lifecycle.

数据卷是独立的存储,与容器层不同,不依赖于容器的生命周期。
从数据卷的定义时机看有2种,一个是在Dockfile也就是生成镜像的时候,一个是在运行容器的时候。

Dockfile定义Volume

VOLUME ["/data"]
实际上这是定义一个挂载点,当用docker run命令运行容器时,如果镜像中存在挂载点相同路径的文件,会copy到数据卷以初始化。(这里说的只适用于匿名卷和命名卷,在绑定主机目录时,copy行为不会发生,原有的镜像中同名路径的文件系统会被覆盖(Overlay),对容器不可见)

运行时定义Volume

2种方式

  • 命令行
    docker run --rm -v /foo -v awesome:/bar -v /hoge:/hoge busybox top
    这里定义了匿名/foo,命名/bar(名字awesome),以及主机/hoge和容器/hoge的绑定。
  • docker-compose.yml
volumes:
  # Just specify a path and let the Engine create a volume
  - /var/lib/mysql

  # Specify an absolute path mapping
  - /opt/data:/var/lib/mysql

  # Named volume
  - datavolume:/var/lib/mysql

数据卷的类型

数据卷有2中类型:volume和bind,其中volume又包含匿名数据卷(anonymous data volume)和命名数据卷(named data volume)。bind就是主机绑定。另外还有一种叫做数据卷容器(data volume container)的机制,本质上就像定义了数据卷模板,其他容器复制这个模板,参照相同的位置,这样就可达到多个容器共享数据卷的目的,并不是一种新的数据卷类型。下面分别讲述。

匿名数据卷和命名数据卷

可以用下面命令查看数据卷

simon@home:~/devops/busybox$ sudo docker volume ls
DRIVER              VOLUME NAME
local               8cb8d18e377aae5f4a85f0fb040aa326c8ba0cad9640807d73af693355754d32 #匿名卷
local               awesome #命名卷
simon@home:~/devops/busybox$

可以发现,匿名卷的名字是一长串字符。另外,前面提到,数据卷独立于容器的生命周期,容器删除时,数据卷依然存在,但是对于匿名卷,在容器运行时如果添加--rm,那么匿名卷会随同容器一同删除。
这2种卷在主机的位置是/var/lib/docker/volumes,容器删除后,如果不想保留卷可用docker volume prune清除。

主机绑定数据卷

主机绑定的卷,用docker volume ls是无法查看的,完全脱离了docker的管理,所以与容器删除与否无关,docker volume prune也无法清除,只能用系统的rm命令清除。另外,主机绑定的目录会完全覆盖镜像的同名目录,原来存在于基础镜像中的同名目录内容在容器运行时完全不可见,而匿名卷和命名卷在初始化时则会copy基础镜像中的文件,以供后续修改。

数据卷容器

创建
sudo docker create -v /dbdata --name dbstore training/postgres /bin/true
引用

sudo docker run -d --volumes-from dbstore --name db1 training/postgres
sudo docker run -d --volumes-from dbstore --name db2 training/postgres

sudo docker inspect db1sudo docker inspect db2查看,可以发现MOUNT段完全一样,这样在db1中写入/dbdata的内容,db2也可看到,反之同理。另外,dbstore甚至可以删除,因为数据卷配置已经copy过来,不在依赖dbstore了。

SWARM模式下的数据管理

上面讨论,都是基于同一Docker主机为前提的,但是在实际生产环境SWARM集群模式会经常用到,由于Docker的设计特性,就是动态分配Task在不同的worker node上,而数据卷却不会随着Task迁移,另外同一Task可能有多份replica,数据一致性也是问题。因此部署到SWARM中的服务最好是无状态的,但是应用总会参照或生成数据,怎么办?思路是把保存应用状态的服务独立出来,不要放在SWARM中,但是要加入SWARM所在的网络,参照的地方用名称访问(微服务的理念,尚未验证)。

总结

Docker真是一个好工具,让应用分发,运行一键搞定,Docker Swarm之类的容器集群管理工具又让分布式部署变得轻松,运维人员只要盯好数据,其他的事情就交给Docker。

参考
https://docs.docker.com/engine/tutorials/dockervolumes/

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

推荐阅读更多精彩内容

  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,468评论 0 120
  • 以下原文转载于(https://docs.docker.com/docker-for-mac/)(想找中文版的最新...
    Veekend阅读 7,541评论 0 17
  • 五、Docker 端口映射 无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了...
    R_X阅读 1,734评论 0 7
  • 绿水映春雪,游廊凝新装; 八角亭中立,葱葱一抹红; 园中无人迹,苍翠舞枝漾; 六出飞花入,坐看青竹变。
    就爱嗑瓜子阅读 217评论 0 0
  • 不懂别人的生活 让它放肆流过 指尖的音符逝过 不会再贪恋人间烟火 让过去的就过去吧 逝过流走 没了就没了 过去以后...
    青天老帅锅阅读 185评论 0 1