不是很明白为什么必须前台,如果有的进程就是只能后台启动的,那怎么办呢?
1
FinnBai Mar 19, 2021
没有进程容器不就停止了吗。可以启用一个类似监控或者管理的进程来保持容器运行。
|
3
binux Mar 19, 2021 via Android
没前台那就 waitpid 呗
|
5
whileFalse Mar 19, 2021
请详述场景。我觉得你对容器的使用方法不太正确。
--------------------- 虽然容器能像完整的虚拟机那样运行一堆进程,但容器本身的设计理念是仅运行单个任务;如果有多个任务,则应拆成多个容器。那么容器本身的生命周期应该和该单个任务的生命周期相同。即这个任务进程退出,容器也就退出了。 如果容器的主要任务是个后台进程,那么你的主进程应该监视该后台进程的执行情况,等待该后台进程退出后主进程也退出。 |
6
whileFalse Mar 19, 2021 @zhoudaiyu 我觉得容器里装 supervisor 就是属于滥用容器。
|
7
noqwerty Mar 19, 2021 via Android
容器里又套一个 supervisor 是啥操作…
|
8
Tink PRO 同楼上,还在 container 里面用 supervisor 确实有点搞事情
|
9
UN2758 Mar 19, 2021
同问这是啥操作,有什么动机吗
|
10
zhoudaiyu OP PRO @whileFalse
@noqwerty @Tink @UN2758 你说的是对的,应该拆成多个 container,比如 containerA 和 containerB,但是我们现在的场景是:containerA 想对 containerB 的进程操作,我们用的超低版本的 k8 是不支持进程空间共享的,所以弄了一个 supervisor 能管理多个进程 |
11
claymore94 Mar 19, 2021
我猜你是偏传统企业,我们也有个容器里面用 supervisor 管理两个进程
|
12
zhoudaiyu OP PRO @claymore94 其实主进程就是一个 tomcat,但是有一些辅助进程需要按需启动
|
13
claymore94 Mar 19, 2021
这样,容器的 entrypoint 可以是一个 sh 脚本,脚本最后 supervisord -c /etc/supervisord.conf, /usr/bin/tail -f /dev/null,容器不退出就可以了,方式有很多
|
14
ljhrot Mar 19, 2021
当你为了容器化而容器化的时候,各种各样的问题就会接踵而来,在不知不觉投入的成本已经超过了容器化带来的好处
|
15
Tink PRO @zhoudaiyu 你只要保证容器不死就行了对不,container 启动脚本你先启动你要用的进程,然后再起一个不死进程就行了
|
16
CallMeReznov Mar 19, 2021 |
17
coderxy Mar 19, 2021
这不是 k8s 的要求,这是 docker 的要求。
|
18
gesse Mar 19, 2021
container 里用 supervisor 是什么操作? supervisor 的每一个子进程都需要单独放入一个容器做前台进程。
|
21
orcusfox Mar 19, 2021 via iPhone
所以有时候有人用 tail -f /dev/null
|
23
HarrisonZ Mar 19, 2021
看看容器基础,还有能不能不要一提容器就是 docker,docker 只是降低了容器技术的门槛,做的易用了而已
|
25
killva4624 Mar 19, 2021
我的理解:K8S 的设计就是为了解决容器生命周期问题。"主进程即容器"这样的概念可以把主进程精确到单个容器的颗粒度来管理。换句话说,如果你想在容器里跑后台进程,那么就需要另外一套机制来确保后台进程的生命周期(比如怎么启动后台进程,怎么确保后台进程存活),用 supervisor 或者 systemd 之类大部分是非云原生系统上云时候的过渡方案(又不想花精力做微服务拆分,又想容器化)。
阿里还专门弄了个富容器的概念,也是盯准了有这类需求的客户。 https://study.congcong.us/t/454943 https://www.jianshu.com/p/d7dbeffc2dff 从技术的角度,我不喜欢这种做法,非常别扭。但从商业角度来看,是一种很 lazy 又讨巧的上云方案。 |
26
wxsm Mar 19, 2021
你完全可以用 nohup 将某些进程后台运行,只要保证有一个进程前台运行即可,当然容器的健康与否只会关注前台进程,后台进程出现的问题自理。
|
27
GM Mar 19, 2021
@whileFalse 并不算滥用,有些情况下很方便的。
|
28
rrfeng Mar 19, 2021
容器 == 一个具有隔离空间的进程
进程结束 == 容器死亡 这没什么好争的。 |
29
killva4624 Mar 19, 2021
P 个 S:比如 C++ 里 MCP 框架用共享内存做 MQ 这种玩意……
|
30
1daydayde Mar 19, 2021 via iPhone
一个 pod 里面可以有多个容器
|
31
4BVL25L90W260T9U Mar 19, 2021 Container 本身就是 Process Container 的缩写,是为一个进程创建的隔离环境。Process 之不存,Container 将焉附?
打个比方,进程好比人,容器好比一条裤子。人穿上裤子,裤子就跟着站了起来。离了人,裤子当然自己不可能自己站起来了。同时,如果我们看到裤子摊在地上,那可以知道里面一定没藏着人。你在容器里面跑 supervisord / nohup / systemd 这种操作就相当于拿根棍子把裤子强行撑了起来,可能你看着裤子站着呢,但是里面的人已经挂了。 如果想运行多个进程,docker-compose 不香么? |
32
lfzyx Mar 19, 2021
为啥不招个 devops 做这事呢
|
33
ch2 Mar 20, 2021 via iPhone
docker 的本质是一个或者一组进程,如果所有进程都死了,docker 本身也没有存续的必要了
|
34
raven2019 Mar 20, 2021
对于一个 java 进程的容器,想要方便的通过 ssh 远程登录上去,除了在容器里通过 supervisord 启动一个 sshd 进程,还有其他方式吗
|
36
loveyu Mar 20, 2021 via Android
PHP 用 supervisor 上云就挺好的
|
39
whileFalse Mar 22, 2021
@raven2019 “通过 SSH 登陆容器”就不是正常方式。
|
40
whileFalse Mar 22, 2021
@GM 你当然可以举出一个“在容器中使用 Supervisor 很方便”的场景。
但容器就不是为你的这个场景设计的,所以这种用法也必然会带来不方便的地方。 如果又要用 supervisor,又难以承受带来的不便(像 lz 这样),那就叫滥用。 |
41
julyclyde Mar 22, 2021
依靠 SIGCHLD 来检测容器内的程序有没有退出
如果退出就要做后续扫尾动作了 |
42
julyclyde Mar 22, 2021
@killva4624 暴露了暴露了!
|
43
julyclyde Mar 22, 2021
|
44
byzf Mar 22, 2021
否则容器运行时依靠什么来判断容器有没有结束。
|
45
dabney777 Mar 22, 2021
@ospider 如果更新了一段代码导致 core dump 了,supervisor 会一直重启进程,这时候登录进去看日志很容易查看日志。如果主进程就是新写的进程的话,容器会一直重启,也看不到报错
|
47
zhoudaiyu OP PRO @joesonw 老哥 说到隔离问个问题 为什么容器里的 CPU 内存用量都看到的是宿主机的?如果我想只看到本 container 或者 pod 的,该如何做?
|
48
byzf Mar 22, 2021
@joesonw 不是只有虚拟机才有运行时,容器目前来说大多数是必须要运行时的,比如 docker daemon,然后这个运行时要去管理容器的状态,判断是否成功运行、是否要重启之类的操作。
|
50
dzdh Apr 6, 2021
容器本身就是另一种『进程模型』的实现。
你用 supervisor 的需求,本质上是想『多个容器共享存储、网络、设备』等资源。 在 k8s 里,你将这多个 container 放在一个 pod 里就可以了啊。不动为什么还需要 supervisor |