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

把多个应用服务塞进一个 docker 容器里有没有意义

  •  
  •   CivAx · 2018-10-31 16:04:34 +08:00 · 15338 次点击
    这是一个创建于 2210 天前的主题,其中的信息可能已经有所发展或是发生改变。

    公司内部准备用 docker 逐步替换掉原本直接搭在 LVS 上的测试环境,将分散的物理机资源整合起来。

    按照我的思路,新拿一台 LVS 跑 docker,然后一个服务起一个容器,容器配好、互通正常,基本这活儿就算结了。

    结果今天突然来个需求,说让我把几个服务一起塞到一个容器里(譬如一个 container 里面同时跑 NGINX+MySQL+Tomcat )。

    单容器多服务这种做法到底有没有意义……我感觉这又回到 LVS 的形式上了。

    64 条回复    2018-11-03 06:57:24 +08:00
    JaguarJack
        1
    JaguarJack  
       2018-10-31 16:06:57 +08:00
    推荐一个 container 一个应用
    CivAx
        2
    CivAx  
    OP
       2018-10-31 16:08:35 +08:00
    @JaguarJack 对我也是这么认为的,但是应该怎么列举优势说服他?
    LoliconInside
        3
    LoliconInside  
       2018-10-31 16:09:22 +08:00   ❤️ 2
    @CivAx 一旦一个容器异常退出整个业务就全挂了 感觉只能这么和他说
    hoiyd
        4
    hoiyd  
       2018-10-31 16:11:08 +08:00
    你需要 kubernetes 的 pod
    nooper
        5
    nooper  
       2018-10-31 16:11:36 +08:00
    脑子为啥有问题,直接把服务干挂了。
    zpf124
        6
    zpf124  
       2018-10-31 16:11:54 +08:00
    单单 nginx + tomcat 我还能理解一些, 把 mysql 都加上就完全不应该了吧?
    Keria
        7
    Keria  
       2018-10-31 16:12:55 +08:00
    一些开源软件为了用户开箱即用把很多东西塞进一个容器,自己搭服务觉得没必要,有编排呀~
    ksco
        8
    ksco  
       2018-10-31 16:14:37 +08:00   ❤️ 3
    1. 更加易于横向扩展
    2. 更容易定位问题
    3. 更容易升级版本号
    4. 日志更加清晰明确
    ......
    helone
        9
    helone  
       2018-10-31 16:15:05 +08:00
    gitlab 官方也是这么封装的,其实无非就是一炸都炸和不方便扩展而已。。。
    xiqingongzi
        10
    xiqingongzi  
       2018-10-31 16:15:49 +08:00
    ngx + tomcat 问题不是很大。mysql 不应该。
    ixiaohei
        11
    ixiaohei  
       2018-10-31 16:19:13 +08:00   ❤️ 1
    你们需要 docker 编排和 k8s 这种东西。放一个容器,supervisor 一挂全部挂。另外水平扩展也是一起扩,反而没有体现 docker 的优势,轻量虚拟化和资源隔离。
    liuguang
        12
    liuguang  
       2018-10-31 16:35:24 +08:00
    当然是一个容器一个应用了,docker 如果发现了你的容器进程退出了,可以帮你自动重启。
    但是如果多个放在一个 container 里面,如果非主线程退出了,你完全不知道,docker 也不会认为你的容器有问题。
    fl2d
        13
    fl2d  
       2018-10-31 16:36:41 +08:00
    一损俱损 一荣俱荣
    JaguarJack
        14
    JaguarJack  
       2018-10-31 16:39:46 +08:00   ❤️ 1
    @CivAx 例如你有 php 和 java 两个 container 都需要连接 mysql 服务呢? mysql 难道打包两次吗
    kimqcn
        15
    kimqcn  
       2018-10-31 16:40:16 +08:00
    没啥问题啊,这仨东西都可以做成绿色版的,解压即用.放到一个容器里,可不考虑网络连接问题.
    wizardoz
        16
    wizardoz  
       2018-10-31 16:49:56 +08:00   ❤️ 1
    他是不是不知道 docker-compose ?
    whileFalse
        17
    whileFalse  
       2018-10-31 16:51:02 +08:00
    所以这个把所有东西揉一起的需求的目的是什么?
    zjsxwc
        18
    zjsxwc  
       2018-10-31 16:59:04 +08:00   ❤️ 1
    docker-compose +1
    fullpowers
        19
    fullpowers  
       2018-10-31 17:06:12 +08:00
    数据库放另外一个容器就行了,其它打包一起
    xenme
        20
    xenme  
       2018-10-31 17:09:16 +08:00
    想折腾,你都可以当成虚拟机用,打包一个配置啥的都简单,短期可能更快
    微服务化,单独打包,得考虑编排了,前期可能有人觉得复杂

    可以分步来么,不可能一口吃个胖子
    yule111222
        21
    yule111222  
       2018-10-31 17:18:23 +08:00
    没意义
    xuanbg
        22
    xuanbg  
       2018-10-31 17:46:51 +08:00
    没有意义,一个容器还是多个容器,差别仅仅是一点点磁盘空间罢了。
    sammo
        23
    sammo  
       2018-10-31 18:03:48 +08:00 via iPhone
    把 container 当一层 “普通 vps 的 linux 系统” 式的虚拟机嘛 ...
    Vhc
        24
    Vhc  
       2018-10-31 18:10:19 +08:00
    支持一楼
    likuku
        25
    likuku  
       2018-10-31 18:14:04 +08:00   ❤️ 2
    容器当虚拟机来用的典型案例
    CMGS
        26
    CMGS  
       2018-10-31 18:17:21 +08:00   ❤️ 3
    很简单。。
    你跟他说,你要塞,OK,你以哪个为主进程?
    多进程容器最大的问题是,从容器外部只看得到主进程的状态,容器本身生命周期是和主进程完全同步的。
    也就是说,要么你放弃子进程生命周期的控制,要么你自己实现子进程的监控重启各种生命周期的事情。
    既然要搞这么多幺蛾子,为啥不 vm+systemd 搞定一切……
    rogwan
        27
    rogwan  
       2018-10-31 18:22:30 +08:00 via Android
    @helone gitlab 这么做情有可原,毕竟从头开始配好 gitlab 很多人就放弃了
    kidlj
        28
    kidlj  
       2018-10-31 18:30:41 +08:00 via iPhone
    Docker by design 一个容器一个进程。
    slaneyang
        29
    slaneyang  
       2018-10-31 19:30:41 +08:00
    docker-compose ++
    CuminLo
        30
    CuminLo  
       2018-10-31 19:43:43 +08:00
    既然是用与测试环境,这个问题应该不大吧,主要是你想不想的问题了。
    NUT
        31
    NUT  
       2018-10-31 19:46:21 +08:00
    docker 的本质是进程。除了主进程其他进程都是野孩子。所以你需要容器编排。k8s 的 pod 可以搞成多容器的,如果有启动顺序要求可以试试 statusfulset 这个玩意。
    lihongjie0209
        32
    lihongjie0209  
       2018-10-31 19:50:56 +08:00
    k8s 吧
    kaneg
        33
    kaneg  
       2018-10-31 20:40:22 +08:00 via iPhone   ❤️ 1
    用它来搭建测试环境,用来简化部署和测试的效率,那就越简单越好,做到傻瓜式的开箱即用,所有的服务都打到一起是很好的选择。当然再进一步用 docker compose 也是很不错的,至于 k8s 在这种场景下就有点大炮打蚊子了
    beginor
        34
    beginor  
       2018-10-31 21:30:56 +08:00 via Android
    如果你的产品安装复杂,可以简化安装,比如 gitlab
    Tink
        35
    Tink  
       2018-10-31 21:45:36 +08:00 via iPhone
    这个东西得辩证来看
    lfzyx
        36
    lfzyx  
       2018-10-31 23:09:07 +08:00
    如果你是要把分散的服务器资源整合起来,那用 k8s 就非常适合了,然后 k8s 里的 pod 也是可以包含多个 container 的,非常符合几个服务一起塞到一个 pod 里的需求
    liukanshan
        37
    liukanshan  
       2018-11-01 00:20:38 +08:00
    不太明白把所有应用塞进一个容器的做法 docker-compse 就是为了解决这种情况的 也许这种方式更适合 vagrant。
    ooh
        38
    ooh  
       2018-11-01 03:40:13 +08:00 via Android
    解耦,三个应用想不清楚就幻想三百个应用
    binux
        39
    binux  
       2018-11-01 03:53:16 +08:00
    测试环境这么搞没毛病啊,难道你测试环境还需要跑 300 个应用负载均衡吗?
    测试环境这么搞的好处就是开箱即用,可以同时跑多个测试环境,然后玩坏了直接干掉重建就好了。挂就挂了呗,测试环境哪来的业务啊。
    thrall
        40
    thrall  
       2018-11-01 05:06:20 +08:00
    测试环境就打包到一起没什么问题
    vindurriel
        41
    vindurriel  
       2018-11-01 06:50:28 +08:00 via iPhone
    一个 container 一个进程 容器编排服务一般是这么假设的
    duhongle
        42
    duhongle  
       2018-11-01 08:54:46 +08:00
    推荐使用 docker-compose,nginx,tomcat,mysql 还是分开部署比较好
    bayker
        43
    bayker  
       2018-11-01 09:01:12 +08:00
    请问为啥要放一起?给个理由。感觉没有任何理由能说服我放到一个容器里。
    shylockhg
        44
    shylockhg  
       2018-11-01 09:03:08 +08:00
    你这样一个容器没法编排。。一炸全炸
    liuyanjun0826
        45
    liuyanjun0826  
       2018-11-01 09:04:17 +08:00
    象征意义大于实际意义
    thisisgpy
        46
    thisisgpy  
       2018-11-01 09:23:23 +08:00
    简单来说,你把所有东西 run 在一个容器里,如果容器里的 mysql 有容器外的应用也在用,那你升级你的应用重启容器时,所有依赖容器内 mysql 的服务都会瘦影响。
    lrh3321
        47
    lrh3321  
       2018-11-01 09:34:12 +08:00
    组成一个整体,里面只对外开放一个应用服务的时候也不是不行。
    mortonnex
        48
    mortonnex  
       2018-11-01 09:38:24 +08:00
    docker-compose 完美解决
    tcsky
        49
    tcsky  
       2018-11-01 09:39:38 +08:00
    测试环境完全还可以啊, 开发测试维护起来都很方便
    xiaoxinshiwo
        50
    xiaoxinshiwo  
       2018-11-01 09:45:03 +08:00
    个人觉得不合适,容器的一大特点就是隔离性啊
    Outshine
        51
    Outshine  
       2018-11-01 09:49:04 +08:00
    提需求的人明显不懂 docker 的意义,放在一个 container 里和现在有啥区别么?反而还加了一层。
    tailf
        52
    tailf  
       2018-11-01 10:16:07 +08:00
    跟他们说性能有问题,docker 的 tcp-proxy 对应用内大流量的支持不足
    momocraft
        53
    momocraft  
       2018-11-01 10:20:21 +08:00
    给不会的人用时有意义 (一行 docker run 能启动全套服务)

    会用 docker-compose / k8s 这些东西时就多余了
    kangkang
        54
    kangkang  
       2018-11-01 10:29:18 +08:00
    不要把鸡蛋都放在一个篮子里
    MarioxLinux
        55
    MarioxLinux  
       2018-11-01 11:37:32 +08:00
    作为运维我不会这样做,因为这和传统的部署方式并没太大差别,一定要说有没有意义,对开发来说是有意义的好处是可以在开发调试过程中更便捷
    CoderGeek
        56
    CoderGeek  
       2018-11-01 15:16:55 +08:00
    k8s docker
    artandlol
        57
    artandlol  
       2018-11-01 15:26:09 +08:00
    yaml 配置文件语言的兴起,可以让程序自动配置 yaml 编排更加智能化
    小巧 隔离是容器的特点,塞进去除了能玩一玩没别的好处
    我这个容器就塞进去很多,rootfs 挺好的,push 容器时可以不用上传全部
    https://hub.docker.com/r/jingslunt/linux/
    eas
        58
    eas  
       2018-11-01 15:29:14 +08:00
    没有意义
    skylancer
        59
    skylancer  
       2018-11-01 16:18:03 +08:00
    意义就是
    1. 懒人的超快速部署(呵呵)
    2. 给新手学习的包
    3. 闲得蛋疼或者是傻子
    xiaoyunwei2
        60
    xiaoyunwei2  
       2018-11-01 16:20:14 +08:00
    测试环境 随便搞咯
    ray1888
        61
    ray1888  
       2018-11-01 17:58:57 +08:00
    你就每个进程开一个容器,用一个 docker-compose 拉起来不就可以了? 如果不用 K8s 的情况下
    tabris17
        62
    tabris17  
       2018-11-01 18:02:23 +08:00
    如果不打算扩容也无所谓了
    lionseun
        63
    lionseun  
       2018-11-02 09:14:02 +08:00 via Android
    那还用 dock er 干嘛?
    huobazi
        64
    huobazi  
       2018-11-03 06:57:24 +08:00 via iPhone
    觉得省空间?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1885 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 32ms · UTC 16:33 · PVG 00:33 · LAX 08:33 · JFK 11:33
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.