docker 可以完全屏蔽环境问题吗?

2023-08-09 16:15:56 +08:00
 clifftts
生产环境遇到一个问题,基于 postgresql 轻量消息特性 做的同步方案,使用 pgjdbc-ng 创建的 postgresql 
数据库监听,在数据库创建 1 分钟后就会被 close 掉,无法保持长连接。
1 本地运行工程连接同一个数据库,连接会话正常,未被关闭,问题无法复现
2 同样的镜像包在虚拟机上 docker run ,连接正常 无法复现,
3 生产环境(华为云),程序启动 连接第一次创建成功后 1 分钟关闭
服务运行指定的环境参数也是一样的,

给我整不会,我一直以为 docker 是可以完全屏蔽环境问题的。
1898 次点击
所在节点    程序员
19 条回复
Worldispow
2023-08-09 16:19:04 +08:00
docker 屏蔽的软件自身的依赖环境。
网络环境、外部程序环境天王老子来了也屏蔽不了。
DdDddDlush
2023-08-09 16:28:21 +08:00
你这是网的问题
clifftts
2023-08-09 16:30:19 +08:00
@Worldispow 网络环境,外部程序这些是屏蔽不了,毕竟这些都不在 image 之内,但是同样的 image 和外部服务,image 运行起来应该是同样的结果
clifftts
2023-08-09 16:32:51 +08:00
@DdDddDlush 如果是网的问题,我想应该是连接超时,连接报错或者其他,而不是能连接并且有规律的会话结束
shyrock
2023-08-09 16:39:26 +08:00
你是把你的数据库和应用打包到一个镜像里面吗?如果这样我理解才能保证依赖环境一致。
xiaooloong
2023-08-09 16:44:02 +08:00
极端条件下可能遇到 libc 的兼容性问题。说是 libc 一半在内核一半在 os ,之前有人遇到过主机 gnu libc 容器 musl libc 炸了,还有甚至都是 gnu libc ,内外 os 不同的发型版导致的 libc 差异炸的。

——反正我是没遇到(因为遇到了也不会判断
clifftts
2023-08-09 16:47:20 +08:00
@shyrock 数据库是单独部署的,确实也不能说严格的环境一致,但是数据库连接的配置是一致的,数据实例是同一个
vmlinz
2023-08-09 16:50:27 +08:00
需要先搞清楚你在华为云上的具体运行方式,是虚拟机里面运行 docker ,还是华为云的调度平台,还是 k8s 这样的 docker 调度平台?

不同调度平台会有不同的内部行为,比如如果是虚拟机上运行 docker ,按道理和你本地行为应该会保持一致。
clifftts
2023-08-09 16:51:07 +08:00
@xiaooloong 应该没那么幸运遇到极端问题
clifftts
2023-08-09 16:52:37 +08:00
@vmlinz 生产是部署在华为云的 k8s+docker,虚拟机运行 docker 是我的开发环境
vmlinz
2023-08-09 16:54:13 +08:00
有的所谓 serverless docker 运行方式,实际上是有要求你的服务是 stateless 的,或者 fault tolerant ,要求你自己处理好容器关闭,重启之类的生命周期。你目前这种情况,就是华为云可能是在没有活跃链接的时候会自动关闭容器,有了流量后再重启接受链接,这种情况,你可能需要一个 sql proxy 来保持数据库连接。
vmlinz
2023-08-09 16:57:34 +08:00
@clifftts 这种情况,你需要看 k8s 的 event log ,看看你的 service pod 是否有重启的情况,PostgreSQL 你如果部署到 k8s ,可能需要一些官方的 helm chart 来部署。最好是是用 managed postgressql ,不要在 k8s 里面自己部署 postgresql 这样的有状态服务,运维复杂度提升了很多。
vmlinz
2023-08-09 17:00:58 +08:00
@clifftts 另外开发环境,你可以使用本地 k8s 来和远程环境保持一致,比如 minikube ,microk8s ,k3s 之类的本地环境。
lmshl
2023-08-09 17:02:44 +08:00
以前遇到过类似问题,k8s 网络组件没配置好,过早 drop 掉了一些路由信息,导致长链接失效,不确定你遇到的和我是不是同一个问题
ch2
2023-08-09 17:07:59 +08:00
容器只是利用了 linux 的 userspace 和 kernel 分得很开的设计发明的产物,但是如果你的代码跑的 userspace 跟 kernel 版本差的太远还是不行的,需要直接跟 kernel 打交道的也不行
clifftts
2023-08-09 17:17:52 +08:00
@vmlinz 谢谢,应用服务是华为云 k8s+docker ,检查了 eventlog 没有被重启过,而且服务启动 1 分钟就会关不数据库连接 但是应用服务是正常工作的,关闭数据库连接程序内有 close 方法回调,我目前是 close 的时候重新建立连接,pg 是华为云的服务 docker-compose 部署
clifftts
2023-08-09 17:20:12 +08:00
@lmshl @ch2 我补充一点信息,这个应用本来是可以运行的,同样的镜像没有其他操作,被重启了一次就出现这个问题了,目前比较难定位的是,他只是在生产环境如此,其他环境都运行正常
codehz
2023-08-09 19:16:11 +08:00
要不你先看下是不是生产环境数据多了,内存需求也变多了
julyclyde
2023-08-11 12:57:07 +08:00
不能完全
举个例子,inotify instance 资源,就无法隔离

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/963787

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX