-
Notifications
You must be signed in to change notification settings - Fork 11
Windows Subsystem for Linux & Docker Desktop & smartdns
说明:以下操作基于 Windows Server 2022 Datacenter(msdn镜像安装)。我没有 Windows 10 且所有硬件不支持 Windows 11
- 添加功能 Windows Subsystem for Linux 和 Virtual Machine Platform
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /featurename:Microsoft-Windows-Subsystem-Linux
-
安装一个 linux kernel
可以使用 “wsl --install -d ”在线安装一个Ubuntu、Debian之类的。由于精简起见,此处选用 https://github.com/yuk7/AlpineWSL 项目。下载解压后运行 alpine.exe 即可。
输入命令wsl -l -v
检查版本,如果显示 VERSION 1,需要输入命令wsl --set-version alpine 2
切换为 VERSION 2。
- 下面有两种方法来安装运行 docker,一是在 linux 内安装原生 docker 服务;二是安装 Docker Desktop。为方便起见,此处选用第2种方法。
下载并安装 Docker Desktop for Windows,安装后按提示重启。
- 重启后默会自动运行 docker-desktop,第一次启动挺慢的。启动后在 settings - resourcs - wsl intergration 中 启用 integration with additional distros
- 此后即可关闭 docker-desktop 界面,直接 docker 命令即可。
个人感觉这个 docker-desktop 界面除了看看状态,再没啥用途了。没法建容器,也没法修改容器的配置,删倒是能删。
healthy 都没有,太简陋了。
端口映射问题
看了一下启用 WSL 后系统里会多出一个 WSL 虚拟网卡,并有一个奇怪的随机 ip 地址
C:\Users\Administrator>ipconfig
Windows IP 配置
以太网适配器 Ethernet0 2:
(此处省略)
以太网适配器 vEthernet (WSL):
连接特定的 DNS 后缀 . . . . . . . :
本地链接 IPv6 地址. . . . . . . . : fe80::39ab:f41a:55f7:70b1%28
IPv4 地址 . . . . . . . . . . . . : 172.29.176.1
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :
对应 WSL 内部有一个同段 ip
C:\Users\Administrator>wsl -- ifconfig
eth0 Link encap:Ethernet HWaddr 00:15:5D:ED:44:B6
inet addr:172.29.181.214 Bcast:172.29.191.255 Mask:255.255.240.0
inet6 addr: fe80::215:5dff:feed:44b6/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:347 errors:0 dropped:0 overruns:0 frame:0
TX packets:58 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:78302 (76.4 KiB) TX bytes:7569 (7.3 KiB)
lo (以下省略)
但是容器有自己的 ip 段且与 WSL ip 段不相干
所以如果是桥接容器,需要几次端口映射
Windows 物理网卡 <-> Windows WSL 网卡 <-> Linux WSL 网卡 <-> Docker 桥接网卡
常见问题是 Docker 桥接网卡默认是个 /16 的网段,如果和其他网卡网段重叠就会导致网络不通。另外
C:\Users\Administrator>netstat -a -n -o | findstr 53
TCP 0.0.0.0:53 0.0.0.0:0 LISTENING 9620
TCP [::]:53 [::]:0 LISTENING 9620
TCP [::1]:53 [::]:0 LISTENING 5344
UDP 0.0.0.0:53 *:* 9620
UDP 0.0.0.0:53 *:* 3524
UDP [::]:53 *:* 9620
看了一下9620是com.docker.backend.exe,5344是wslhost.exe,也就是说 127.0.0.1 和 [::1] 的确是两个不同的服务。所以如果端口不通,只能一点一点查究竟是在哪个环节断开的