目前 wsl2 中使用了一下配置镜像了 Win11 网络,win11 是我的主机

[experimental]
hostAddressLoopback=true

[wsl2]
networkingMode=mirrored
memory=12GB               
localhostForwarding=true 

[network]
generateResolvConf = false

在 go 的容器中

package main

import (
	"fmt"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	fmt.Fprintf(w, "Hello, World!")
}

func main() {
	http.HandleFunc("/", handler)

	// 10.60.33.53 是我 Win11 上的 ipv4 地址
	err := http.ListenAndServe("10.60.33.53:8080", nil)
	if err != nil {
		fmt.Println("Error starting server:", err)
	}
}

通过运行会报错 listen tcp 10.60.33.53:8080: bind: cannot assign requested address

当然把 10.60.33.53 换成 0.0.0.0 肯定是没问题的,但是下面要说才是问题
我使用的 kratos 框架,然后启动的时候会去 consul 注册(这个是局域网其他机器上的),
尴尬的事情来了,
如果使用 ip 指定 0.0.0.0 那么最后注册到 consul 中的 ip 是容器内( 192.168.65.6 )的 ip 就导致健康检测不了,
但是如果我用 10.60.33.53 启动就会导致上面那个小例子的报错,
所以想问寻求大佬们有没有什么比较好一点解决方案,
目前的解决方案就是通过 0.0.0.0 启动,
然后在代码里修改 consul 注册和检测的 ip 为 10.60.33.53
但是这种侵入式的方案不行

本人是 go 小白真心求解答,谢谢

举报· 515 次点击
登录 注册 站外分享
4 条回复  
nigi 楼主 小成 2 小时前
我感觉这个是 docker 和 wsl 之间的问题
nigi 楼主 小成 2 小时前
最好的解决办法是容器内可以把服务绑到宿主机 ip 上,但是这好像不太可能
wangritian 小成 2 小时前
试试容器用 host 模式启动?
nigi 楼主 小成 2 小时前
@wangritian go 容器用的就是 host 模式,我其实不是很明白,程序为什么会把 0.0.0.0 解析成容器的 ip
返回顶部