请教 Docker 正确的使用姿势...

2015-06-09 12:00:32 +08:00
 mhycy

Docker是个好东西,能用极少的系统资源消耗获得一个干净的系统.
但是Docker同时让人感到困惑.
看上去官方的推荐用法是一个Docker运行一个服务,多个Docker联合组成一个对外的应用.

例如:
使用Dockerfile构建
Web, DB, Nginx三个服务分别分布在3个Docker镜像.
通过卷挂载的形式,把外部的数据引入到容器中实现数据持久化.
运行容器,并使用内部互连的方式实现数据交互.容器之间只有网络对接.
各个子系统间实现高度的隔离与解耦.

很美好的做法, 但是Docker的容器并不保存任何数据, 重启后就会丢失.
这意味着即便是一个配置文件,一个额外添加的包,也是需要从外部卷引入.
(或者配置或添加一个额外的扩展的时候重新封装成新的镜像,并使用这个镜像运行)

没感觉到这做法和传统的虚拟机+快照除了资源占用以外有什么别的优势...
官方并不推荐在Docker里面运行bash,而所有的数据都运行在外部卷.
而这个外部的卷是个文件夹,而不是一个单一的文件.
(单一的文件或者少数的文件在分布式部署的时候有优势..)

现在纠结在于,Docker在生产环境中是如何应用的...
而在测试环境又是如何应用的...
Docker一个容器运行一个进程,通过网络对接的方式是解耦了.
但貌似官方并没提供一个方式能简单快捷的把一堆容器作为一个整体的服务来看待.

请教各位, Docker正确的使用姿势是怎样的?

7460 次点击
所在节点    Docker
15 条回复
min
2015-06-09 12:08:05 +08:00
怎么把多个虚拟机整合成一个整体的服务要看你的代码还有配置
代码和配置是放在source control system中的
启动一堆容器的时候把编译好的binary和配置一起送到虚拟机里面去,他们就自动变成一个整体的服务的组成部分了
9hills
2015-06-09 12:09:06 +08:00
重启不会丢,删除重建才会丢
9hills
2015-06-09 12:10:22 +08:00
另外外部卷支持文件盘。还是先熟悉下吧
johnsmith123
2015-06-09 12:25:50 +08:00
yum remove docker-io
rpm -e docker-io
rm -rf /var/lib/docker
HowardMei
2015-06-09 12:33:55 +08:00
Docker Best practice 还没有公论,但是官方提倡的One proc per container 目前只有Coreos用systemd实现了,而且他们还在搞自己的RKT,直接在其它主流OS里照搬并不好用,像Kubernetes这样的外部管理工具都还在开发中,且K在底层实现上比较依赖GCE平台特性,另外像Mesosphere也支持Docker管理,但也在初级阶段。

持久数据管理,有flocker & codexd之类,但我觉得数据库还是搞成RDS那样的独立服务比较好,用Docker比较蛋疼,最起码目前Volume管理就很鸡肋。网络拓扑之类的,就更不用说了,也就Coreos的flannel解决得好点。

于是,至今的公开主流用法是把它当轻量级VM部署工具用,内部多进程外部放数据,不讲究的用supervisor,讲究点的用runit/s6之类管理,然后用etcd/consul进行动态参数配置,用fig/compose或者docker-in-docker组合容器形成应用。

用在生产环境,坑点是不少的,自有管理工具开发有蛮多开源项目参考,慢慢摸索就是了。
mhycy
2015-06-09 13:28:41 +08:00
@min 的确这也是办法之一,只是步骤略多...

@9hills 的确还要再次熟悉...囧,谢谢提醒~

@HowardMei 非常感谢!极其有意义的回复.学了不少.
看样子生产环境还是不太推荐用docker啊.
说回来,生产环境中打包分发运行环境,使用Vagrant可能会是一个更好的选择么?
9hills
2015-06-09 14:32:42 +08:00
@mhycy 生产环境不是不推荐,但如果没有解决坑的技术能力,就不要上生产。
eriale
2015-06-09 14:40:06 +08:00
pull镜像的时候网速太慢怎么办?我现在调试的时候只能用国外的VPS。国内的网络环境用了daocloud还是慢。
mhycy
2015-06-09 15:02:22 +08:00
@eriale 自建一个镜像...
@9hills 即便有解决坑的能力但也要有那个时间才行.
看来生产环境暂时还是用成熟的虚拟机方案比较好.

不知道Vagrant如何?感觉那个有点像是一个虚拟机构建/管理工具...
helone
2015-06-09 15:37:30 +08:00
@mhycy
Vagrant 是开发环境用的,解决了开发下与线上系统和软件统一的问题,不推荐用作生产环境
Docker 是生产环境用的,类似GAE、BAE、SAE这种都是用的这种方式隔离用户的,当然可以有更多姿势来用
mhycy
2015-06-09 16:02:51 +08:00
@helone
为何更加灵活的Vagrant反倒更不适合做生产环境呢?因为资源消耗更多?
Docker暂时没找到有啥好的姿势在生产环境上用, 看着是不错.
但貌似也没一个好用的管理工具...
helone
2015-06-09 17:07:26 +08:00
@mhycy Vargrant依赖的是虚拟机软件,Vmware、PD、Vbox...
mhycy
2015-06-09 17:17:34 +08:00
@helone
感觉Vargrant更像是一个管理工具...
使用脚本方式快速部署的一个管理工具...
cxshun
2015-06-09 17:19:45 +08:00
如果你每次都通过dockerfile来创建,那肯定数据就没了,每次都是一个新的image,你应该只创建一次,之后提交更新到image,之后就直接run那个image就行了。

我是不大习惯用dockerfile,我喜欢一个原生image,然后自己commit需要的东西。但官网是建议用dockerfile,我觉得各有各好处了。
cszhiyue
2015-06-09 17:25:55 +08:00
之前使用fig 来管理一堆容器的关系的启动。。现在使用compose。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/197173

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX