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

是什么样的操作能让 Docker 容器挂掉

  •  
  •   jss · 2020-07-10 08:35:36 +08:00 via iPhone · 6953 次点击
    这是一个创建于 1631 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近上线个小项目,运行一个月后 容器半夜挂掉,由于是半夜没有拿出日志,重新创建容器后继续运行。想问问可能的原因?
    54 条回复    2020-07-13 10:07:08 +08:00
    tottea
        1
    tottea  
       2020-07-10 08:37:46 +08:00 via iPhone   ❤️ 1
    执行的主进程挂掉,然后没有容器 restart 机制,就直接挂掉了吧
    Vhc001
        2
    Vhc001  
       2020-07-10 08:38:20 +08:00
    1 、系统内存不足
    2 、容器 CPU 占用过高
    3 、楼下补充
    whileFalse
        3
    whileFalse  
       2020-07-10 08:39:49 +08:00 via iPhone
    一楼说的对。二楼是主进程挂掉的一些原因。
    luckyrayyy
        4
    luckyrayyy  
       2020-07-10 08:41:18 +08:00
    主进程没了容器就没了
    nieqibest
        5
    nieqibest  
       2020-07-10 08:42:23 +08:00 via Android
    日志采集都没有吗?…
    594duck
        6
    594duck  
       2020-07-10 08:55:30 +08:00 via iPhone   ❤️ 1
    身为生产 docker 黑。我要灵魂拷问一下。

    为什么一定要用 docker,解决了什么问题。

    你大概还没受到过 docker 挂一个拖死一台宿主机的倒霉事情
    lzp729
        7
    lzp729  
       2020-07-10 08:58:23 +08:00 via iPhone
    @594duck 因为时髦呗...
    Niphor
        8
    Niphor  
       2020-07-10 09:09:00 +08:00
    日志 和 容器挂了有什么关系...
    Jat001
        9
    Jat001  
       2020-07-10 09:11:31 +08:00 via iPhone
    @594duck 最简单的解决环境问题,不用每台机器安一堆东西,也不用担心不同程序的依赖相互冲突
    ohao
        10
    ohao  
       2020-07-10 09:14:00 +08:00
    我也不喜欢这玩意
    但也不能像 6 楼这么说,只能说个人和小公司以及小项目不建议使用

    我现在粗浅的理解 一套部署在 docker 内的东西
    需要的这东西设计之初 本身就是架构是分离的 (包括读写分离 /数据库分离 /日志分离 /分离一切)
    像积木一样模块化, 当某个积木出现瓶颈,就自动复制 /扩容 /加入集群
    在配合相对高速的内部网络

    Google 不是说每个月有上亿的容器上线吗。。。。。。
    caryqy
        11
    caryqy  
       2020-07-10 09:19:54 +08:00
    宿主机执行 update,docker 有更新时也会把运行的容器停用掉
    hws8033856
        12
    hws8033856  
       2020-07-10 09:28:14 +08:00   ❤️ 5
    @594duck 那你是没见过某些 zf 单位的项目,服务器没有外网,只是简单装个数据库,各种环境依赖包问题搞死人
    不将服务环境打包成镜像的话光部署就得整几天,实施要骂娘了
    pcbl
        13
    pcbl  
       2020-07-10 09:39:10 +08:00 via iPhone
    @hws8033856 一般这种情况我会打包个虚拟机
    iConnect
        14
    iConnect  
       2020-07-10 09:54:44 +08:00 via Android
    @hws8033856 装环境的时候,手机开热点,带一个路由器临时桥接一下。除非单位禁止,临时接入下互联网。
    594duck
        15
    594duck  
       2020-07-10 09:54:51 +08:00
    @hws8033856 JAVA 不就是为了这种情况而生的,once a build always run 。

    楼主天生就是 JAVA 项目

    另外你说包依赖啥的,根本不是问题,把需要的包都放在 U 盘里就好。生产环境比这个严格的金融企业我们管的更残酷呢,用什么包都得先备案。
    594duck
        16
    594duck  
       2020-07-10 09:57:14 +08:00   ❤️ 2
    @ohao 上亿 Docker 上线,用我朋友的话就是

    我朋友“我们每个月要开设和销毁几万个 Dokcer,如果是你这种虚拟机,光开和关虚拟机时间都来不急”

    我“你别装 B,我来给你重复说一次你的话,我们每个月 UP DOWN 几次进程,我根本不用开和关虚拟机”

    我朋友“你知道你为什么永远是个破落户,宝山滚地龙,一辈子的打工仔么。因为你不会吹,我都为你着急。人家做运维经理,五年一套房,你做运维经理好了,还要倒贴钱,死抱着自己在外企的教条。装什么纯呀,大家都是出来卖的。”
    zy445566
        17
    zy445566  
       2020-07-10 09:57:19 +08:00   ❤️ 2
    @594duck
    部署方便一个 dockerfile 搞定全部,迁移的时候,不用手动装 mysql,redis,nginx 。
    自动部署的时候,无论脚本多麻烦,docker 最多三行,build+stop+run
    上线屏蔽环境问题,测试 docker 是 centos 线上就是 centos,很多公司机子多,线上测试系统不一样,编译的时候也会有问题。
    其实 docker 就是学习成本略高,真正用起来绝对比手动部署爽。
    zy445566
        18
    zy445566  
       2020-07-10 10:02:33 +08:00
    @594duck 还有 docker 不是虚拟机,仅仅是进程克隆,你可以理解为读取环境不同于宿主机的进程
    594duck
        19
    594duck  
       2020-07-10 10:06:15 +08:00   ❤️ 1
    @zy445566 Docker 学习成本高?你是不是对专业的系统工程师有什么误解。。。。我们自己运维的观察 是

    “反正我是开发,我不想搞懂那帮 Linux 工程师会的东西,太麻烦了。来看我开一个 Docker,来我从镜像市场里下载一下,唉我启动了。怎么启动的我也不知道,反正就是好了。叫那些运维和系统工程师滚。
    ”我们用 Docker 解决了 CI/CD 的问题,但是我们认为我们已经可以让运维和系统工程师们走开了“
    "2010 年的时候喊的口号是啥来着,测试是耻辱,谁公司有测试谁就是耻辱“
    ”2018 年开始喊的口号是啥,Docker 淘汰了运维,谁公司有运维谁是耻辱“

    我也就笑笑,看看这种口号。因为我见过的几家只有程序 没有运维和测试的真田园敏捷开发,那叫一地鸡毛。要不是中国有强制的”等保“他们这闹剧我还能看很久。

    ”我“ ”程序员“ ”只要有了 Docker 没有人来再和我 BBBBB 了“

    ”把测试淘汰了,把运维淘汰了,只要有程序员就可以了“
    594duck
        20
    594duck  
       2020-07-10 10:09:53 +08:00   ❤️ 3
    @zy445566 我来给你讲讲我一个朋友的公司遇到的 Docker 问题和解决办法。我们听完后笑的肚子痛

    朋友公司一台机器开了 5 个 Docker 又快又好,还避免了端口复用问题。简直优雅。

    没二天,因为一个 Docker 把内核拉挂了,整个系统都 Carsh 了。

    朋友没敢大声说,赶紧找解决办法。因为生产系统频繁出问题。

    有人告诉他”xxxcloud 的解决办法是先在物理服务器上开一个 Openstack,再在 Openstack 里开一个虚拟机,在虚拟机里装个系统,在系统里开一个 qemu,在 qemu 里开 docker.这样一个 Docker 拉死的也是一个 Qemu 。“

    朋友一拍大腿,对呀,Docker 自己隔离不了环境,那我们让 Qemu 来隔离,简直太美了,太好的方案了。

    但是 Qemu 的网络不好呀没事,我们可以引进 SDN 来解决 Qemu 的问题,来我先写个组建。

    然后一桌人一边吃饭一边笑的眼泪都出来了。太聪明了,太聪明了。真的太聪明了。。啊哈哈哈哈哈哈哈哈哈
    594duck
        21
    594duck  
       2020-07-10 10:12:09 +08:00
    @zy445566 Redis 和 Nginx 你用 Docker 我也就算了。Mysql 用 Docker,一我敬你是英雄,二我为你公司的未来感到担忧。你动态迁移 MYSQL,除非 你有存储,不然打死我也不信。

    至于动态迁移 Redis 的 Docker,我朋友公司用过半年后是死也不弄了。5G 的 Redis 你迁一下那酸爽。
    est
        22
    est  
       2020-07-10 10:17:35 +08:00   ❤️ 1
    其实容器这个概念很具有迷惑性。其实就是宿主机上一陀进程树被 cgroups netns 给包装了一下而已。那什么操作会导致 docker 容器挂掉呢?那就是最顶上那个进程挂掉了。
    copycoder
        23
    copycoder  
       2020-07-10 10:35:31 +08:00
    刚开始用 docker 的小白,我不是很懂你们在说什么,目前对我来说还是很方便的,不用配置环境
    Livid
        24
    Livid  
    MOD
       2020-07-10 10:38:12 +08:00   ❤️ 3
    日志要弄进 ELK,有问题的时候先看 ELK 。
    zy445566
        25
    zy445566  
       2020-07-10 10:43:25 +08:00   ❤️ 2
    @594duck
    首先我不是和你争,我也不屑于和你争。
    你要觉的你是对的那你就是对的。
    每个人不同时间站的高度不一样,不同高度不同见解。
    你现在觉得是对的,未必将来你还会认为是对的。我现在觉得你错了,未必将来还觉得你错。
    你现在太激动了,言语里攻击性很强,会显得你很幼稚。
    danhahaha
        26
    danhahaha  
       2020-07-10 10:59:23 +08:00   ❤️ 4
    随即从服务器上抽出一块硬盘,仔细阅读上面的文字说明。
    InkAndBanner
        27
    InkAndBanner  
       2020-07-10 11:08:33 +08:00
    @594duck 是不断重启然后拖死的嘛
    liprais
        28
    liprais  
       2020-07-10 11:09:36 +08:00   ❤️ 1
    @594duck 你跟 php 转 node.js 的较啥劲
    前者一个文件一把梭,后者开个项目至少五万个依赖,他是得用 docker,不然依赖都装不上
    Latin
        29
    Latin  
       2020-07-10 11:17:09 +08:00
    一次打包到处运行它不香吗?
    真觉得有拉挂有问题,先看自己容器内部的容错机制。
    集群化就上 K8S
    黑化它干嘛,不然为啥这么多人鼓吹!
    blless
        30
    blless  
       2020-07-10 11:19:27 +08:00 via Android   ❤️ 1
    docker 是 docker,但是 docker 真正价值在于容器编排,也就是 k8s 。单节点部署爱用啥就用啥,楼上喷 docker 的维护过大规模部署再喷也不迟
    rockyou12
        31
    rockyou12  
       2020-07-10 11:21:51 +08:00
    @594duck 5 个 G 的 redis 迁移会有问题???我有点怀疑运维水平。数据库用 docker 搞什么主从备份确实会由于官方就没有好的方案导致特别特别复杂
    dilu
        32
    dilu  
       2020-07-10 11:27:45 +08:00
    dockerd 也是 systemd 拉起来的 建议先看 /var/log/message 日志

    如果 dockerd 出现异常这里应该会有日志

    如果这个日志正常 可以参考 1L,docker 容器 pid 为 1 的进程 也就是主进程的 id 是跟 docker 容器的生命周期关联的

    这也就是为什么 Dockerfile 最后的 CMD 一定是一个阻塞的命令

    建议从主进程开始排查
    spcharc
        33
    spcharc  
       2020-07-10 11:28:40 +08:00
    主进程挂掉最多就是退出容器,楼上那么多人说整个机器都挂了是啥情况? kernel panic ?
    我还没遇到整个机器挂的情况
    594duck
        34
    594duck  
       2020-07-10 11:49:56 +08:00
    @rockyou12 自动迁移到处漂,你感受一下。

    最后想通了就固定在几个地方一想我还要啥 Docker 直接启不就得了。排错什么都简单。
    594duck
        35
    594duck  
       2020-07-10 11:55:24 +08:00
    @InkAndBanner 影响到内核了,然后 Docker 那可怜的隔离机制从不告诉人家,”我如果内核被影响就会拖死宿主机一起死“

    结果就酸爽的不得了。


    还有理论上 Docker 既然 效率这么高就应该跑裸金属服务器,比如一台 256G 的裸金属服务器全跑 Docker 至少可以跑上 50 个服务吧,但是其实你基本看不到有人用裸金属服务器跑 Docker 的。因为一死死整机,所以大家还是在虚拟机上跑 Docker.那 Docker 吹了半天的隔离性在哪里呢?尴尬呀。

    但是你是可以看到一个裸金属服务器上跑十来个 JAVA 的。人家自己搞死自己,绝不祸害别人。
    choury
        36
    choury  
       2020-07-10 12:11:57 +08:00   ❤️ 1
    @594duck #34 docker 把内核搞挂了肯定不是 docker 对问题,内核有问题就升级内核,自己没有内核团队就交给 redhat/canonical 搞
    并且你要是需要隔离性,请把 runtme 从 runc 换成 kata,在这个架构里面,具体底层 runtime 是什么不是重点,重要对是上层对编排能力
    594duck
        37
    594duck  
       2020-07-10 12:41:38 +08:00
    @choury 没有自己的内核 团队就交给 xxx 搞,为什么这么复杂,直接不用不就好了。明明虚拟机 能够搞一步到位搞完事情,一定要弄一堆与之无关的东西出来。我就问你,搞 Docker 解决了什么根本问题。然后你看看是不是解决了我们没有 CI/CD 我们通过 Docker 解决了 CI/CD 问题。

    至于 Runtime 从 Runc 改为 kata,又回到了像你说的没有自己的内核 团队就交给 xxx 来搞一样的逻辑,我这个不行就换那个,那个也有缺点就换这个。Docker 网络不好用,那我们上 SDN,Docker 存储不好用,那我们弄个统一存储,Docker 这个不行,我们弄这个,Docker 那个不行,我们弄那个。。最后 Docker 和个虚拟机没二样了。你那个 Kata 不就并不多是一个内核级 Qemu 么,然后还要再搞一堆东西上去。

    那还是回到根本问题,我什么都不用,就用原来的技术架构跑,有什么问题。你能够说服自己么。

    我说国内搞 Docker 的公司 8 成是用来解决 CI/CD 你信不信,另外 2 成里有 1 成是解决消息总线之类的框架问题(K8s),最后只有一成的头部企业是我真的有需要

    你承认不承认,一个月里销毁几万次 Docker 其实就是 UP/DOWN 了几万次程序而已。
    ming7435
        38
    ming7435  
       2020-07-10 13:02:28 +08:00
    工作 10 年了,还没在生产环境用过 docker,感觉跟不上潮流了
    choury
        39
    choury  
       2020-07-10 13:04:51 +08:00 via Android
    kata 就是虚拟机,按你的想法,内核有问题你跑虚拟机照样能把母机跑挂,有什么本质区别么
    choury
        40
    choury  
       2020-07-10 13:05:14 +08:00 via Android
    rockyou12
        41
    rockyou12  
       2020-07-10 13:17:08 +08:00
    @594duck 结果是上的 k8s 跑 redis,那你不做 ceph 这种分布式存储当然不要用啊。而且真是你程序到处飘基本还是是资源分配就有问题,内存和 cpu 一直在程序间竞争导致互相乱杀,这个也是运维水平和资源投入问题。你就是虚拟机直接上 redis 还不是解决不了
    594duck
        42
    594duck  
       2020-07-10 13:19:42 +08:00
    @choury 虚拟机里程序的傻 X 问题可以把母机跑挂掉的难度那可比 Docker 程序有问题把母机跑挂掉的难度大到不是一点半点。
    594duck
        43
    594duck  
       2020-07-10 13:22:16 +08:00
    @rockyou12 你接触过大规模生产运维么?虚拟机上 Reids 或者 ReidsCluster,配置好后基本不用去动。毕竟人家环境隔离那叫一个稳。
    Rwing
        44
    Rwing  
       2020-07-10 13:24:56 +08:00
    我站 docker !
    594duck
        45
    594duck  
       2020-07-10 13:25:48 +08:00
    @rockyou12 Docker 派不是吹起来这样吹的么。

    我,Docker 512M 内存跑了 5 个服务,你们传统运维能行么?

    你五个服务跑 512M,吹什么牛逼。

    我 Docker 用 SWAP,512M 内存跑了 5 个服务,你们传统运维能行么。

    行行行行行,你历害,大爷再见。不送。

    https://www.v2ex.com/t/687612#reply81

    我不吹牛逼噢。

    另外如果你资源 什么都分配足 了,也就是在 IO 层面上和我虚拟机运营没有任何区别,你的号称资源 随意伸缩迁移的优势呢。

    另外 Ceph 又是一个超级大坑,生产环境大了坑特别猛,像 BILIBILI 就是。

    小了我还不如买台存储回来搞,省心省力。TCO 比你还核算。
    ffxrqyzby
        46
    ffxrqyzby  
       2020-07-10 13:52:12 +08:00
    @594duck
    docker 我们用了 5 年了, docker 本身是有问题, 但是你一直再喷就没意思了, 不适合你的场景不一定不适合别人
    pmispig
        47
    pmispig  
       2020-07-10 14:41:04 +08:00   ❤️ 1
    说 docker 把内核干崩溃的,你确定是 docker 造成的而不是你程序造成的?
    LichMscy
        48
    LichMscy  
       2020-07-10 14:42:08 +08:00
    都 0202 年了还有人认为用 Docker 是时髦
    我们团队的容器云平台从 17 年开发第一版,目前在公有云私有云的多个数据中心搭建了十几个集群,支持了几十个生产级项目组,日均部署量 6000+,除了 db 缓存这种有状态的存储服务暂无法提供生产级别支持外,其他服务都支持的很好,包括但不仅限于 JAVA/.NET/PHP/Python/Go/C#/Node/Nginx 等类型,给项目组节约了很大一部分的资源费用。像楼里某些无知无畏的兄弟上来就数落容器怎样怎样,真有够好笑的。

    然后回复下楼主的问题,可能的原因有很多种,我们平台的经验一般借助像日志 /资源监控 /告警 /HPA/多实例高可用等工具或机制,能比较好的进行维护和管理。楼主如果只是小项目直接上 ELK 可能太重了,可以考虑 loki 之类的日志工具进行管理,或者直接将日志写入文件挂载到宿主机上也可以;同时可以考虑添加监控,借助监控排查容器的资源使用情况是否有问题,多方面综合考虑看看。
    efaun
        49
    efaun  
       2020-07-10 14:46:00 +08:00
    @594duck #6 这纯粹是技术实力问题,怪不得 docker
    whileFalse
        50
    whileFalse  
       2020-07-10 14:57:23 +08:00
    @594duck 什么样的容器能把内核搞挂?
    HangoX
        51
    HangoX  
       2020-07-10 15:03:58 +08:00
    有什么好争执的,说 docker 好用的人肯定是 docker 帮助过他。说 docker 不行的人,也可能是 docker 对他真的没帮助。工具而已,选自己称手的用即可,何苦争来争去呢
    594duck
        52
    594duck  
       2020-07-10 15:51:12 +08:00
    @whileFalse 你问问那个很历害的 @LichMscy 他有没有遇到过容器把内核搞挂,毕竟在人家眼里我无知么。对吧

    顺便和 @LichMscy 说一下,你自己就是做容器云的,只谈优点谁都会对吧,但这么喷人,我觉得也是很历害。吃相不好看噢。
    我们敬重的大牛都是缺点和优点一起讲的,我看 infoq 上也有很多业内大牛,人家也是优点和缺点一起讲。京东分享的容器常识也够多了,人家也是优点和缺点一起讲。没见你这么喷的噢。
    thtznet
        53
    thtznet  
       2020-07-10 16:27:34 +08:00
    拔电源
    tfdetang
        54
    tfdetang  
       2020-07-13 10:07:08 +08:00
    @594duck 作为一个调参侠,生产上启用 k8s - docker 对我来说节约了太多的开发与运维成本。

    从开发角度而言,不同版本的模型可能依赖不同版本的 tensorflow, 而不同版本的 tensorflow 又依赖不同版本的 cudnn 。 如果不依赖容器,我要实现多版本 cudnn 就很麻烦。 什么?虚拟机?你要我搞虚拟机显卡直通? 先不问老黄答应不答应,我为了搞这一套还不知道要折腾多久。

    但是用了 Docker 方案就优雅很多了,在项目里定义好 dockerfile 和编排,同事 vscode 里一键就可以从容器中打开继续项目的开发。


    从运维角度而言,我不需要写复杂的部署文档,实际上即使我写了部署文档运维还是不得不来问我到底是怎么把这些玩意儿装上去的。更可怕的是,对于 CPU 和 GPU 版本我可能还要准备 2 套部署文档。 而使用 docker,大家只要看一下编排,都心领神会了,cpu-gpu 只要改下镜像 tag 就行了。

    你要说容器化有没有坑? 肯定是有的,但是给我带来的便利远大于坑带来的苦恼
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2093 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 00:22 · PVG 08:22 · LAX 16:22 · JFK 19:22
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.