Docker 单应用单服务与单应用多服务

分类:Docker |

关于docker 一直有一个疑问就是使用 Docker 单应用单服务 还是使用单应用多服务

单乃就单服务时如何更好的协调多个docker之间的关系, 研发人员的使用复杂度是不是增加了...?

单应用多服务, 像是一个大的容器, 开箱即用, 方便简单, 但和vm又有什么区别呢, 一个server上起多个docker怎么用呢, 扩展时一起扩展...?

如下 本身就是单应用多服务吧:

image.png


明显的提出一个概念, 为解决这个概念上的问题, 又提出新的概念: 管理的复杂度..

image.png

---------------------------------------------------------------------

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


这是一个创建于 712 天前的主题,其中的信息可能已经有所发展或是发生改变。

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


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


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


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


lvs Docker 容器 MySQL64 条回复  •  2018-11-03 06:57:24 +08:00
JaguarJack   2018-10-31 16:06:57 +08:00
推荐一个 container 一个应用
CivAx   2018-10-31 16:08:35 +08:00
@JaguarJack 对我也是这么认为的,但是应该怎么列举优势说服他?
LoliconInside   2018-10-31 16:09:22 +08:00   ❤️ 2
@CivAx 一旦一个容器异常退出整个业务就全挂了 感觉只能这么和他说
hoiyd   2018-10-31 16:11:08 +08:00
你需要 kubernetes 的 pod
nooper   2018-10-31 16:11:36 +08:00
脑子为啥有问题,直接把服务干挂了。
zpf124   2018-10-31 16:11:54 +08:00
单单 nginx + tomcat 我还能理解一些, 把 mysql 都加上就完全不应该了吧?
Keria   2018-10-31 16:12:55 +08:00
一些开源软件为了用户开箱即用把很多东西塞进一个容器,自己搭服务觉得没必要,有编排呀~
ksco   2018-10-31 16:14:37 +08:00   ❤️ 3
1. 更加易于横向扩展
2. 更容易定位问题
3. 更容易升级版本号
4. 日志更加清晰明确
......
helone   2018-10-31 16:15:05 +08:00
gitlab 官方也是这么封装的,其实无非就是一炸都炸和不方便扩展而已。。。
xiqingongzi   2018-10-31 16:15:49 +08:00
ngx + tomcat 问题不是很大。mysql 不应该。
 
