Table Of Contents

相对于Linux对容器化开发的良好支持(或者说各个容器化平台和工具对Linux更好的支持),在Windows下对应用进行容器化改造时的本地构建和测试并不是很直接和方便。这里记录一下,针对不同场景的相关实践经验。

目标

  • 支持docker构建
  • 支持kubernetes容器服务编排

WSL

WSL (Windows subsystem for Linux) 是win10新增的一个功能,可以直接在Windows上运行本机Linux命令工具。之前大家一般会去用Cgwin (或MingGw)工具。

WSL 提供一个名为 Bash.exe 的应用程序,启动该应用程序后,会打开一个运行 Bash shell 的 Windows 控制台。 使用 Bash 可以运行命令行 Linux 工具和应用。

具体介绍可以参考微软提供的WSL文档

WSL1 并没有一个完整的Linux内核,系统调用使用Windows Pico进程使用驱动翻译成NT API模拟成Linux内核的。具体架构可以参考WSL的系统架构

最近更新的WSL引入了微软提供的一个完整的Linux内核,增强了文件IO性能及完整的系统调用兼容性。这也意味着我们可以通过WSL2以Linux中的方式运行docker和kubernetes (这里我们使用microk8s)。

Windows下可直接使用WSL里Linux命令, 如netstat -an | wsl grep :8443, 在pipe后面加上wsl即可

适用场景

  • 版本要求

    Win10 Version 2004, Build 19041 + (目前需要加入每月更新的预览版计划)

  • Hyper V支持 (需要Windows支持,同时需要设备支持硬件虚拟化)

优点

与Windows命令窗口和文件系统无缝集成,开发起来十分方便。在当前窗口输入bash就可以进入Linux下对应的目录;同时还有VSCode Remote WSL的支持。

安装配置

启用Hyper V和Linux子系统

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux -NoRestart
Enable-WindowsOptionalFeature -Online -FeatureName VirtualMachinePlatform

然后重启

下载安装最新的WSL2 Linux内核并安装, 参考https://docs.microsoft.com/en-us/windows/wsl/wsl2-kernel

设置默认WSL版本为2

wsl --set-default-version 2

从微软商店下载安装Ubuntu 20.04 LTS.

安装完毕后,启动Ubuntu Bash, 初始化相应配置。

因为wsl没有pid为1的进程,所以systemd无法使用。这里snapcraft论坛给出了一个解决办法

# Create the starting script for SystemD
vi /etc/profile.d/00-wsl2-systemd.sh
SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
PWD=$(pwd)

if [ -z "$SYSTEMD_PID" ]; then
   sudo /usr/bin/daemonize /usr/bin/unshare --fork --pid --mount-proc /lib/systemd/systemd --system-unit=basic.target
   SYSTEMD_PID=$(ps -ef | grep '/lib/systemd/systemd --system-unit=basic.target$' | grep -v unshare | awk '{print $2}')
fi

if [ -n "$SYSTEMD_PID" ] && [ "$SYSTEMD_PID" != "1" ]; then
    exec sudo /usr/bin/nsenter --wd="$PWD" -t $SYSTEMD_PID -a su $LOGNAME
fi

然后就可以按照官方文档安装docker和用snap命令安装microk8s了。

Tip: 如果00-wsl2-systemd.sh出现错误,可以使用用管理员打开cmd窗口执行bash -c "vim /etc/profile.d/00-wsl2-systemd.sh"方式编辑修改解决 (可以通过该方法修改,但无法删除文件)

multipass

multipass可以在各个操作系统平台,使用系统内置虚拟化管理程序(如hyper-v, virtualbox),提供一个mini云平台。

适用场景

  • 在开发设备构建类似于生产的云环境
  • 需要设备支持硬件虚拟化

优点

适用范围广,能在本地的开发设备上迅速构建一个便于使用的云环境。

安装配置

从它的github发布页面下载最新版本https://github.com/canonical/multipass/releases.

启用hyper-v或者安装virtualbox, 默认使用hyper-v,如果使用virtualbox,需要执行下面的命令

multipass set local.driver=virtualbox

启动一个primary实例

multipass launch --name primary

在实例中执行命令

multipass exec primary -- bash
# 或者
multipass shell

使用multipass mount命令可以将本地文件mount到虚拟机,使用multipass transfer命令可以在宿主机和虚拟机之间传输文件。具体参考https://multipass.run/docs

远程连接

docker和kubernetes都支持远程连接方式控制,除了在本地安装docker/kubernetes外,我们可以选择在服务器上安装好docker/kubernetes,然后配置好远程连接,在windows上像本地一样使用容器服务

适用场景

  • 本地无法安装docker/kubernetes服务
  • 需要与其他开发者共享容器化服务

安装配置

docker -> 开启服务和证书 https://docs.docker.com/engine/security/https/

kubernetes -> kubeconfig文件

参考