将 Eclipse 连接到 Docker 容器以进行远程调试
Connecting Eclipse to Docker Container for Remote Debugging
我正在尝试将 Eclipse 连接到我有 运行ning 的 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
作为端口。我转到 运行->调试配置->远程 Java 应用程序,我创建了一个新的调试配置。
当我点击应用,然后调试时,我收到一个弹出错误消息 Failed to connect to remote VM.
我还需要做什么才能使远程调试正常工作?
java 应用程序 运行 在 docker 容器中可以被
远程调试
为容器中的 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主机IP可以使用docker-machine ip
显示,例如
$ docker-machine ip
192.168.99.100
通过将 localhost
替换为我的实际 IP 地址解决了这个问题。
OS: Ubuntu 18 / Windows 10
Java: OpenJdk 12
Docker 容器:Sprint 启动应用程序
要在 Eclipse 中连接远程调试,您可以按照以下步骤操作:
- 将这些行放入您的应用程序 Docker文件
# 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
$ docker network ls
NETWORK ID NAME DRIVER SCOPE
e63bb0decc92 bridge bridge local
94aefcdbb5f3 ecs-core_default bridge local
- 仅适用于 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。打开属性转到网络选项卡,select TCP/IPv4 然后单击属性按钮并复制 IP。
在 Eclipse 中,运行 -> 调试配置,使用 IP(屏幕截图显示 Linux 为 IPv4,Windows 为 172.26.48.1)和暴露的端口(即 7074)。
尽情享受!!
我正在尝试将 Eclipse 连接到我有 运行ning 的 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
作为端口。我转到 运行->调试配置->远程 Java 应用程序,我创建了一个新的调试配置。
当我点击应用,然后调试时,我收到一个弹出错误消息 Failed to connect to remote VM.
我还需要做什么才能使远程调试正常工作?
java 应用程序 运行 在 docker 容器中可以被
远程调试为容器中的 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主机IP可以使用docker-machine ip
显示,例如$ docker-machine ip 192.168.99.100
通过将 localhost
替换为我的实际 IP 地址解决了这个问题。
OS: Ubuntu 18 / Windows 10
Java: OpenJdk 12
Docker 容器:Sprint 启动应用程序
要在 Eclipse 中连接远程调试,您可以按照以下步骤操作:
- 将这些行放入您的应用程序 Docker文件
# 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
$ docker network ls NETWORK ID NAME DRIVER SCOPE e63bb0decc92 bridge bridge local 94aefcdbb5f3 ecs-core_default bridge local
- 仅适用于 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。打开属性转到网络选项卡,select TCP/IPv4 然后单击属性按钮并复制 IP。
在 Eclipse 中,运行 -> 调试配置,使用 IP(屏幕截图显示 Linux 为 IPv4,Windows 为 172.26.48.1)和暴露的端口(即 7074)。
尽情享受!!