JVisualVM 远程链接 Docker 中的 JVM

本文详细介绍了如何通过配置JVM参数来启用JMX远程监控,包括设置主机名、端口、认证和SSL等。同时,展示了如何配置程序在内存溢出时自动创建堆转储文件,以及指定其保存路径。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 程序启动时增加如下配置

-Djava.rmi.server.hostname=ip
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.rmi.port=7098
-Dcom.sun.management.jmxremote.port=7099
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/app/gc.hprof 

jar 程序启动命令 

java  
-Djava.rmi.server.hostname=ip 
-Dcom.sun.management.jmxremote 
-Dcom.sun.management.jmxremote.rmi.port=7098 
-Dcom.sun.management.jmxremote.port=7099 
-Dcom.sun.management.jmxremote.authenticate=false 
-Dcom.sun.management.jmxremote.ssl=false 
-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/app/gc.hprof 
-jar
xxx.jar

7098 为 jstatd 链接

7099 为 jmx 链接

docker 中启动也需要带入JVM参数,并且将 7098,7099端口映射到外部即可

 

内存泄露设置错误记录文件位置及文件名

-XX:+HeapDumpOnOutOfMemoryError 
-XX:HeapDumpPath=/app/gc.hprof 

### 如何配置和实现远程连接到 Docker 守护程序 #### 修改 Docker 服务配置以暴露远程交互端口 要使 Docker 支持远程访问,需修改其服务配置文件 `/lib/systemd/system/docker.service` 来暴露出一个用于远程通信的端口。具体操作是在 `ExecStart` 行后面追加 `-H tcp://0.0.0.0:2375` 参数[^4]。 ```bash vim /lib/systemd/system/docker.service ``` 在打开的服务配置文件中找到 `[Service]` 下面的 `ExecStart=` 行,在该行末尾添加上述参数,并保存更改: ```ini ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 ``` 完成编辑后,执行命令刷新 systemd 的配置缓存并重启 Docker 服务以便应用新的设置: ```bash systemctl daemon-reload && systemctl restart docker ``` 此时,默认情况下 Docker 将监听所有网络接口上的 TCP 2375 端口请求。 #### 使用 TLS 加密保护远程连接的安全性 对于生产环境中推荐启用传输层安全性 (TLS),这可以通过向 Docker 启动参数增加相应选项来达成。例如,如果已经准备好证书文件,则可通过下面的方式启动带有 TLS 认证机制的 Docker 守护进程[^2]: ```bash dockerd \ --debug \ --tls=true \ --tlscert=/path/to/server-cert.pem \ --tlskey=/path/to/server-key.pem \ -H tcp://<your_server_ip>:2376 ``` 这里 `<your_server_ip>` 应替换为实际服务器 IP 地址;而路径则指向自定义生成或者由 CA 授权签发的有效 SSL/TLS 证书位置。 #### Windows 环境下开放特定端口供外部访问 针对 Windows 平台而言,除了调整 Linux 上述提到的相关配置外,还需要确保防火墙允许指定端口号的数据包进入系统。通常做法是创建一条入站规则放开目标端口(比如这里的 2375 或者启用了 TLS 的 2376),从而让远端设备能够成功建立连接[^1]。 #### 编程方式与守护进程互动 一旦完成了前面几步的基础准备工作之后,就可以利用编程手段进一步增强自动化程度或是构建更复杂的应用场景了。一种常见方法就是借助第三方 Go SDK (`github.com/fsouza/go-dockerclient`) 实现对 RESTful API 的调用,进而达到操控宿主机上运行中的容器实例的目的。 ```go package main import ( "fmt" "github.com/fsouza/go-dockerclient" ) func main() { endpoint := "tcp://localhost:2375" // or use the remote server's address and port number here. client, err := docker.NewClient(endpoint) if err != nil { panic(err.Error()) } version, _ := client.Version() fmt.Printf("Docker Version: %s\n", version.Get("Version")) } ``` 以上代码片段展示了怎样通过 HTTP 协议去获取远程 Docker 主机版本信息的一个简单例子。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值