[TOC]
目的
解决spring boot应用以docker容器方式启动后,进程ID是1而导致的jstack和jmap等命令不可用的现象
默认将spring boot工程打包成镜像的方式
1. 当我们把spring boot打包成一个可执行jar
2. 编写Dockerfile 将jarcopy到容器中,在cmd 中执行java -jar ***.jar 启动,Dockerfile文件如下
#基础镜像基于openjdk,利用alpine
FROM openjdk:8u212-jdk-alpine
#所属团队
MAINTAINER chengf
ENV JAVA_OPTS="-server -Xms512m -Xmx512m" LOGGING_LEVEL="INFO"
#编译时变量无法在运行时用,此处做一次转换
ENV TARGET_JAR="spring-boot-sample-0.0.1-SNAPSHOT.jar"
#将编译好的工程jar包copy到镜像容器中
COPY ${TARGET_JAR} /usr/src/${TARGET_JAR}
ENV OPTS=${JAVA_OPTS}" -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"
WORKDIR /usr/src
#程序入口
CMD java -jar ${OPTS} ${TARGET_JAR} --logging.level.root=${LOGGING_LEVEL}
启动镜像后执行docker exec 进入到容器内部,执行ps可以看到容器中进程号是1的就是我们的应用启动进程
此时执行jstack 1 出现如下错误
```
1: Unable to get pid of LinuxThreads manager thread
```
解决办法
因为jstack jmap等jdk自带的tools放发无法对1号进程分析,那我们就想办法把java进程变为非1号进程对应的Dockerfile
#基础镜像基于openjdk,利用alpine
FROM openjdk:8u212-jdk-alpine
#所属团队
MAINTAINER chengf
ENV JAVA_OPTS="-server -Xms512m -Xmx512m" LOGGING_LEVEL="INFO"
#编译时变量无法在运行时用,此处做一次转换
ENV TARGET_JAR="spring-boot-sample-0.0.1-SNAPSHOT.jar"
#将编译好的工程jar包copy到镜像容器中
COPY ${TARGET_JAR} /usr/src/${TARGET_JAR}
ENV OPTS=${JAVA_OPTS}" -Dfile.encoding=UTF8 -Duser.timezone=GMT+08"
WORKDIR /usr/src
#程序入口
#CMD java -jar ${OPTS} ${TARGET_JAR} --logging.level.root=${LOGGING_LEVEL}
RUN echo "java -jar \${OPTS} \${TARGET_JAR} --logging.level.root=\${LOGGING_LEVEL}" > start.sh \
&& chmod 777 start.sh
CMD ./start.sh
这样启动后1号进程就变成了 start.sh 由1号进程启动的进程才是我们的java进程,启动后通过docker exec 进入到容器中执行ps的效果如下
可以看到我们的java进程号是6,之后就可以用jstack和jmap对我们的应用进行分析了
- 大小: 27.4 KB
- 大小: 10.6 KB
- 大小: 26.9 KB
- 大小: 142.6 KB
分享到:
相关推荐
本文介绍了Docker如何进入启动容器,分享给大家,具体如下: 在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。 这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的...
spring boot2.0集成docker插件,使用socket链接,dockerfile部署到docker服务器
将Spring boot应用打包成镜像放到docker中运行: https://blog.csdn.net/anla_/article/details/79943251
本书根据Docker 1.10版和Kubernetes 1.2版对第1版进行了全面更新,从实践者的角度出发,以Docker和Kubernetes为重点,沿着“基本用法介绍”到“核心原理解读”到“高级实践技巧”的思路,一本书讲透当前主流的容器和...
docker 容器的生命周期是同容器中的前置进程相关在一起的,这也是我们平时可能会遇到一些容器只是运行几秒便自动结束的原因:因为容器中没有一个常驻的前置进程,前置进程运行结束后,容器便自动退出了。 比如 ...
开发提升十倍生产力- IDEA 远程一键部署 Spring Boot 到 Docker.zip开发提升十倍生产力- IDEA 远程一键部署 Spring Boot 到 Docker.zip开发提升十倍生产力- IDEA 远程一键部署 Spring Boot 到 Docker.zip开发提升十...
该项目以名为Anime Hub的博客Web应用程序的形式演示了Spring Boot、Spring Security、Spring mvc、Docker容器的实现.zip
主要介绍了详解如何将Spring Boot应用跑在Docker容器中,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
Docker 是一个开源的应用容器引擎,和传统的虚拟机技术相比,Docker 容器性能开销极低,因此也广受开发者...这篇文章主要介绍了基于spring-boot和docker-java实现对docker容器的动态管理和监控 ,需要的朋友可以参考下
虽然也可以通过进程监控的方式(如systemd)来完成这种动作,但Docker还是建议尽量避免使用进程监控的方式来 “自启动” 容器。 Docker的 Restart policy与dockerd命令的–live-restore启动标志还有区别:–live-...
Docker 构建、运行、发布一个 Spring Boot 应用,Docker 构建、运行、发布一个 Spring Boot 应用
最近在工作时遇到一个问题,docker容器无法访问宿主机的redis,telent6379端口不通。 经排查发现,该服务器启用了防火墙,防火墙把6379的端口的访问授权给docker0网卡访问即可。 操作如下: firewall-cmd –...
解决Windows10下无法对docker容器进行端口访问(端口映射的问题) 在Windows10系统服务器中安装了docker和docker-compose 并尝试在其中运行Nginx服务,映射也做好 问题:在主机的浏览器中,打开localhost:port无法...
目录本指南将引导您完成构建用于运行Spring Boot应用程序的映像的过程。 我们从一个基本的Dockerfile开始,然后进行一些调整。 然后,我们展示几个使用构建插件(适用于Maven和Gradle)而不是docker 。 这是一个...
对spring boot 、spring cloud 、docker 微服务实战、从浅入深的全面学习
拿到交付的docker镜像后,启动后进入容器控制台,使用date命令查看果然时间不正确。再查看宿主机时间是正确,这样肯定是容器启动时未将时区与宿主机保持同步了,由于测试镜像是由dockfile直接构建,因此问题基本了定...
在讲解Docker高级实践技巧的同时,深入到源代码层次,为读者梳理出Docker容器技术和基于Docker的容器云技术(如Kubernetes)的实现方法和设计思路,帮助读者理解如何在实际场景中利用Docker解决问题并启发新的思考。...
springcloud与docker微服务架构实战配套代码springcloud与docker微服务架构实战配套代码springcloud与docker微服务架构实战配套代码springcloud与docker微服务架构实战配套代码springcloud与docker微服务架构实战...
Jenkins 是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件的持续集成变成可能。 在资源中,会讲到如下内容: ...- Spring Boot 持续集成演示