相对于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文件