将 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
-
仅适用于 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