将 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 容器中可以被

远程调试
  1. 为容器中的 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,应用程序将正常启动,允许远程调试器稍后连接。

  2. 正在连接到进程,例如通过你的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 中连接远程调试,您可以按照以下步骤操作:

  1. 将这些行放入您的应用程序 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

  1. 仅对于 Linux,启动您的 docker 应用程序并搜索网络,在我的例子中是 ecs-core_default
    $ docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    e63bb0decc92        bridge              bridge              local
    94aefcdbb5f3        ecs-core_default    bridge              local
  1. 仅适用于 Linux,现在使用
  2. 检查您的应用程序的 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": ""
                }
            }
            .....
        }
    ]


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

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

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

尽情享受!!