使用IDEA远程调试Docker容器中的SpringBoot服务

在软件开发中,远程调试是一个非常实用的功能,尤其是对于使用微服务架构的项目。本文将详细介绍如何通过跳板机,对部署在Docker容器内的SpringBoot应用进行远程调试。此过程主要涉及SSH转发和隧道设置,以及IDEA的远程调试配置。

获取IP信息

在开始之前,我们需要收集必要的IP信息,包括跳板机IP、目标宿主机IP以及目标容器IP。

  1. **跳板机IP**:这是连接环境中的关键节点,通常具有公网IP。

  2. **目标宿主机IP**:通过Kubernetes命令获取所需远程调试服务的宿主机IP。

```

kubectl get pods -A -o wide|grep -i <服务名称>

kubectl get node -o wide|grep -i <节点关键字>

```

  1. **目标容器IP**:首先登录宿主机,然后使用以下命令找到对应的容器ID,进入容器获取IP。

```

docker ps|grep -i <服务名称>

docker exec -it <容器ID> bash -c 'ifconfig'

```

开启SSH转发

为了实现远程调试,我们需要在跳板机和宿主机上开启SSH转发。

  1. 登录跳板机(宿主机同理)。

  2. 切换至root用户。

  3. 修改`sshd_config`文件,将`AllowAgentForwarding`与`AllowTcpForwarding`设置为`yes`。

```

vi /etc/ssh/sshd_config +/Allow

```

  1. 修改完成后,保存并退出。

  2. 重启SSH服务。

```

/bin/systemctl restart sshd.service

```

配置本地多重隧道

接下来,我们需要配置两条隧道:一条连接本地和宿主机,另一条连接本地和容器。

  • **宿主机隧道**:在本地终端输入命令以配置隧道。

```

ssh -vvv -L 22:<宿主机IP>:22 <跳板机用户名>@<跳板机IP>

```

  • **容器隧道**:在新的终端窗口输入以下命令。

```

ssh -vvv -L 51115:<容器IP>:51115 <跳板机用户名>@127.0.0.1

```

在IDEA中配置远程调试

  1. 在IDEA的`Run/Debug Configurations`中,添加Remote JVM Debug配置。

  2. 在Debugger Mode中选择`Attach to remote JVM`。

  3. 设置Transport为`Socket`。

  4. Host填写`127.0.0.1`,Port填写`51115`。

  5. 在`Use module classpath`选项中选择正确的服务。

将以下参数添加到SpringBoot项目的启动命令中:

```

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

```

这样,当容器启动时,它将等待远程调试器连接。

开始远程调试

在IDEA中,选择刚才配置的远程调试,点击调试按钮开始。在代码中设置断点,就可以像本地调试一样观察和控制程序的执行。

注意事项

在进行远程调试时,需要注意以下几点:

  1. **代码版本一致性**:确保IDEA中的代码与远程容器中运行的服务代码版本完全一致。任何不匹配都可能导致调试过程中出现不可预料的问题。

  2. **对生产环境的影响**:在正式环境中使用断点调试时,可能会暂停服务处理,从而影响用户体验。建议在测试环境中进行调试,或者在正式环境中操作前与团队成员和相关干系人进行充分沟通。

  3. **隧道和转发的稳定性**:隧道和SSH转发的稳定性对远程调试至关重要。网络不稳定或配置不当可能导致隧道断开,从而中断调试过程。

  4. **容器ID变更问题**:如果Docker容器重启或由于其他原因导致容器ID更改,需要重新配置容器隧道。

  5. **安全性考虑**:在开启SSH转发和配置隧道时,要考虑到安全风险。确保所有的通信都经过加密,并且只在可信网络中操作。

结语

通过使用IDEA的远程调试功能,开发人员可以更方便地调试和测试部署在Docker容器中的SpringBoot应用。尽管这个过程需要一些初始设置,但一旦完成,它将大大提高开发效率和问题解决速度。

相关推荐
樱花落木兰7 分钟前
SpringBoot + ECharts 后台数据统计报表模块实战
java·javascript·spring boot·ai·log4j·github·echarts
CarIise2 小时前
Spring Boot入门:从项目创建到请求响应实战
spring boot
马剑威(威哥爱编程)2 小时前
【AI全栈后端12-02】Spring Boot 跑通第一个 AI 对话接口:HR 政策问答机器人实战
java·人工智能·spring boot·机器人
摇滚侠3 小时前
《Spring Boot 3:高级与架构设计》第 2 章 IOC 容器的高级机制 编程式驱动 IOC 阅读笔记 7
java·spring boot·笔记
不停喝水4 小时前
【前端转全栈java速通课】 项目实战④-1 Spring Boot 创建项目-定义接口-请求参数处理-分层规范-依赖注入
java·前端·spring boot
FYKJ_20105 小时前
springboot鲜花销售系统91056-计算机课程设计、毕业设计
vue.js·spring boot·后端·python·mysql·django·课程设计
Wx-bishekaifayuan5 小时前
Springcloud中学在线学习平台58883-计算机课程设计、毕业设计
java·vue.js·spring boot·学习·spring·spring cloud·课程设计
JavaEdge.5 小时前
Redis 连接断开后的自动重连操作
spring boot·redis·后端·lettuce·tcp keepalive
EatFan14 小时前
Spring Boot 4 落地观察:从 yudao-cloud、matecloud、JPower 看国产脚手架的升级路线与迁移清单
java·spring boot·后端·spring cloud·微服务·后端开发·jdk 21
凤山老林20 小时前
Spring Boot 集成 iText 7 实现动态 PDF 生成与电子签章:合同、报表场景实战
spring boot·后端·pdf·itext7·电子签章