代码之家  ›  专栏  ›  技术社区  ›  aCarella

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

  •  7
  • aCarella  · 技术社区  · 8 年前

    我的docker run命令如下:

    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应用程序,我创建了一个新的调试配置。

    my project debugging

    单击“应用”,然后单击“调试”,会弹出一条错误消息 Failed to connect to remote VM.

    cant connect

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

    3 回复  |  直到 8 年前
        1
  •  3
  •   codemonkey    8 年前

    运行在docker容器中的java应用程序可以通过以下方式进行远程调试

    1. 有可能 JDWP 对于容器中的java进程,例如。

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

      或者使用JAVA\u OPTS环境变量

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

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

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

      $ docker-machine ip
      192.168.99.100
      
        2
  •  2
  •   singhpradeep    5 年前

    操作系统: Ubuntu 18/Windows 10

    Java: OpenJdk 12

    Docker容器: Sprint启动应用程序

    要在Eclipse中连接远程调试,可以执行以下步骤:

    1. 将这些行放在应用程序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
    
    
    1. 在我的例子中,仅对于Linux,启动docker应用程序并搜索网络 ecs-core\U默认值
        $ docker network ls
        NETWORK ID          NAME                DRIVER              SCOPE
        e63bb0decc92        bridge              bridge              local
        94aefcdbb5f3        ecs-core_default    bridge              local
    
    1. 仅限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": ""
                    }
                }
                .....
            }
        ]
    
    
    
    1. 仅对于Linux,从容器“IPv4Address”:“172.18.0.6/16”中复制IP地址,即。 172.18.0.6

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

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

    享受

        3
  •  1
  •   aCarella    8 年前

    通过更换 localhost 使用我的实际IP地址。