背景

如今容器化大行其道,不懂点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了。

Trackback

no comment untill now

Add your comment now