如何在Docker中使用Arthas

Posted by Jeremy Song on 2021-07-22
Estimated Reading Time 4 Minutes
Words 966 In Total
Viewed Times

Arthas(阿尔萨斯)能为你做什么?


Arthas 是Alibaba开源的Java诊断工具,深受开发者喜爱。

当你遇到以下类似问题而束手无策时,Arthas可以帮助你解决:

  1. 这个类从哪个 jar 包加载的?为什么会报各种类相关的 Exception?
  2. 我改的代码为什么没有执行到?难道是我没 commit?分支搞错了?
  3. 遇到问题无法在线上 debug,难道只能通过加日志再重新发布吗?
  4. 线上遇到某个用户的数据处理有问题,但线上同样无法 debug,线下无法重现!
  5. 是否有一个全局视角来查看系统的运行状况?
  6. 有什么办法可以监控到JVM的实时运行状?
  7. 怎么快速定位应用的热点,生成火焰图?

Arthas支持JDK 6+,支持Linux/Mac/Windows,采用命令行交互模式,同时提供丰富的 Tab 自动补全功能,进一步方便进行问题的定位和诊断。

注:本文假设你已经会使用Arthas的命令,如您不熟悉arthas的基本使用方法,请移步https://arthas.aliyun.com/doc/quick-start.html查看

在Docker里使用JDK

很多时候,应用在docker里出现arthas无法工作的问题,是因为应用没有安装 JDK ,而是安装了 JRE 。如果只安装了 JRE,则会缺少很多JAVA的命令行工具和类库,Arthas也没办法正常工作。下面介绍两种常见的在Docker里使用JDK的方式。

使用公开的JDK镜像:

1
FROM openjdk:8-jdk

或者:

1
FROM openjdk:8-jdk-alpine

通过包管理软件来安装:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# Install OpenJDK-8
RUN apt-get update && \
apt-get install -y openjdk-8-jdk && \
apt-get install -y ant && \
apt-get clean;

# Fix certificate issues
RUN apt-get update && \
apt-get install ca-certificates-java && \
apt-get clean && \
update-ca-certificates -f;

# Setup JAVA_HOME -- useful for docker commandline
ENV JAVA_HOME /usr/lib/jvm/java-8-openjdk-amd64/
RUN export JAVA_HOME

或者:

1
2
3
4
5
6
RUN yum install -y \
java-1.8.0-openjdk \
java-1.8.0-openjdk-devel

ENV JAVA_HOME /usr/lib/jvm/java-1.8.0-openjdk/
RUN export JAVA_HOME

如何在Docker中使用Arthas

最简单的方法诊断Docker里的Java进程

1
docker exec -it  ${containerId} /bin/bash -c "wget https://arthas.aliyun.com/arthas-boot.jar && java -jar arthas-boot.jar"

上述命令的意思是直接下载arthas并运行,前提条件是环境机器上需要有wget命令。如果没有需要提前安装。

把Arthas安装到基础镜像里

1
2
3
4
FROM openjdk:8-jdk-alpine

# copy arthas
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas

上述Dockerfile中的描述为,将Arthas在构建镜像时复制进去。容器启动后就拥有Arthas工具,可以直接使用,如下:

1
docker exec -it  ${containerId} /bin/bash -c "java -jar /opt/arthas/arthas-boot.jar"

在已经上线运行的容器,并且不能再容器中下载Arthas工具的情况下使用

这种问题是线上最常见的问题。一般生产环境并不会将Arthas构建到镜像中,并且生产服务器上的网络策略一般都不会使镜像直接与外网接通,尤其是是微服务架构的系统。这时就可以采用一种曲线的方式来使已经运行的线上容器拥有使用Arthas的能力。

a. 从容器外(开发环境或其他可以连接外网的环境)获取Arthas。获取连接参考https://arthas.aliyun.com/doc/download.html或者https://github.com/alibaba/arthas/releases。
b. 通过ftp工具将Arthas上传到运行镜像的宿主机上
c. 复制Arthas到镜像中

1
docker cp ./arthas-packaging-3.4.6-bin.zip ${containerId}:/opt

d. 解压Arthas

1
2
3
docker exec -it ${containerId} /bin/bash 
cd /opt
tar zxf ./arthas-packaging-3.4.6-bin.zip

e. 运行Arthas

1
2
cd /opt/arthas
java -jar ./arthas-boot.jar


至此,镜像中已成功运行Arthas。

大功告成!


欢迎关注我的公众号 须弥零一,跟我一起学习IT知识。


如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !