目前 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 小白真心求解答,谢谢
1
nigi OP 我感觉这个是 docker 和 wsl 之间的问题
|
2
nigi OP 最好的解决办法是容器内可以把服务绑到宿主机 ip 上,但是这好像不太可能
|
3
wangritian 2 天前
试试容器用 host 模式启动?
|
4
nigi OP @wangritian go 容器用的就是 host 模式,我其实不是很明白,程序为什么会把 0.0.0.0 解析成容器的 ip
|
5
luodan 2 天前
为什么不在 win11 直接跑 docker ,而是在 wsl2 里跑呢?
|
6
fox0001 2 天前 via Android
我遇到过类似问题,wsl2 里跑的容器,只能本机访问。需要设置类似“端口映射”,其他机器才能访问
|
7
huntagain2008 2 天前 via iPhone
我小白理解的 #5 的意思:用 Windows 容器而不是 wsl2 。
|
8
paranoiagu 2 天前 via Android
wsl2 能不能用桥接模式?和 windows 分别接入局域网,获取 2 个独立 ip ?我也是用 mirror , 但也发现一些问题。
|
10
nigi OP @paranoiagu 其实应该和 wsl2 没什么关系,我猜的,因为所有网络已经镜像了 windows ,本质上应该没什么区别,共用一个 ip
|
11
zed1018 2 天前
@huntagain2008 我觉得可能说的是 docker for desktop 官方的 wsl backend ,而不是在自己的 wsl distro 里装 docker-ce
|
13
eleba 2 天前
networkingMode=mirrored 这个改成 nat 试试 删掉一这行
|
14
lisxour 2 天前
我这里歪个楼,wsl/wsl2 + docker ,除非迫不得已,真别用,我就说个最简单但又最抓狂的情况,有的东西只能在官方 docker for desktop 自带的那个 distro 里安装,而有的东西又明确了不能用 docker for desktop ,必须是自己纯洁拉的系统,然后自己装的 docker ,这 tm 就很抓狂了,而这种冰山下的问题一旦遇到了,解决起来真的掉一斤头发。
我常年使用 wsl ,但已经限得很死,只做简单的事情,千万别当是一个正常的 linux 虚拟机使用,在 wsl 下遇到的各种奇葩问题比我在正常 linux 下用一辈子都多得多,施主,趁现在陷得不深,脱离苦海吧。 |
16
Stevenv 2 天前
我的建议是别用 WSL 任何版本
|
17
body007 2 天前
已经从 wsl2 换回 VMware 虚拟 Linux 了。最大的问题就是网络,遇到有些问题甚至需要防火墙放通 wsl 网卡才行。有时候还会使得 window 写的 go 程序无法监听端口,只能重启 winnat 服务才正常,没用 wsl 时都没遇到这种问题。
|
18
3085570450tt 2 天前
@lisxour windows 上使用 docker ,官方推荐的方式就是 docker for desktop + wsl2 。
不要说的模糊,具体举个例子或者指个路 > 有的东西只能在官方 docker for desktop 自带的那个 distro 里安装,而有的东西又明确了不能用 docker for desktop 有的东西明确不能用 docker for desktop, 难道 wsl2 作为 backend 是摆设? wsl 已经更新到 wsl2 了 |
19
xiaochong0302 2 天前
我也折腾过,后来还是回到了 virtualbox 虚拟机和 windows 共享文件,写代码还是在 windows 下,运行在 linux ,稳得一批。
|
20
BeautifulSoap 2 天前 2
其实和 wsl2 关系倒不大,正确做法就是应该把监听 ip 和注册 ip 分开来的
因为实际项目中监听 ip 和注册 ip 分离的情况非常多的。比如 aws ec2 ,甲骨文 instance ,阿里云实例这些云 instance ,你实际上没法直接给 instance 分配公网 ip ,它们只能拿到 vpc 内的局域网 ip 。公网 ip 是通过 vpc 中的路由表直接把公网 ip 的流量全部路由到 instance 上实现的 所以对于这些 instance ,它们可以认为有公网 ip ,但系统里又根本没有被分配公网 ip 。这时候你直接拿监听 ip 当注册 ip 永远无法注册正确 ip 。所以实际上将这两个 ip 完全分开才是正确的做法 |
21
lisxour 2 天前
@Nasei
@3085570450tt 1panel 就是,参考: https://xiaomeng.feishu.cn/wiki/wikcnA2jU2Vfp42lkKJLLuKbKRd ,我自己亲试遇到了各种莫名其妙的问题,其中一个的相关 issue: https://github.com/1Panel-dev/1Panel/issues/4113 ,我没法将这些摸不着头脑的错误归咎给谁,wsl ? docker ? 1panel ?但是我作为用户角度,当使用的时候遇到这类问题,真的会疯。还有另一个也是由于 wsl 导致的,我当时查到凌晨 4 点才查到问题,https://www.liesauer.net/blog/post/933.html 对了,我说的 wsl 通指 wsl1 和 wsl2 ,wsl2 虽然改进了很多,但依然存在一个最核心的问题,那就是用起来有各种各样在 wsl 才有的问题 |
22
boer0924 2 天前
WSL2 -> Listen 0.0.0.0:xxxx
WINs -> Visit localhost:xxxx |
24
lisxour 2 天前
@rayae 我是微软商店下载的 Ubuntu + Docker for Desktop + 官方安装脚本,最终用起来却各种报错,那你说说我的个人原因是啥?我贴出来只是想说明确确实实有这类问题,但不是说我就是一摸一样的情况,我自身是完完全全按照标准流程走的,但就是出问题,那你说我个人问题出在哪?
|
25
asdhak 2 天前
网络用 nat ,访问 wsl 的地址用 虚拟机 etch0 的那个地址。访问外部物理机用跟 etch0 同一网端的。应该是 172.21 开头
|
26
Nazz 2 天前 via Android
WSL 的网络很迷,最好换 VMware 桥接
|
27
CodeAllen 1 天前
不如用 HyperV 开一台 Ubuntu 虚拟机,直接安装完整版 docker ,wsl 搞 docker 真的头大
|
28
xgq89757 1 天前
http.ListenAndServe("10.60.33.53:8080", nil)
改成 http.ListenAndServe("0.0.0.0:8080", nil) 呢 |
29
lpdink 1 天前 via Android
wsl 和 windows 宿主可以用独立虚拟网卡接入上游路由器获取两个独立的局域网 ip 的。
|
30
neoblackcap 1 天前
@BeautifulSoap 说得对,而且实际上生产环境不同 IP 很有可能就代表不同的网络环境(VPC/公网)。内部服务肯定是要走 VPC 网络的
|
31
iv8d 1 天前
常年使用 wsl ,基本都是单机使用,目前暂时没遇到过问题
|