Skip to content

Windows Subsystem for Linux & Docker Desktop & smartdns

PikuZheng edited this page Sep 17, 2022 · 1 revision

说明:以下操作基于 Windows Server 2022 Datacenter(msdn镜像安装)。我没有 Windows 10 且所有硬件不支持 Windows 11

  1. 添加功能 Windows Subsystem for Linux 和 Virtual Machine Platform
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /featurename:Microsoft-Windows-Subsystem-Linux
  1. 安装适用于 x64 计算机的 WSL2 Linux 内核更新包

  2. 安装一个 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。

  1. 下面有两种方法来安装运行 docker,一是在 linux 内安装原生 docker 服务;二是安装 Docker Desktop。为方便起见,此处选用第2种方法。

下载并安装 Docker Desktop for Windows,安装后按提示重启。

  1. 重启后默会自动运行 docker-desktop,第一次启动挺慢的。启动后在 settings - resourcs - wsl intergration 中 启用 integration with additional distros

image

  1. 此后即可关闭 docker-desktop 界面,直接 docker 命令即可。

个人感觉这个 docker-desktop 界面除了看看状态,再没啥用途了。没法建容器,也没法修改容器的配置,删倒是能删。

image

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 段不相干

image

所以如果是桥接容器,需要几次端口映射

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] 的确是两个不同的服务。所以如果端口不通,只能一点一点查究竟是在哪个环节断开的