到今朝我们引见了一些Docker的根底观点, 晓得了怎么运用Docker的image, 也晓得了怎么在多个container间经过收集通信. 在这章里我们将引见怎么在docker的container内管理数据和怎么在分歧的container间同享数据。
我们将引见两种首要的在docker中管理数据的办法:
Data volumes
Data volume container
一个 data volume 就是一个在一个或许多个container里的特别用处的目次。它绕过了 Union File System (译者: 这里不断定, 需求研讨)为耐久化数据、同享数据供给了下面这一些有效的特征:
Data volumes 可以在分歧的container之间同享和重用数据
对 Data volume 的修正实时生效(译者:data volumn是一个目次, 多个container都挂载这个目次, 详细的可以经过 docker inspect 看 volumne的信息)
对 data volume 修正内容在晋级image的时分不会被包含出来 (译者:在docker的全部设计中image是一个无形态的, 如许对晋级重用十分有益。而标志形态的数据, 比方数据库的数据, 生产的log之类的应当放到volume里。volume的耐久化和恢复鄙人面有引见, 是经过文件的方式的, 而不是经过image)
Volumes 的耐久化直到没有container运用他们
你可以在docker run 的时分运用 -v 来添加一个 data volume。这个参数在docker run 的时分可以屡次运用来添加多个 data volumes。让我们为我们的web application container挂载一个 volume。
$ sudo docker run -d -P --name web -v /webapp training/webapp python app.py
这里一个新的volume会创立到container里的 /webapp. (译者:假如你经过ssh或许经过 -i 登岸到你的container的一个shell里, 运用 ls /webapp 可以验证挂载成功了)
留意: 你也能够在Dockerfile里添加 VOLUME 字段,如许在创立一个新的image的 container是就会主动的创立新的volume.
运用 -v 不只能创立一个新的 volume, 还可以把宿主机一个目次mount到container里。
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp training/webapp python app.py
这条号令会把当地目次 /src/webapp mount到container里的 /opt/webapp 目次上。用这个办法来测试顺序十分便利, 比方我们可以把我们的源代码经过这个办法mount到container里, 修正当地代码后立刻就能够看到修正后的代码是怎么在container里任务的了。宿主机的目次必需是绝对途径, 假如这个目次不存在docker会为你主动创立。
留意 这里是没法用 Dockerfile完成的, 由于如许的用法有悖于可移植性和同享. 由于当地目次就像他名字通知我们的, 是和当地相干的, 纷歧定可以在一切的宿主机上任务.(译者: 鬼晓得你在运用image的时分的host是啥模样的)
Docker默许设置volume是可读写的,可是我们也能够mount一个目次为只读:
$ sudo docker run -d -P --name web -v /src/webapp:/opt/webapp:ro training/webapp python app.py
这里我们异样mount了 /src/webapp 目次, 可是我们加入了 ro 参数, 通知docker这个volume是只读的.
假如你有一些耐久化的数据, 而且想在分歧的container之间同享这些数据, 或许想在一些没有耐久化的container中运用, 最好的办法就是运用 Data Volumn Container, 在把数据mount到你的container里.(译者:如开篇译者提到的docker的container是无形态的, 也就是说标志形态的数据,例如:数据库数据, 使用顺序的log 等等, 是不该该放到container里的, 而是放到 Data Volume Container里, 这点和funcational programming很像, 所以我爱好把普通的docker container 叫做 functional container用来辨别 data volume container )
让我们创立一个著名字的 Data Volume Container 来同享数据.
$ docker run -d -v /dbdata --name dbdata training/postgres
如许做以后就能够经过 --volumes-from 把 /dbdata mount到其他的container里了
$ docker run -d --volumes-from dbdata --name db1 training/postgres
还可以继续同享到别的一个container里
$ docker run -d --volumes-from dbdata --name db2 training/postgres
-volumes-from 可以屡次运用来 mount 多个conatainer里的多个volumes。
这个操作是链式的, 我们在db1 中经过 --volumes-from mount出去的 volume可以继续被其他container运用
$ docker run -d --name db3 --volumes-from db1 training/postgres
(译者: 这里我们不是间接运用 volume container, 而是运用db1 这个functional container 把volume 挂载到别的一个 funcational container上的,所谓的链式就是 dbdata -> db1 -> db3)
假如你把一切mount volumes的container都移除掉, 包含初始化的阿谁 dbdata container, volume才会被移除掉。经过这个属性可以便利的晋级晋级数据或许在分歧container间migrate数据.
Volume的别的一个用途就是备份、恢复和migrate数据。 详细的做法以下,运用 --volumes-from 来创立一个新的container mount这个volume
$ sudo docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata
> 这里我们启动了一个新的container, 从 dbdata 挂载了一个volume。同时挂载了一个当地目次到这个container里。最初我们经过一个 tar号令把 dbdata 里的数据备份到了 /backup 里。号令完毕而且中止这个container后我们就在当地失掉了一个备份的数据.
(译者: 这里运用的 ubuntu container, 就是为了把volume中的数据打包备份到host的某一个目次里。)
备份的数据可以恢复到这个container, 或许其他运用这个volume的container。起首创立一个container
$ sudo docker run -v /dbdata --name dbdata2 ubuntu
> 以后un-tar备份文件到 data volume 里
$ sudo docker run --volumes-from dbdata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
你可使用你爱好的Tools加入上面的技术来主动备份,迁徙和恢单数据
本文中的一切译文仅用于进修和交换目标,转载请务必注明文章译者、出处、和本文链接。 2KB翻译任务按照 CC 协议,假如我们的任务有进犯到您的权益,请实时联络我们。2KB项目(www.2kb.com,源码交易平台),提供担保交易、源码交易、虚拟商品、在家创业、在线创业、任务交易、网站设计、软件设计、网络兼职、站长交易、域名交易、链接买卖、网站交易、广告买卖、站长培训、建站美工等服务