PAYATHON 2026

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 远程调试接口具有较高权限。不要在不可信网络上开放监听端口。如果只需本机调试,优先限制监听范围,并通过防火墙控制访问。

备注:内容仅供参考。