小白学习在docker容器中安装并使用arthas

2,212 阅读2分钟

环境

  • docker:20.10.12
  • docker api:1.41
  • centos:8.5.2111
  • springboot:2.6.2
  • jdk:openjdk:8-jdk-alpine

安装

docker容器的特殊配置 在docker容器中的服务要使用arthas,镜像不要使用java:8-jre-alpine,要使用openjdk:8-jdk-alpine。

为了使用profiler还需要做下面的操作:

1、由于docker的虚拟化(具体原因我也不知道)profiler对cpu的监控需要系统调用的权限 而在容器中运行的一般权限不足,会导致出错。参考

github.com/jvm-profili…

2、在宿主机上修改(没有权限 就以root用户执行)

echo 0 > /proc/sys/kernel/kptr_restrict
echo 1 > /proc/sys/kernel/perf_event_paranoid

对于alpine容器镜像还需要在Dockerfile中加上 

RUN apk update && \
             apk add --no-cache tini
ENTRYPOINT ["/sbin/tini","--"]

修改后的Dockerfile

# 基础镜像
FROM openjdk:8-jdk-alpine

# 暴露8888端口,不写默认和项目的端口保持一致
# EXPOSE 8888

# 往容器中添加jar包
COPY app-1.0.jar app.jar

RUN apk update && \
             apk add --no-cache tini
             
# 引入字体到容器中,否则无法生成图形验证码,openjdk中没有
RUN apk add --no-cache fontconfig ttf-dejavu

# 启动镜像自动运行程序,这里的/app.jar是上面拷贝到容器中的app.jar
ENTRYPOINT ["/sbin/tini", "--", "java", "-jar", "app.jar"]

参考:github.com/alibaba/art…

如果直接是用docker来启动容器的需要 加上SYS_ADMIN

docker run  --cap-add=SYS_ADMIN {container}

接下来进入容器并安装arthas:

docker exec -it {container} /bin/sh

# 安装
wget https://arthas.aliyun.com/arthas-boot.jar
java -jar arthas-boot.jar
# 因为只有一个springboot程序在跑,所以直接输入1,然后等待安装成功

安装成功后出现如下图:

image.png

上述操作已经能够使用arthas了,但会有一个问题,就是当容器重跑或者被删掉了,就得重新下载并安装

优化

为了不每次运行容器都去下载arthas,我在打包镜像的时候,就将arthas拷贝到镜像中了,这样,当容器创建的时候,就自带arthas,直接运行即可。

修改Dockerfile,添加如下内容:

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

修改后的Dockerfile如下:

# 基础镜像
FROM openjdk:8-jdk-alpine

# 暴露8888端口,不写默认和项目的端口保持一致
# EXPOSE 8888

# 往容器中添加jar包
COPY app-1.0.jar app.jar

# 将arthas拷贝到镜像中
COPY --from=hengyunabc/arthas:latest /opt/arthas /opt/arthas

RUN apk update && \
             apk add --no-cache tini

# 启动镜像自动运行程序,这里的/app.jar是上面拷贝到容器中的app.jar
ENTRYPOINT ["/sbin/tini", "--", "java", "-jar", "app.jar"]

创建对应的镜像

docker build -t springboot-app:1.1 .

创建对应的容器

docker run -d --cap-add=SYS_ADMIN --name springboot-app -p XXXX:XXXX springboot-app:1.1 

进入容器,并运行arthas

docker exec -it ${container} /bin/sh -c "java -jar /opt/arthas/arthas-boot.jar"

操作如上,安装完成后,如下图:

image.png

至此,在docker容器中安装并使用arthas已经完成,接下来可以使用了,arthas的使用去看官网即可