环境
- 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的监控需要系统调用的权限 而在容器中运行的一般权限不足,会导致出错。参考
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"]
如果直接是用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,然后等待安装成功
安装成功后出现如下图:
上述操作已经能够使用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"
操作如上,安装完成后,如下图:
至此,在docker容器中安装并使用arthas已经完成,接下来可以使用了,arthas的使用去看官网即可