V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
mhycy
V2EX  ›  Docker

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

  •  
  •   mhycy · 2015-06-09 12:00:32 +08:00 · 7455 次点击
    这是一个创建于 3485 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

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

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

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

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

    15 条回复    2015-06-09 17:25:55 +08:00
    min
        1
    min  
       2015-06-09 12:08:05 +08:00   ❤️ 1
    怎么把多个虚拟机整合成一个整体的服务要看你的代码还有配置
    代码和配置是放在source control system中的
    启动一堆容器的时候把编译好的binary和配置一起送到虚拟机里面去,他们就自动变成一个整体的服务的组成部分了
    9hills
        2
    9hills  
       2015-06-09 12:09:06 +08:00 via iPhone   ❤️ 1
    重启不会丢,删除重建才会丢
    9hills
        3
    9hills  
       2015-06-09 12:10:22 +08:00 via iPhone   ❤️ 1
    另外外部卷支持文件盘。还是先熟悉下吧
    johnsmith123
        4
    johnsmith123  
       2015-06-09 12:25:50 +08:00   ❤️ 1
    yum remove docker-io
    rpm -e docker-io
    rm -rf /var/lib/docker
    HowardMei
        5
    HowardMei  
       2015-06-09 12:33:55 +08:00   ❤️ 2
    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
        6
    mhycy  
    OP
       2015-06-09 13:28:41 +08:00
    @min 的确这也是办法之一,只是步骤略多...

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

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

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

    我是不大习惯用dockerfile,我喜欢一个原生image,然后自己commit需要的东西。但官网是建议用dockerfile,我觉得各有各好处了。
    cszhiyue
        15
    cszhiyue  
       2015-06-09 17:25:55 +08:00
    之前使用fig 来管理一堆容器的关系的启动。。现在使用compose。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3119 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 13:15 · PVG 21:15 · LAX 05:15 · JFK 08:15
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.