将 Eclipse 连接到 Docker 容器以进行远程调试

Posted

技术标签:

【中文标题】将 Eclipse 连接到 Docker 容器以进行远程调试【英文标题】:Connecting Eclipse to Docker Container for Remote Debugging 【发布时间】:2018-09-20 07:42:21 【问题描述】:

我正在尝试将 eclipse 连接到我正在运行的 docker 容器,但我遇到了问题。

我的docker运行命令如下:

docker run --rm -it -p 8000:8000 -p=8668:8080 -p 8010:8009 -p 8443:8443 \
--name myContainer -h theContainer -e JVM_ROUTE=myContainer1 myContainer:qa

在 Eclipse 中,我使用localhost 作为主机连接,8000 作为端口连接。我转到 Run->Debug Configurations->Remote Java Application,并创建了一个新的调试配置。

当我点击应用,然后调试时,弹出错误消息Failed to connect to remote VM.

我还需要做什么才能使远程调试正常工作?

【问题讨论】:

另见***.com/questions/138511/… 【参考方案1】:

一个运行在docker容器中的java应用可以被远程调试

    为容器中的java进程启用JDWP,例如

    java -Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y [...]
    

    或使用 JAVA_OPTS 环境变量

    JAVA_OPTS="-Xdebug -Xrunjdwp:transport=dt_socket,address=8000,server=y,suspend=y"
    

    请注意,suspend=y 将阻止应用程序启动,直到远程调试器连接到 JVM。如果使用suspend=n,应用程序将正常启动,允许远程调试器稍后连接。

    连接到进程,例如通过您的 IDE,使用上面 address=<port> 设置中指定的端口,重要的是 docker 主机 的 IP 地址,除非您在 linux 上运行,否则可能不是 localhost。如果你使用docker-machine,可以使用docker-machine ip显示docker主机ip,例如

    $ docker-machine ip
    192.168.99.100
    

【讨论】:

我在 Mac 上。我现在就试试看。【参考方案2】:

通过用我的实际 IP 地址替换 localhost 解决了这个问题。

【讨论】:

我在 Mac 上,所以我不使用 docker-machine 我没有使用docker-machine是什么意思这个问题与docker-machine有关,你发布的答案是错误的!这是相关的!【参考方案3】:

操作系统:Ubuntu 18 / Windows 10

Java:OpenJdk 12

Docker 容器:Sprint 启动应用程序

要在 Eclipse 中连接远程调试,您可以按照以下步骤操作:

    将这些行放入您的应用程序 Dockerfile 中
# For Windows Machine comment EXPOSE 7074 and add it to docker-compose.yml EXPOSE 7074 ENV DEBUG_INFO="-Xdebug -Xrunjdwp:transport=dt_socket,address=0.0.0.0:7074,server=y,suspend=n" ENTRYPOINT [ "sh", "-c", "java $DEBUG_INFO -Dspring.profiles.active=docker -jar /pharmacy-service.jar" ]

对于 Windows,在 docker-compose.yml 中添加端口

bank-service: image: .... environment: ... ports: - 9097:9097 - 7074:7074
    仅适用于 Linux,启动您的 docker 应用程序并搜索网络,在我的情况下为 ecs-core_default
$ 码头工人网络 ls 网络 ID 名称 驱动程序范围 e63bb0decc92 网桥 本地网桥 94aefcdbb5f3 ecs-core_default 网桥本地
    仅适用于 Linux,现在检查您的应用程序使用的 IP,
$ docker network inspect ecs-core_default [ "Name": "ecs-core_default", ..... "IPAM": "Driver": "default", "Options": null, "Config": [ "Subnet": "172.18.0.0/16", "Gateway": "172.18.0.1" ] , ..... "Containers": "29bebdc31d6bf2057ed31074407c780cc718396ca49f58e766e098fceaa41a41": "Name": "ecs-core_pharmacy-service_1", "EndpointID": "fadc9b40bfed1d4b2104b96fb6930bda47928256092c268aa4cb67407c2c1661", "MacAddress": "02:42:ac:12:00:06", "IPv4Address": "172.18.0.6/16", "IPv6Address": "" ..... ]

    仅适用于 Linux,从容器“IPv4Address”复制 IP 地址:“172.18.0.6/16”,即 172.18.0.6

    仅适用于 Windows 10,要查找 IP,请转到控制面板 -> 网络和 Internet -> 查看网络状态和任务 -> 更改适配器设置 -> 查找 vEthernet。打开属性转到网络选项卡,选择 TCP/IPv4,然后单击属性按钮并复制 IP。

    在 Eclipse 中,运行 -> 调试配置,使用 IP(屏幕截图显示 Linux 的 IPv4,Windows 为 172.26.48.1)和公开端口(即 7074)。

享受!!

【讨论】:

以上是关于将 Eclipse 连接到 Docker 容器以进行远程调试的主要内容,如果未能解决你的问题,请参考以下文章

使用 Docker-Compose 时,使用 JPDA 进行远程调试不会通过 Eclipse 连接到 Tomcat

如何将 Grafana 的 Docker 容器连接到 MySql 的 Docker 容器?

从 Docker 容器将 PySpark 连接到 Kafka

将 NodeJS Docker 容器连接到 MySQL Docker 容器 - docker-compose 3

如何将nodeJS docker容器连接到mongoDB

将 docker 容器中运行的 JavaScript 连接到另一个 docker 容器上运行的 MySQL 数据库