如何在宿主机上执行容器里的jmap,jtack,jstat 命令获取信息(原创)

一般情况下,我们要获取docker容器里的jvm信息只能进入容器后执行jmap,jstack,jstat 命令去获取,jstack,jstat还好,但是jmap dump的文件要拿出来,得先copy dump文件到挂载在宿主机上的目录,或者使用docker cp命令去获取,

如  https://pathtogeek.com/thread-heap-dumps-from-a-docker-container

1. Run the below command to bash into the container. Please change the CONTAINER_NAME appropriately

      docker exec -it CONTAINER_NAME bash
    

2. Then type jps to find the all the Java application details and extract the PID for your application

    jps
  

3. Then run the below command to get the thread dump. Please change the PID appropriately

     jstack PID > threadDump.tdump
     

4. Then run the below command to get the Heap dump. Please change the PID appropriately

        jmap -dump:live,format=b,file=heapDump.hprof PID
     

5. Then exit from the docker container and download the threadDump.tdump and heapDump.hprof from the docker container by running the below command. Please change the CONTAINER_NAME appropriately

      sudo docker cp CONTAINER_NAME:threadDump.tdump .
      sudo docker cp CONTAINER_NAME:heapDump.hprof .
    

现在我们要在宿主机上直接获取这些信息要怎么做的,

docker exec -it $containerid /bin/ps x  获取到我们需要的容器里的进程id

docker exec -it $containerid /jdk/bin/jstack $pid   获取容器里进程的jstack信息

一切执行顺利,我们继续试试jmap

docker exec -it $containerid /jdk/bin/jmap -dump:live,format=b,file=heapDump.hprof $pid

报错

why? 网上有篇文章提及了类似的情况 https://www.xiaocaicai.com/2018/07/09/docker-%E5%AE%B9%E5%99%A8%E9%87%8C%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8-jdk-%E7%9A%84-jmap-%E7%AD%89%E5%91%BD%E4%BB%A4%E7%9A%84%E9%97%AE%E9%A2%98/

线上java程序出现异常,需要打印内存信息进行debug,发现没有 jmap,jstack等工具。
发现容器基础镜像选择的是FROM java:8-jre,jre环境是不包含这类工具的,遂将换成FROM java:8,这类工具便包含在内了。
使用时发现还是不能使用,出现错误 “Can’t attach to the process: ptrace(PTRACE_ATTACH, ..) failed for 1: Operation not permitted docker”

查询资料后发现:
这其实不是什么 Bug,而是 Docker 自 1.10 版本开始加入的安全特性。
类似于 jmap 这些 JDK 工具依赖于 Linux 的 PTRACE_ATTACH,而是 Docker 自 1.10 在默认的 seccomp 配置文件中禁用了 ptrace。
相关资料

主要方法2个:
1.使用 –cap-add 明确添加指定功能:
docker run –cap-add=SYS_PTRACE …

2.Docker Compose 自 version 1.1.0 (2015-02-25) 起支持 cap_add。

version: ‘2‘

services:
  mysql:
    ...
  api:
    ...
    cap_add:
      - SYS_PTRACE

那就死马当活马医把,修改marathon的配置

执行ps x|grep docker|grep web,  看到docker run命令里已经有 cap-add 这个参数了

再次执行,成功导出

原文地址:https://www.cnblogs.com/devilwind/p/9717568.html

时间: 2024-07-30 00:27:37

如何在宿主机上执行容器里的jmap,jtack,jstat 命令获取信息(原创)的相关文章

Docker容器里时间与宿主机不同步

docker容器里时间设置: 第一种: Dockerfile文件中添加一行:RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime或者 第二种: 进入到容器中,设置环境变量  export TZ=Asia/Shanghai 文件字符编码设置: 设置环境变量: export $LANG=en_US.UTF-8

docker技术剖析--docker网络(二)docker宿主机之间容器互通

http://hongge.blog.51cto.com/ 多台物理主机之间的容器互联(暴露容器到真实网络中) docker 默认的桥接网卡是 docker0 .它只会在本机桥接所有的容器网卡,举例来说容器的虚拟网卡在主机上看一般叫做 vethxxx,而 docker 只是把所有这些网卡桥接在一起,如下: 这样就可以把这个网络看成是一个私有的网络,通过 nat 连接外网,如果要让外网连接到容器中,就需要做端口映射,即 -p 参数. 如果在企业内部应用,或则做多个物理主机的集群,可能需要将多个物理

