7月
01
背景
如今容器化大行其道,不懂点docker都不好意思跟人打招呼,但容器化后也给运维带来了很大的挑战,容器都讲究小而精,尽可能在最小的体积里运行应用,减少体积的结果就是要舍弃一些工具,比如ping,大部分容器都舍弃了该工具,导致在容器里需要获取一个host的ip变得麻烦很多。java应用也一样,有可能容器中就只有一个java其他什么都没有,在这种情况下如何进行问题的诊断,如何使用java诊断神器arthas。
卷挂载方式
由于Arthas免安装,只是一些jar包,所以可以在docker运行时通过卷的方式挂载到容器内部。以tomcat为例
docker run -p 8888:8080 -v /you/path/arthas-packaging-3.1.7-bin/:/arthas -d tomcat
在运行时将arthas相关jar包目录挂载到容器内/arthas
目录下,进入容器环境启动arthas
# docker exec -it 2f269818dcc6 bash root@2f269818dcc6:/usr/local/tomcat# cd /arthas/ root@2f269818dcc6:/arthas# ls -l total 11524 -rw-r--r-- 1 root root 8347 Dec 4 2019 arthas-agent.jar -rw-r--r-- 1 root root 111090 Dec 4 2019 arthas-boot.jar -rw-r--r-- 1 root root 403091 Dec 4 2019 arthas-client.jar -rw-r--r-- 1 root root 11207868 Dec 4 2019 arthas-core.jar -rw-r--r-- 1 root root 3739 Dec 4 2019 arthas-demo.jar drwxr-xr-x 2 root root 64 Feb 5 02:50 arthas-output -rw-r--r-- 1 root root 5993 Dec 4 2019 arthas-spy.jar -rwxr-xr-x 1 root root 7744 Dec 4 2019 as-service.bat -rwxr-xr-x 1 root root 3127 Dec 4 2019 as.bat -rwxr-xr-x 1 root root 28075 Dec 4 2019 as.sh drwxr-xr-x 4 root root 128 Feb 5 00:57 async-profiler -rwxr-xr-x 1 root root 635 Dec 4 2019 install-local.sh root@2f269818dcc6:/arthas# java -jar arthas-boot.jar [INFO] arthas-boot version: 3.1.7 [INFO] Found existing java process, please choose one and hit RETURN. * [1]: 1 org.apache.catalina.startup.Bootstrap 1 [INFO] arthas home: /arthas [INFO] Try to attach process 1 [INFO] Attach process 1 success. [INFO] arthas-client connect 127.0.0.1 3658 ,---. ,------. ,--------.,--. ,--. ,---. ,---. / O \ | .--. ''--. .--'| '--' | / O \ ' .-' | .-. || '--'.' | | | .--. || .-. |`. `-. | | | || |\ \ | | | | | || | | |.-' | `--' `--'`--' '--' `--' `--' `--'`--' `--'`-----' wiki https://alibaba.github.io/arthas tutorials https://alibaba.github.io/arthas/arthas-tutorials version 3.1.7 pid 1 time 2020-07-01 06:43:32
打包到容器(推荐)
另外一种方案就是将arthas工具直接打包到容器中,一般公司里都有自己的一个基础镜像,所有容器的构建都是基于基础镜像进行构建,那么就可以将arthas打包到该基础镜像中。
- 创建一个工作目录,并且arthas相关jar包复制到该目录下
$ mkdir workspace $ cd workspace $ cp -rf /you/path/arthas-packaging-3.1.7-bin .
- 在workspace目录创建一个名称为Dockerfile文件,内容如下
FROM tomcat COPY arthas-packaging-3.1.7-bin ./arthas EXPOSE 8080
- 此时workspace目录结构如下
. ├── Dockerfile └── arthas-packaging-3.1.7-bin ├── arthas-agent.jar ├── arthas-boot.jar ├── arthas-client.jar ├── arthas-core.jar ├── arthas-demo.jar ├── arthas-output ├── arthas-spy.jar ├── as-service.bat ├── as.bat ├── as.sh ├── async-profiler │ ├── libasyncProfiler-linux-x64.so │ └── libasyncProfiler-mac-x64.so └── install-local.sh 3 directories, 13 files
- 在workspace目录下执行以下命令构建容器
docker build -t tomcat:arthas .
构建成功后运行容器,会发现arthas位于/usr/local/tomcat
目录中,这是因为这个目录tomcat镜像的WORKDIR
(工作目录),因此在Dockerfile中,./arthas
就表示/usr/local/tomcat/arthas
。这样以后就能愉快的在容器中使用arthas了。
Address: https://zhengjianfeng.cn/?p=382
no comment untill now