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

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

  •  
  •   clifftts · 262 天前 · 1673 次点击
    这是一个创建于 262 天前的主题,其中的信息可能已经有所发展或是发生改变。
    生产环境遇到一个问题,基于 postgresql 轻量消息特性 做的同步方案,使用 pgjdbc-ng 创建的 postgresql 
    数据库监听,在数据库创建 1 分钟后就会被 close 掉,无法保持长连接。
    
    1 本地运行工程连接同一个数据库,连接会话正常,未被关闭,问题无法复现
    
    2 同样的镜像包在虚拟机上 docker run ,连接正常 无法复现,
    
    3 生产环境(华为云),程序启动 连接第一次创建成功后 1 分钟关闭
    
    服务运行指定的环境参数也是一样的,
    
    给我整不会,我一直以为 docker 是可以完全屏蔽环境问题的。
    
    第 1 条附言  ·  262 天前
    忘了说了,这个服务我是后面参与维护的,一开始服务运行是没有问题的,上个月下旬被重启了一次,启动后就出现这个问题了
    19 条回复    2023-08-11 12:57:07 +08:00
    Worldispow
        1
    Worldispow  
       262 天前 via Android
    docker 屏蔽的软件自身的依赖环境。
    网络环境、外部程序环境天王老子来了也屏蔽不了。
    DdDddDlush
        2
    DdDddDlush  
       262 天前
    你这是网的问题
    clifftts
        3
    clifftts  
    OP
       262 天前
    @Worldispow 网络环境,外部程序这些是屏蔽不了,毕竟这些都不在 image 之内,但是同样的 image 和外部服务,image 运行起来应该是同样的结果
    clifftts
        4
    clifftts  
    OP
       262 天前
    @DdDddDlush 如果是网的问题,我想应该是连接超时,连接报错或者其他,而不是能连接并且有规律的会话结束
    shyrock
        5
    shyrock  
       262 天前
    你是把你的数据库和应用打包到一个镜像里面吗?如果这样我理解才能保证依赖环境一致。
    xiaooloong
        6
    xiaooloong  
       262 天前
    极端条件下可能遇到 libc 的兼容性问题。说是 libc 一半在内核一半在 os ,之前有人遇到过主机 gnu libc 容器 musl libc 炸了,还有甚至都是 gnu libc ,内外 os 不同的发型版导致的 libc 差异炸的。

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

    不同调度平台会有不同的内部行为,比如如果是虚拟机上运行 docker ,按道理和你本地行为应该会保持一致。
    clifftts
        9
    clifftts  
    OP
       262 天前
    @xiaooloong 应该没那么幸运遇到极端问题
    clifftts
        10
    clifftts  
    OP
       262 天前
    @vmlinz 生产是部署在华为云的 k8s+docker,虚拟机运行 docker 是我的开发环境
    vmlinz
        11
    vmlinz  
       262 天前
    有的所谓 serverless docker 运行方式,实际上是有要求你的服务是 stateless 的,或者 fault tolerant ,要求你自己处理好容器关闭,重启之类的生命周期。你目前这种情况,就是华为云可能是在没有活跃链接的时候会自动关闭容器,有了流量后再重启接受链接,这种情况,你可能需要一个 sql proxy 来保持数据库连接。
    vmlinz
        12
    vmlinz  
       262 天前
    @clifftts 这种情况,你需要看 k8s 的 event log ,看看你的 service pod 是否有重启的情况,PostgreSQL 你如果部署到 k8s ,可能需要一些官方的 helm chart 来部署。最好是是用 managed postgressql ,不要在 k8s 里面自己部署 postgresql 这样的有状态服务,运维复杂度提升了很多。
    vmlinz
        13
    vmlinz  
       262 天前
    @clifftts 另外开发环境,你可以使用本地 k8s 来和远程环境保持一致,比如 minikube ,microk8s ,k3s 之类的本地环境。
    lmshl
        14
    lmshl  
       262 天前
    以前遇到过类似问题,k8s 网络组件没配置好,过早 drop 掉了一些路由信息,导致长链接失效,不确定你遇到的和我是不是同一个问题
    ch2
        15
    ch2  
       262 天前
    容器只是利用了 linux 的 userspace 和 kernel 分得很开的设计发明的产物,但是如果你的代码跑的 userspace 跟 kernel 版本差的太远还是不行的,需要直接跟 kernel 打交道的也不行
    clifftts
        16
    clifftts  
    OP
       262 天前
    @vmlinz 谢谢,应用服务是华为云 k8s+docker ,检查了 eventlog 没有被重启过,而且服务启动 1 分钟就会关不数据库连接 但是应用服务是正常工作的,关闭数据库连接程序内有 close 方法回调,我目前是 close 的时候重新建立连接,pg 是华为云的服务 docker-compose 部署
    clifftts
        17
    clifftts  
    OP
       262 天前
    @lmshl @ch2 我补充一点信息,这个应用本来是可以运行的,同样的镜像没有其他操作,被重启了一次就出现这个问题了,目前比较难定位的是,他只是在生产环境如此,其他环境都运行正常
    codehz
        18
    codehz  
       262 天前   ❤️ 1
    要不你先看下是不是生产环境数据多了,内存需求也变多了
    julyclyde
        19
    julyclyde  
       260 天前
    不能完全
    举个例子,inotify instance 资源,就无法隔离
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2823 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 12:08 · PVG 20:08 · LAX 05:08 · JFK 08:08
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.