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

docker ps 显示正在运行,但是服务已经 down 了

  •  
  •   c4923 · 9 小时 35 分钟前 · 1582 次点击

    这段时间我们这边服务经常遇到一个诡异的问题。

    服务在容器中正常运行了 2-3 周,期间没有人管过。某一天后端服务突然挂掉不再提供服务了。

    排查性能相关,cpu ,磁盘,内存都是正常的,docker ps 也显示正常没有重启之类的情况。但是 docker logs 日志停止输出。必须手动 docker restart 才能恢复服务,文件描述符数量也正常,容器日志也不存在写满的情况。因为要优先恢复服务可用性,所以没办法再排查更加细致的内容,有没有大佬遇到过类似的问题?或者说有大佬能提供一下下次出现类似情况的排查思路吗?

    docker 版本是 23.0.6

    28 条回复    2025-11-03 17:44:34 +08:00
    defunct9
        1
    defunct9  
       9 小时 33 分钟前   ❤️ 3
    开 ssh ,让我上去看看
    finab
        2
    finab  
       9 小时 33 分钟前   ❤️ 1
    你 docker 运行的不是提供服务本身的那个进程吧?
    c4923
        3
    c4923  
    OP
       9 小时 31 分钟前
    @finab 就是后端服务本身
    c4923
        4
    c4923  
    OP
       9 小时 31 分钟前
    @defunct9 哈哈,我也想,但是条件不允许😂
    log4j
        5
    log4j  
       9 小时 30 分钟前   ❤️ 2
    有没有可能你服务的进程不是 0 号?这种情况它异常退出后 docker 是不知道
    klo424
        6
    klo424  
       9 小时 28 分钟前   ❤️ 1
    多半是自己程序的 bug ,异常终止了。docker logs 的输出内容是可以通过程序修改的,所以如果程序自己崩了,没有弹出异常,docker 容器也不知道发生了什么。检查一下程序有没有 bug 吧。
    c4923
        7
    c4923  
    OP
       9 小时 24 分钟前
    @klo424 目前初步怀疑确实是程序本身的问题,但因为不好排查所以无法判断,而且同一个版本下使用 Windows 的二进制运行的没有出现过类似的问题
    c4923
        8
    c4923  
    OP
       9 小时 16 分钟前
    @log4j 看了下,服务本身确实不是 0 号进程,0 号进程是一个启动脚本。那就更可能是服务本身出现了问题。
    kd9yYw2RyhQwAwzn
        9
    kd9yYw2RyhQwAwzn  
       9 小时 0 分钟前
    可以写 health check 做健康检查
    taohua1c
        10
    taohua1c  
       8 小时 58 分钟前
    写个定时任务,每晚重启下 docker 服务,先跑着
    c4923
        11
    c4923  
    OP
       8 小时 54 分钟前
    @kd9yYw2RyhQwAwzn 目前想到的解决方案是健康检查,但是我希望还是能找到具体原因。主要这么奇怪的情况我也是第一次遇到。
    c4923
        12
    c4923  
    OP
       8 小时 54 分钟前
    @taohua1c 这个只能在实在没办法的情况下才能用了
    johnbobby
        13
    johnbobby  
       8 小时 53 分钟前
    dockerfile 有问题吧,就像楼上说的不是 0 号进程
    Daybyedream
        14
    Daybyedream  
       8 小时 52 分钟前
    进容器看业务到底咋回事呀
    deplives
        15
    deplives  
       8 小时 47 分钟前
    盲猜 dockerfile 有问题,容器内启动的进程不是 0 导致即使服务挂了 docker 也认为没有问题一切正常
    xzysaber
        16
    xzysaber  
       8 小时 41 分钟前
    这就是为什么 Docker 推荐一个容器一个进程,即使多个进程也要有成熟的进程管理工具。
    newaccount
        17
    newaccount  
       8 小时 37 分钟前
    你有请求日志吧?把那些重放一遍看能重现出来不,不然等 2-3 周实在没法弄
    TeeMoCode
        18
    TeeMoCode  
       8 小时 35 分钟前
    脚本中启动服务的命令是用的 exec 么?
    laminux29
        19
    laminux29  
       8 小时 31 分钟前
    如果把容器实例当成物理宿主机,虽然里面的服务进程挂起,但物理宿主机是仍然在运行的,因此你用 docker ps 显示容器实例正在运行,是正常现象。至于 docker log 无输出,是因为 docker log 可能绑定到服务进程的 log 输出,由于服务进程挂起,无 log 输出,所以你用 docker log 也无输出了。
    zhangyunlu80
        20
    zhangyunlu80  
       8 小时 28 分钟前
    这个意思不就是服务 hang 住了么
    c4923
        21
    c4923  
    OP
       8 小时 4 分钟前
    @johnbobby dockerfile 没有改动过,之前从来没遇到过这种问题。
    c4923
        22
    c4923  
    OP
       7 小时 49 分钟前
    @TeeMoCode 是的
    c4923
        23
    c4923  
    OP
       7 小时 48 分钟前
    @newaccount 试过了, 确实复现不了😭
    fds
        24
    fds  
       7 小时 44 分钟前   ❤️ 1
    保留现场,根据是什么语言,用相应工具提取一下 stack 看看卡在哪里了。
    软件 bug 很常见的,特别是有些异常输入之类的。大概率不是 docker 的问题。
    你要保证可用性,建议前面加个负载均衡之类的服务,这样一个停了,可以直接启动另外一个,然后分析前一个的状态。
    hefish
        25
    hefish  
       6 小时 59 分钟前
    多数是服务停了,但是启动服务的 shell 还活着。在等待控制台的输入。
    MineDog
        26
    MineDog  
       5 小时 9 分钟前
    从来都是 pid=1 的进程吧,0 号进程是什么
    TeeMoCode
        27
    TeeMoCode  
       3 小时 33 分钟前
    @c4923 脚本里面用 exec 启动服务,pid=1 的就是你的服务进程。执行 docker ps 看状态是 up ,那说明 pid=1 还活着。 用 docker exec 进容器执行 ps -p 1 -o stat,rss,vsz,cmd,wchan 看进程状态如何呢
    yinmin
        28
    yinmin  
       1 小时 32 分钟前 via iPhone
    大概率是服务程序的代码 bug ,或者程序引入模块的 bug 。有些服务架构是有外部调用多少次就重启一个新进程,可以规避长时间运行不稳定的情况。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   3223 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 22ms · UTC 11:17 · PVG 19:17 · LAX 03:17 · JFK 06:17
    ♥ Do have faith in what you're doing.