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

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

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

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

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

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

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

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

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

© 2021 V2EX