是什么样的操作能让 Docker 容器挂掉
为什么一定要用 docker,解决了什么问题。
你大概还没受到过 docker 挂一个拖死一台宿主机的倒霉事情
我现在粗浅的理解 一套部署在 docker 内的东西
需要的这东西设计之初 本身就是架构是分离的 (包括读写分离 /数据库分离 /日志分离 /分离一切)
像积木一样模块化, 当某个积木出现瓶颈,就自动复制 /扩容 /加入集群
在配合相对高速的内部网络
Google 不是说每个月有上亿的容器上线吗。。。。。。
主天生就是 JAVA 项目
另外你说包依赖啥的,根本不是问题,把需要的包都放在 U 盘里就好。生产环境比这个严格的金融企业我们管的更残酷呢,用什么包都得先备案。
我朋友“我们每个月要开设和销毁几万个 Dokcer,如果是你这种虚拟机,光开和关虚拟机时间都来不急”
我“你别装 B,我来给你重复说一次你的话,我们每个月 UP DOWN 几次进程,我根本不用开和关虚拟机”
我朋友“你知道你为什么永远是个破落户,宝山滚地龙,一辈子的打工仔么。因为你不会吹,我都为你着急。人家做运维经理,五年一套房,你做运维经理好了,还要倒贴钱,死抱着自己在外企的教条。装什么纯呀,大家都是出来卖的。”
“反正我是开发,我不想搞懂那帮 Linux 工程师会的东西,太麻烦了。来看我开一个 Docker,来我从镜像市场里下载一下,唉我启动了。怎么启动的我也不知道,反正就是好了。叫那些运维和系统工程师滚。
”我们用 Docker 解决了 CI/CD 的问题,但是我们认为我们已经可以让运维和系统工程师们走开了“
“2010 年的时候喊的口号是啥来着,测试是耻辱,谁公司有测试谁就是耻辱“
”2018 年开始喊的口号是啥,Docker 淘汰了运维,谁公司有运维谁是耻辱“
我也就笑笑,看看这种口号。因为我见过的几家只有程序 没有运维和测试的真田园敏捷开发,那叫一地鸡毛。要不是中国有强制的”等保“他们这闹剧我还能看很久。
”我“ ”程序员“ ”只要有了 Docker 没有人来再和我 BBBBB 了“
”把测试淘汰了,把运维淘汰了,只要有程序员就可以了“
朋友公司一台机器开了 5 个 Docker 又快又好,还避免了端口复用问题。简直优雅。
没二天,因为一个 Docker 把内核拉挂了,整个系统都 Carsh 了。
朋友没敢大声说,赶紧找解决办法。因为生产系统频繁出问题。
有人告诉他”xxxcloud 的解决办法是先在物理服务器上开一个 Openstack,再在 Openstack 里开一个虚拟机,在虚拟机里装个系统,在系统里开一个 qemu,在 qemu 里开 docker.这样一个 Docker 拉死的也是一个 Qemu 。“
朋友一拍大腿,对呀,Docker 自己隔离不了环境,那我们让 Qemu 来隔离,简直太美了,太好的方案了。
但是 Qemu 的网络不好呀没事,我们可以引进 SDN 来解决 Qemu 的问题,来我先写个组建。
然后一桌人一边吃饭一边笑的眼泪都出来了。太聪明了,太聪明了。真的太聪明了。。啊哈哈哈哈哈哈哈哈哈
至于动态迁移 Redis 的 Docker,我朋友公司用过半年后是死也不弄了。5G 的 Redis 你迁一下那酸爽。
如果 dockerd 出现异常这里应该会有日志
如果这个日志正常 可以参考 1L,docker 容器 pid 为 1 的进程 也就是主进程的 id 是跟 docker 容器的生命周期关联的
这也就是为什么 Dockerfile 最后的 CMD 一定是一个阻塞的命令
建议从主进程开始排查
最后想通了就固定在几个地方一想我还要啥 Docker 直接启不就得了。排错什么都简单。
结果就酸爽的不得了。
还有理论上 Docker 既然 效率这么高就应该跑裸金属服务器,比如一台 256G 的裸金属服务器全跑 Docker 至少可以跑上 50 个服务吧,但是其实你基本看不到有人用裸金属服务器跑 Docker 的。因为一死死整机,所以大家还是在虚拟机上跑 Docker.那 Docker 吹了半天的隔离性在哪里呢?尴尬呀。
但是你是可以看到一个裸金属服务器上跑十来个 JAVA 的。人家自己搞死自己,绝不祸害别人。
至于 Runtime 从 Runc 改为 kata,又回到了像你说的没有自己的内核 团队就交给 xxx 来搞一样的逻辑,我这个不行就换那个,那个也有缺点就换这个。Docker 网络不好用,那我们上 SDN,Docker 存储不好用,那我们弄个统一存储,Docker 这个不行,我们弄这个,Docker 那个不行,我们弄那个。。最后 Docker 和个虚拟机没二样了。你那个 Kata 不就并不多是一个内核级 Qemu 么,然后还要再搞一堆东西上去。
那还是回到根本问题,我什么都不用,就用原来的技术架构跑,有什么问题。你能够说服自己么。
我说国内搞 Docker 的公司 8 成是用来解决 CI/CD 你信不信,另外 2 成里有 1 成是解决消息总线之类的框架问题(K8s),最后只有一成的头部企业是我真的有需要
你承认不承认,一个月里销毁几万次 Docker 其实就是 UP/DOWN 了几万次程序而已。
我,Docker 512M 内存跑了 5 个服务,你们传统运维能行么?
你五个服务跑 512M,吹什么牛逼。
我 Docker 用 SWAP,512M 内存跑了 5 个服务,你们传统运维能行么。
行行行行行,你历害,大爷再见。不送。
https://www.v2ex.com/t/687612#reply81
我不吹牛逼噢。
另外如果你资源 什么都分配足 了,也就是在 IO 层面上和我虚拟机运营没有任何区别,你的号称资源 随意伸缩迁移的优势呢。
另外 Ceph 又是一个超级大坑,生产环境大了坑特别猛,像 BILIBILI 就是。
小了我还不如买台存储回来搞,省心省力。TCO 比你还核算。
然后回复下主的问题,可能的原因有很多种,我们平台的经验一般借助像日志 /资源监控 /告警 /HPA/多实例高可用等工具或机制,能比较好的进行维护和管理。主如果只是小项目直接上 ELK 可能太重了,可以考虑 loki 之类的日志工具进行管理,或者直接将日志写入文件挂载到宿主机上也可以;同时可以考虑添加监控,借助监控排查容器的资源使用情况是否有问题,多方面综合考虑看看。
顺便和 @LichMscy 说一下,你自己就是做容器云的,只谈优点谁都会对吧,但这么喷人,我觉得也是很历害。吃相不好看噢。
我们敬重的大牛都是缺点和优点一起讲的,我看 infoq 上也有很多业内大牛,人家也是优点和缺点一起讲。京东分享的容器常识也够多了,人家也是优点和缺点一起讲。没见你这么喷的噢。
从开发角度而言,不同版本的模型可能依赖不同版本的 tensorflow, 而不同版本的 tensorflow 又依赖不同版本的 cudnn 。 如果不依赖容器,我要实现多版本 cudnn 就很麻烦。 什么?虚拟机?你要我搞虚拟机显卡直通? 先不问老黄答应不答应,我为了搞这一套还不知道要折腾多久。
但是用了 Docker 方案就优雅很多了,在项目里定义好 dockerfile 和编排,同事 vscode 里一键就可以从容器中打开继续项目的开发。
从运维角度而言,我不需要写复杂的部署文档,实际上即使我写了部署文档运维还是不得不来问我到底是怎么把这些玩意儿装上去的。更可怕的是,对于 CPU 和 GPU 版本我可能还要准备 2 套部署文档。 而使用 docker,大家只要看一下编排,都心领神会了,cpu-gpu 只要改下镜像 tag 就行了。
你要说容器化有没有坑? 肯定是有的,但是给我带来的便利远大于坑带来的苦恼