让Qt for Windows Phone 8.1在真机上执行

前面几篇博文是为这篇文章做铺垫的,终于目的为的是使用Qt框架制作出可以在Windows Phone 8.1真机上执行的程序.因为Qt for WP8这一块不完好,在加上我刚进入这一领域,所以研究的速度有点儿慢.在网上询问了Qt项目的维护者,加上自己的一点研究,略微了解了Qt for Windows Phone 8的开发原理. 原创文章,反对未声明的引用.原博客地址:http://blog.csdn.net/gamesdev/article/details/38967749 使用Qt开发Windo

docker宿主机上的端口无法对外提供服务

因为特殊要求有个服务需要配置到宿主机上,所以引发了以下这个问题. 实验:容器中安装Tomcat,映射到宿主机为6666. 宿主机中也安装Tomcat,端口为8080. 端口使用netstat查看全部开启. 浏览器:访问容器中Tomcat 端口6666 访问成功 , telnet 6666端口成功              访问宿主机Tomcat 端口8080 访问失败 , telnet 8080端口失败 排错分析:说明宿主机8080端口对外是关闭的,而又想到宿主机ssh端口22为什么是对外可以通

Docker拷贝宿主机与容器中的文件

如果我们需要将宿主机文件拷贝到容器内可以使用 docker cp 命令,也可以将文件从容器内拷贝到宿主机 将宿主机文件拷贝到容器内 docker cp 要拷贝的宿主机文件或目录 容器名称:容器文件或目录 1. 在宿主机上创建一个mengxuegu文件并写入内容 2. 将mengxuegu文件拷贝进 mycentos2 容器中的 /opt 目录下(mycentos2要是UP启动状态) 3. 登录 mycentos2 容器,查看/opt目录下是否有 mengxuegu 文件 从容器内文件拷贝到宿主机

在Ubuntu宿主机上查看ARM交叉编译好的可执行程序和库文件的相关依赖关系,类似于PC上的ldd命令

在电脑上安装的Linux系统中,有一个ldd命令,可以查看对应的可执行文件或库文件依赖哪些库,但可执行文件或库文件要求与操作系统的编译器类型相同,即电脑是X86的GCC编译器,那么无法通过ldd命令查看ARM交叉编译器编译出来的可执行文件或库文件. 如果想在Ubuntu等Linux宿主机上查看ARM交叉编译好的可执行程序和库文件的相关依赖关系,可以通过以下命令: [email protected]:$ arm-linux-readelf  -a  busybox |grep "Shared&qu

安装程序不能验证Update.inf文件的完整性,请确定加密服务正在此计算机上执行

近期安装Microsoft .NET Framework 4(独立安装程序)时,提示"安装程序不能验证Update.inf文件的完整性,请确定加密服务正在此计算机上执行" 没法放狗 方案一: 1.我的电脑"右键"管理"→打开"计算机管理"→   点击"服务",在服务管理器的主窗体服务列表中,找到名称为"Cryptographic Services"的服务项,双击该服务项, 在弹出的该服务项属性对话

fsck 修复宿主机上面挂掉的虚拟机

一.情况详解 有些时候宿主机突然挂掉,会造成有些虚拟机 启动失败,如下图所示 这应该是文件系统破坏的问题,一般情况下还可以在虚拟机中fsck修复文件系统,但是这种情况在虚拟机中根本就没有机会fsck,所以想到通过外界方法对虚拟磁盘进行fsck.创建虚拟机使用的虚拟磁盘的类型是qcow2,开机无法fsck的话,可以通过如下两种方式 1.通过启动其它虚拟机的时候指定损坏虚拟磁盘启动再修复 2.通过qemu-nbd工具本地宿主机上修复qcow2 这里介绍第二种方式,直接在宿主机上修复损坏qcow2磁盘

如何获得Spring容器里管理的Bean,。不论是Service层,还是实体Dao层

如何获得Spring容器里管理的Bean,.不论是Service层,还是实体Dao层, 下面的这个必须配置,否则必出错,空指针 下面的这个是代码 而获得bean代码如下: serviceManagerImpl_fl=(ServiceManagerDao)MyApplicationContextUtil.getApplicationContext().getBean("serviceManagerImpl_fl");