Docker host 网络模式下 GoLand 如何连接 Delve?
结论
在 Docker 使用 network_mode: host 时,可以通过 GoLand 连接 Delve。Docker Engine 运行在 Linux 上时,容器与宿主机共享网络命名空间,调试端口会直接在该命名空间中监听,通常无需配置 Docker 的 ports 端口映射。GoLand 应连接运行 Docker Engine 的主机地址和 Delve 监听端口。
这个场景需要使用 host 网络模式,可以保留现有配置。重点检查 Delve 是否已启动并监听预期端口,以及 GoLand 填写的主机和端口是否正确。
配置 Delve 监听地址
例如,让 Delve 以 headless 模式监听 2345 端口:
dl v --headless --listen=0.0.0.0:2345 --api-version=2 --accept-multiclient exec /path/to/app
上面命令中的 dl v 应写作 dlv,完整命令如下:
dlv --headless --listen=0.0.0.0:2345 --api-version=2 --accept-multiclient exec /path/to/app
将 /path/to/app 替换为容器内 Go 可执行文件的实际路径。如果使用 dlv debug 启动调试目标,请根据项目的启动方式调整命令和参数。
0.0.0.0 表示在所有 IPv4 网络接口上监听。如果 GoLand 运行在同一台 Linux 主机上,也可以让 Delve 只监听回环地址,然后在 GoLand 中连接 127.0.0.1:2345。如果 GoLand 运行在另一台机器上,则需要让 Delve 监听该机器可以访问的地址,并在 GoLand 中填写 Docker 主机地址。
检查 Docker 与 GoLand 配置
Compose 配置可以保留 host 网络模式:
services:
app:
network_mode: host
在 Linux host 网络模式下,容器与宿主机共享网络命名空间,通常无需配置 ports。在 GoLand 的 Go Remote 配置中,填写运行 Docker Engine 的主机地址和 2345 端口,并确认本地项目目录到容器内源码目录的路径映射正确。
启动容器后,可以在 Docker 主机上运行以下命令,检查端口是否正在监听:
ss -lntp | grep 2345
也可以从 GoLand 所在的机器测试该地址和端口是否可达。如果没有监听记录,先检查容器启动命令、Delve 参数和进程日志。如果端口正在监听但仍无法连接,再检查主机防火墙、网络路由和 GoLand 中填写的目标地址。
注意事项
Docker host 网络模式在不同操作系统和部署方式下的表现可能不同。以上关于网络命名空间的说明适用于 Docker Engine 运行在 Linux 主机上的常见情况。使用 Docker Desktop 时,请确认当前版本和配置对 host 网络的支持方式,并以实际运行环境为准。
Delve 远程调试接口具有较高权限。不要在不可信网络上开放监听端口。如果只需本机调试,优先限制监听范围,并通过防火墙控制访问。
备注:内容仅供参考。