ixiaohei   2018-10-31 16:19:13 +08:00   ❤️ 1
你们需要 docker 编排和 k8s 这种东西。放一个容器,supervisor 一挂全部挂。另外水平扩展也是一起扩,反而没有体现 docker 的优势,轻量虚拟化和资源隔离。
liuguang   2018-10-31 16:35:24 +08:00
当然是一个容器一个应用了,docker 如果发现了你的容器进程退出了,可以帮你自动重启。
但是如果多个放在一个 container 里面,如果非主线程退出了,你完全不知道,docker 也不会认为你的容器有问题。
fl2d   2018-10-31 16:36:41 +08:00
一损俱损 一荣俱荣
JaguarJack   2018-10-31 16:39:46 +08:00   ❤️ 1
@CivAx 例如你有 php 和 java 两个 container 都需要连接 mysql 服务呢? mysql 难道打包两次吗
kimqcn   2018-10-31 16:40:16 +08:00
没啥问题啊,这仨东西都可以做成绿色版的,解压即用.放到一个容器里,可不考虑网络连接问题.
wizardoz   2018-10-31 16:49:56 +08:00   ❤️ 1
他是不是不知道 docker-compose ?
whileFalse   2018-10-31 16:51:02 +08:00
所以这个把所有东西揉一起的需求的目的是什么?
zjsxwc   2018-10-31 16:59:04 +08:00   ❤️ 1
docker-compose +1
fullpowers   2018-10-31 17:06:12 +08:00
数据库放另外一个容器就行了,其它打包一起
xenme   2018-10-31 17:09:16 +08:00
想折腾,你都可以当成虚拟机用,打包一个配置啥的都简单,短期可能更快
微服务化,单独打包,得考虑编排了,前期可能有人觉得复杂
可以分步来么,不可能一口吃个胖子
yule111222   2018-10-31 17:18:23 +08:00
没意义
xuanbg   2018-10-31 17:46:51 +08:00
没有意义,一个容器还是多个容器,差别仅仅是一点点磁盘空间罢了。
sammo   2018-10-31 18:03:48 +08:00 via iPhone
把 container 当一层 “普通 vps 的 linux 系统” 式的虚拟机嘛 ...
Vhc   2018-10-31 18:10:19 +08:00
支持一楼
likuku   2018-10-31 18:14:04 +08:00   ❤️ 2
容器当虚拟机来用的典型案例
CMGS   2018-10-31 18:17:21 +08:00   ❤️ 3
很简单。。
你跟他说,你要塞,OK,你以哪个为主进程?
多进程容器最大的问题是,从容器外部只看得到主进程的状态,容器本身生命周期是和主进程完全同步的。
也就是说,要么你放弃子进程生命周期的控制,要么你自己实现子进程的监控重启各种生命周期的事情。
既然要搞这么多幺蛾子,为啥不 vm+systemd 搞定一切……
rogwan   2018-10-31 18:22:30 +08:00 via Android
@helone gitlab 这么做情有可原,毕竟从头开始配好 gitlab 很多人就放弃了
kidlj   2018-10-31 18:30:41 +08:00 via iPhone
Docker by design 一个容器一个进程。
slaneyang   2018-10-31 19:30:41 +08:00
docker-compose ++
CuminLo   2018-10-31 19:43:43 +08:00
既然是用与测试环境,这个问题应该不大吧,主要是你想不想的问题了。
NUT   2018-10-31 19:46:21 +08:00
docker 的本质是进程。除了主进程其他进程都是野孩子。所以你需要容器编排。k8s 的 pod 可以搞成多容器的,如果有启动顺序要求可以试试 statusfulset 这个玩意。
lihongjie0209   2018-10-31 19:50:56 +08:00
k8s 吧
kaneg   2018-10-31 20:40:22 +08:00 via iPhone
用它来搭建测试环境,用来简化部署和测试的效率,那就越简单越好,做到傻瓜式的开箱即用,所有的服务都打到一起是很好的选择。当然再进一步用 docker compose 也是很不错的,至于 k8s 在这种场景下就有点大炮打蚊子了
beginor   2018-10-31 21:30:56 +08:00 via Android
如果你的产品安装复杂,可以简化安装,比如 gitlab
Tink   2018-10-31 21:45:36 +08:00 via iPhone
这个东西得辩证来看
lfzyx   2018-10-31 23:09:07 +08:00
如果你是要把分散的服务器资源整合起来,那用 k8s 就非常适合了,然后 k8s 里的 pod 也是可以包含多个 container 的,非常符合几个服务一起塞到一个 pod 里的需求
liukanshan   2018-11-01 00:20:38 +08:00
不太明白把所有应用塞进一个容器的做法 docker-compse 就是为了解决这种情况的 也许这种方式更适合 vagrant。
ooh   2018-11-01 03:40:13 +08:00 via Android
解耦,三个应用想不清楚就幻想三百个应用
binux   2018-11-01 03:53:16 +08:00
测试环境这么搞没毛病啊,难道你测试环境还需要跑 300 个应用负载均衡吗?
测试环境这么搞的好处就是开箱即用,可以同时跑多个测试环境,然后玩坏了直接干掉重建就好了。挂就挂了呗,测试环境哪来的业务啊。
thrall   2018-11-01 05:06:20 +08:00
测试环境就打包到一起没什么问题
vindurriel   2018-11-01 06:50:28 +08:00 via iPhone
一个 container 一个进程 容器编排服务一般是这么假设的
duhongle   2018-11-01 08:54:46 +08:00
推荐使用 docker-compose,nginx,tomcat,mysql 还是分开部署比较好
bayker   2018-11-01 09:01:12 +08:00
请问为啥要放一起?给个理由。感觉没有任何理由能说服我放到一个容器里。
shylockhg   2018-11-01 09:03:08 +08:00
你这样一个容器没法编排。。一炸全炸
liuyanjun0826   2018-11-01 09:04:17 +08:00
象征意义大于实际意义
thisisgpy   2018-11-01 09:23:23 +08:00
简单来说,你把所有东西 run 在一个容器里,如果容器里的 mysql 有容器外的应用也在用,那你升级你的应用重启容器时,所有依赖容器内 mysql 的服务都会瘦影响。
lrh3321   2018-11-01 09:34:12 +08:00
组成一个整体,里面只对外开放一个应用服务的时候也不是不行。
mortonnex   2018-11-01 09:38:24 +08:00
docker-compose 完美解决
tcsky   2018-11-01 09:39:38 +08:00
测试环境完全还可以啊, 开发测试维护起来都很方便
xiaoxinshiwo   2018-11-01 09:45:03 +08:00
个人觉得不合适,容器的一大特点就是隔离性啊
Outshine   2018-11-01 09:49:04 +08:00
提需求的人明显不懂 docker 的意义,放在一个 container 里和现在有啥区别么?反而还加了一层。
tailf   2018-11-01 10:16:07 +08:00
跟他们说性能有问题,docker 的 tcp-proxy 对应用内大流量的支持不足
momocraft   2018-11-01 10:20:21 +08:00
给不会的人用时有意义 (一行 docker run 能启动全套服务)
会用 docker-compose / k8s 这些东西时就多余了
kangkang   2018-11-01 10:29:18 +08:00
不要把鸡蛋都放在一个篮子里
MarioxLinux   2018-11-01 11:37:32 +08:00
作为运维我不会这样做,因为这和传统的部署方式并没太大差别,一定要说有没有意义,对开发来说是有意义的好处是可以在开发调试过程中更便捷
CoderGeek   2018-11-01 15:16:55 +08:00
k8s docker
artandlol   2018-11-01 15:26:09 +08:00
yaml 配置文件语言的兴起,可以让程序自动配置 yaml 编排更加智能化
小巧 隔离是容器的特点,塞进去除了能玩一玩没别的好处
我这个容器就塞进去很多,rootfs 挺好的,push 容器时可以不用上传全部
https://hub.docker.com/r/jingslunt/linux/
eas   2018-11-01 15:29:14 +08:00
没有意义
skylancer   2018-11-01 16:18:03 +08:00
意义就是
1. 懒人的超快速部署(呵呵)
2. 给新手学习的包
3. 闲得蛋疼或者是傻子
xiaoyunwei2   2018-11-01 16:20:14 +08:00
测试环境 随便搞咯
ray1888   2018-11-01 17:58:57 +08:00
你就每个进程开一个容器,用一个 docker-compose 拉起来不就可以了? 如果不用 K8s 的情况下
tabris17   2018-11-01 18:02:23 +08:00
如果不打算扩容也无所谓了
lionseun   2018-11-02 09:14:02 +08:00 via Android
那还用 dock er 干嘛?
huobazi   2018-11-03 06:57:24 +08:00 via iPhone
觉得省空间?

from https://www.v2ex.com/t/503058