一般情况下,我们要获取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:-jre,jre环境是不包含这类工具的,遂将换成FROM java:,这类工具便包含在内了。
使用时发现还是不能使用,出现错误 “Can’t attach to the process: ptrace(PTRACE_ATTACH, ..) failed for : Operation not permitted docker” 查询资料后发现:
这其实不是什么 Bug,而是 Docker 自 1.10 版本开始加入的安全特性。
类似于 jmap 这些 JDK 工具依赖于 Linux 的 PTRACE_ATTACH,而是 Docker 自 1.10 在默认的 seccomp 配置文件中禁用了 ptrace。
相关资料 主要方法2个:
.使用 –cap-add 明确添加指定功能:
docker run –cap-add=SYS_PTRACE … .Docker Compose 自 version 1.1. (--) 起支持 cap_add。 version: '' services:
mysql:
...
api:
...
cap_add:
- SYS_PTRACE

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

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

再次执行,成功导出

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

  1. 在宿主机上执行docker容器内部的shell或程序

    为了避免反复进入docker容器内部操作,可以将一系列容器内部的指令由宿主机来操作完成. 在宿主机(作者主机为windows7)上执行centos容器(name为centos-1)中/usr目录下的“ ...

  2. docker血一样的教训,生成容器的时候一定要设置数据卷,把数据文件目录,配置文件目录,日志文件目录都要映射到宿主机上保存啊!!!

    打个比方,比如mysql,如果你想重新设置一下mysql的配置,不小心配错里,启动容器失败,已启动就停止了. 根本进不去mysql的容器里.如果之前run容器的时候,没有把数据文件,日志文件,配置文件 ...

  3. docker中,将容器中的文件拷贝到宿主机上

    需求说明: 今天在做docker修改配置文件的问题,一个容器要使用另外容器的一个配置文件,但是在宿主机上没有, 就考虑将容器中的文件拷贝到宿主机上,在此记录下操作过程. 操作过程: 1.通过docke ...

  4. 容器计划任务大坑:在alpine容器里,想用非root帐号执行crontab任务

    我只能说抱歉,我前前后后测试了七天, 将自己预想的配置错误,一个一个去验证. 非root帐号在alpine容器里执行crontab任务,还是失败, 输出依旧是一片空白~ stackoverflow里, ...

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

    docker容器里时间设置: 第一种: Dockerfile文件中添加一行:RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime或者 第二种: ...

  6. docker - 修改镜像/容器文件的在宿主机上的存储位置(转)

    背景 之前在使用docker的时候,由于启动container的时候用的是默认的mount(路径为 /var/lib/docker),这个目录对应的硬盘空间有限,只有200G左右.现在随着程序运行,有 ...

  7. docker 在宿主机上根据进程PID查找归属容器ID

    在使用docker时经常出现一台docker主机上跑了多个容器,可能其中一个容器里的进程导致了整个宿主机load很高,其实一条命令就可以找出罪魁祸首 #查找容器ID docker inspect -f ...

  8. docker - 修改镜像/容器文件或者 "Docker root dir" 的在宿主机上的存储位置

    背景 之前在使用docker的时候,由于启动container的时候用的是默认的mount(路径为 /var/lib/docker),这个目录对应的硬盘空间有限,只有200G左右.现在随着程序运行,有 ...

  9. 开发时从宿主机连接容器中的MySQL

    从宿主机连接Docker容器中的MySQL 刚接触Docker,电脑安装Docker后,使用docker命令pull了一个MySQL5.6的Docker镜像,之后docker run启动创建容器. 可 ...

随机推荐

  1. Python 3 Anaconda 下爬虫学习与爬虫实践 (1)

    环境python 3 anaconda pip 以及各种库 1.requests库的使用 主要是如何获得一个网页信息 重点是 r=requests.get("https://www.goog ...

  2. C# 记录日志

    public static void WriteLogs(string fileName, string type, string content) { string path = AppDomain ...

  3. PSP耗时

  4. Python学习笔记,day5

    Python学习笔记,day5 一.time & datetime模块 import本质为将要导入的模块,先解释一遍 #_*_coding:utf-8_*_ __author__ = 'Ale ...

  5. web框架---django

    15:31:14一.web框架1.框架:即framework,特指为解决一个开放性问题而设计的具有一定约束性的支撑结构,使用框架可以帮你快速开发特定的系统,简单地说,就是你用别人搭建好的舞台来做表演. ...

  6. Spring mvc session cookie实现自动登录

    设计过程 1. user表存储用户名密码等信息,login表存放用户登陆状态的表 user表中存储username,pwd,等信息 login表存username,series(UUID),token ...

  7. 【开发】iOS入门 - UIViewController学习笔记

    iOS里面的UIViewController类似于Android里的Activity. 目前了解到除了基本的UIViewController之外,还有两个比较特别的一个是UINavigationCon ...

  8. 顺序栈代码实现&&stack库

    #include<iostream> using namespace std; ; typedef int Elemtype; struct SqStack { Elemtype *bas ...

  9. html2canvas将页面内容生成图片

    html2canvas官网链接地址:https://html2canvas.hertzen.com/ <!doctype html> <html lang="en" ...

  10. Python实例之抓取淘宝商品数据(json型数据)并保存为TXT

    本实例实现了抓取淘宝网中以‘python’为关键字的搜索结果,经详细查看数据存储于html文档中的js脚本中,数据类型为JSON 具体实现代码如下: import requests import re ...