远程调试Docker容器内的Java进程

本文详细描述了如何在开发环境中远程调试Docker容器内的SpringBootJava进程,包括在Dockerfile中配置启动参数,IDEA中设置远程JVMDebug,以及使用localhost进行调试的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

远程调试Docker容器内的Java进程

背景

开发环境无法复现测试的问题,尝试去远程调试测试环境docker容器内的java进程。

具体实现

Docker容器配置和启动

我这边简单搭建了一个Spring Boot项目和本地构建了一个Docker环境作为验证。只提供了一个HTTP接口

/**
 * 启动类
 *
 * @author yuanzhihao
 * @since 2024/4/12
 */
@RestController
@RequestMapping
@SpringBootApplication
public class Application {

    @GetMapping("/hello/{name}")
    public String hello(@PathVariable("name") String name) {
        return "Hello " + name;
    }


    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

首先需要在Java进程启动的时候,添加如下启动参数

-agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005

参数的具体含义
在这里插入图片描述

构建镜像的Dockerfile文件参考如下

FROM openjdk:8-jdk-alpine
WORKDIR /data
COPY ./target/docker-debug-1.0-SNAPSHOT.jar  /data/docker-debug-1.0-SNAPSHOT.jar
ENTRYPOINT java -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005 -jar docker-debug-1.0-SNAPSHOT.jar

在IDEA中配置Docker环境,配置参考如下,这边需要把服务的端口和Debug的端口都开出来
在这里插入图片描述
之后启动容器,访问localhost:8080/hello/{{name}}正常
在这里插入图片描述

本地调试

在idea新增一个Remote JVM Debug,配置如下
在这里插入图片描述

  1. 填入远端服务器的ip和调试端口,我是本地启动的,所以填的localhost
  2. 添加启动参数 -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=5005
  3. 选择需要调试的源码模块

启动之后,浏览器请求localhost:8080/hello/{{name}},可以进入debug程序,配置完毕
在这里插入图片描述

结语

参考:https://www.baeldung.com/docker-debug-app-with-intellij

代码地址:https://github.com/yzh19961031/blogDemo/tree/master/docker-debug

### 使用 IntelliJ IDEA 实现 Docker 容器中应用程序的远程调试 #### 准备工作 为了能够顺利地进行远程调试,首先需要确保Docker容器已经正确设置并运行。这涉及到创建和启动带有适当JVM选项的容器以便支持Java调试协议[^1]。 对于基于已有镜像的情况,在不拥有原始构建代码的前提下,仍然可以通过提取容器内部署的应用程序(通常是`.jar`包),并通过IntelliJ IDEA将其作为库添加进来,从而允许查看其结构以及在其类上设定断点来进行有效的调试活动[^2]。 #### 修改Docker容器启动命令 为了让目标应用能够在启动时等待来自IDEA的连接请求,应该调整用于启动该服务进程的指令,加入必要的JVM参数以启用JDWP (Java Debug Wire Protocol),具体来说就是向原有的入口点命令追加如下部分: ```bash -agentlib:jdwp=transport=dt_socket,server=y,suspend=n,address=*:5005 ``` 此段配置告知Java虚拟机监听位于指定地址上的套接字连接,并准备好接受来自外部工具如IDEA发起的会话;其中`suspend=n`意味着不会阻塞主流程直到有客户端接入为止[^3]。 另外需要注意的是,如果是在云环境中部署,则还需确认相应的网络策略已允许外界访问上述定义好的端口号——比如针对阿里云环境而言,就应当核查ECS实例的安全组规则是否开放了对应范围内的通信权限[^4]。 最后一步则是利用`docker run`命令行或者编辑`docker-compose.yml`文件的方式把修改后的执行语句应用于实际的目标容器之上,同时记得映射好宿主机与容器间的相应端口关系,例如采用下面的形式来完成整个操作: ```shell docker run -d -p 8080:8080 -p 5005:5005 --name myapp-container myapp-image ``` 这里假设Web服务暴露于8080端口而调试接口则绑定至5005[^5]。 #### 设置IntelliJ IDEA Remote Debugger 打开IDEA之后转到菜单栏里的“Run”->“Edit Configurations...”。点击左上方绿色加号按钮新增一项Remote项。按照提示填写Host为localhost或者是远端机器的真实IP地址,Port设成之前提到过的那个数值即5005。完成后即可开始尝试建立链接实施进一步的动作了。 一旦成功建立了连接,就能够如同对待本地项目一样自由地浏览源码、跟踪变量变化轨迹乃至单步执行逻辑单元等功能特性了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值