DockerDesktop替换方案
背景
由于DockerDesktop并非开源软件,如果在公司使用,可能就有一些限制,那是不是除了使用DockerDesktop外,就没其它办法了呢,现在咱们来说说替换方案。
WSL
WSL是什么,可自行百度,这里引用WSL百度百科,下面咱们直接进入主题
开启子系统
需要管理员权限执行下面操作,打开CMD或PowerShell
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
也可以通过下面方法启用,打开开始菜单,输入启用或关闭Windows功能,在弹出菜单中,勾选虚拟机平台和适用于 Linux 的 Windows 子系统,确定后重启系统生效。
检查系统版本
对于x86_64 系统:操作系统win 10版本是1903 或更高版本,内部版本为 18362.1049 或更高版本,Win 11也可以的,下面命令检查系统版本
winver
启动虚拟机功能
管理员权限运行,CMD或PowerShell都可以
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
更新Linux内核包
如果有必要的话,可以更新下,下载安装x86_64机器的更新包
下载地址 安装也是需要管理员权限。
更新WSL版本
更新不了,不更新可以用的话,也是OK的
wsl --update [--web-download http://xxxx]
--web-download 可选项,从指定地址下载而不是Microsoft Store 下载最新更新
检查WSL状态
wsl --status
默认分发:OracleLinux_8_5
默认版本:2
上面输出默认版本不是2,可更改为2版本
wsl --set-default-version 2
安装WSL包
这个WSL包,其实就是一个Linux系统了,选择自己熟悉的就OK,可以安装1个或多个,不过一般一个就OK,除非需要在不同系统做测试。
下面的系统,自行选择下载。
- Ubuntu 24.04
- Ubuntu 22.04 LTS
- Ubuntu 20.04
- Debian GNU/Linux
- openSUSE Tumbleweed
- SUSE Linux Enterprise Server 15 SP3
- openSUSE Leap 15.3
- Oracle Linux 8.5
- Oracle Linux 7.9
- Fedora Remix for WSL
下载后是一些.Appx,.AppxBundle等后缀的文件,双击即可安装,如果不行,可通过命令行安装,打开Powershell执行
Add-AppxPackage .\xxx.Appx
Add-AppxPackage .\xxx.AppxBundle
安装好后,可在开始菜单中找到,单击即可打开,需要为新的 Linux 分发版创建用户帐户和密码,这个就类似进入操作系统的用户名和密码,自己用设置123456亦可,后续忘记密码,也可以wsl -u root -d Ubuntu_22.04进入根目录,然后执行passwd更改密码。
wsl具体的使用命令可自行搜索,此处略。
进入wsl子系统后,sudo su - 切换到root用户。
跨文件系统工作
1、windows的盘自动默认挂载到了/mnt下。
2、windows下可执行这查看子系统目录
start \\wsl$
3、借助 WSL,Windows 和 Linux 工具和命令可互换使用。
- 从 Linux 命令行运行 Windows 工具(即 notepad.exe)
- 从 Windows 命令行(如 PowerShell)运行 Linux 工具(如 grep)
- 在 Linux 和 Windows 之间共享环境变量
使用 Linux 命令 ls -la 列出文件,并使用 PowerShell 命令 findstr 来筛选包含“go”的单词。
wsl ls -la | findstr "go"
使用 PowerShell 命令 dir 列出文件,并使用 Linux 命令 grep 来筛选包含“go”的单词
C:\> dir | wsl grep go
使用 Linux 命令 ls -la 列出 /proc/cpuinfo Linux 文件系统路径中的文件
C:\> wsl ls -la /proc/xxxx
在linux下也可以使用win的命令
ls -la | findstr.exe /etc/passwd
用win的记事本编辑WSL里的文件
notepad.exe "E:\yyy.txt"
4、禁用互操作特性
使用 root 身份运行以下命令,禁用针对单个 WSL 会话运行 Windows 工具的功能
echo 0 > /proc/sys/fs/binfmt_misc/WSLInterop
若要重新启用 Windows 二进制文件,请退出所有 WSL 会话并重新运行 bash.exe,或者以 root 身份运行以下命令:
echo 1 > /proc/sys/fs/binfmt_misc/WSLInterop
注意:每次切换 WSL 会话后,禁用互操作的结果不会持久保留 – 启动新会话后,会再次启用互操作。
WSL设置
wsl.conf 和 .wslconfig 文件用于针对每个发行版 (wsl.conf) 和全局跨所有 WSL 2 发行版 (.wslconfig) 高级设置选项,为已安装的 Linux 发行版配置设置,使它们在你每次启动 WSL 时自动应用
- wslconfig 用于在 WSL 2 上运行的所有已安装发行版中配置全局设置
- wsl.conf 用于为在 WSL 1 或 WSL 2 上运行的每个 Linux 发行版按各个发行版配置本地设置
必须停止所有的wsl版本超过8s,配置才会生效
# 关闭所有
wsl --shutdown
wsl.conf
使用 wsl.conf 为 WSL 1 或 WSL 2 上运行的每个 Linux 发行版按各个发行版配置本地设置
文件位于每个wsl的目录/etc/wsl.conf,没有可创建,支持五个部分:automount、network、interop 、boot和 user
下面是示例文件
# Automatically mount Windows drive when the distribution is launched
[automount]# Set to true will automount fixed drives (C:/ or D:/) with DrvFs under the root directory set above.
# Set to false means drives won't be mounted automatically, but need to be mounted manually or with fstab.
enabled = true# Sets the directory where fixed drives will be automatically mounted.
# This example changes the mount location, so your C-drive would be /c, rather than the default /mnt/c.
root = /mnt# DrvFs-specific options can be specified.
options = "metadata=disabled,uid=1001,gid=1001,umask=022,fmask=000,case=off"# Sets the `/etc/fstab` file to be processed when a WSL distribution is launched.
mountFsTab = true# Network host settings that enable the DNS server used by WSL 2.
# This example changes the hostname, sets generateHosts to false, preventing WSL from the default behavior of auto-generating /etc/hosts, and sets generateResolvConf to false, preventing WSL from auto-generating /etc/resolv.conf, so that you can create your own (ie. nameserver 1.1.1.1).
[network]
# wsl 的主机名
# hostname = DemoHost
generateHosts = true
generateResolvConf = true# Set whether WSL supports interop processes like launching Windows apps and adding path variables.
# Setting these to false will block the launch of Windows processes and block adding $PATH environment variables.
# 在预览体验成员内部版本 17713 和更高版本中可用
[interop]
# 是否支持启动 Windows 进程
enabled = false
# 是否会将 Windows 路径元素添加到 $PATH 环境变量
appendWindowsPath = false# Set the user when launching a distribution with WSL.
[user]
default = appuser# Set a command to run when a new WSL instance launches. This example starts the Docker container service.
[boot]
# 仅在 Windows 11 和 Server 2022 上可用
command = service docker start
# 启用systemd支持
systemd=true
如果启用了systemd,则应禁用或屏蔽可能导致 WSL 问题的单元。 以下已知会导致 WSL 分发中问题的单元:
- systemd-resolved.service
- systemd-networkd.service
- NetworkManager.service
- systemd-tmpfiles-setup.service
- systemd-tmpfiles-clean.service
- systemd-tmpfiles-clean.timer
- systemd-tmpfiles-setup-dev-early.service
- systemd-tmpfiles-setup-dev.service
- tmp.mount
.wslconfig
为 WSL 2上运行的所有已安装的发行版配置全局设置,默认该文件不存在,必须创建并存储在
%UserProfile%
目录中才能应用这些配置设置,打开该位置
start %UserProfile%
示例文件
# Settings apply across all Linux distros running on WSL 2
[wsl2]# Limits VM memory to use no more than 4 GB, this can be set as whole numbers using GB or MB
memory=4GB # Sets the VM to use two virtual processors
processors=2# Specify a custom Linux kernel to use with your installed distros.
# The default kernel used can be found at https://github.com/microsoft/WSL2-Linux-Kernel
# kernel=C:\\temp\\myCustomKernel# Sets additional kernel parameters, in this case enabling older Linux base images such as Centos 6
# kernelCommandLine = vsyscall=emulate# 是否在“安全模式”中运行 WSL,这会禁用许多功能,应用于恢复处于错误状态的发行版
# 仅适用于 Windows 11 和 WSL 版本 0.66.2+
safeMode = false# Sets amount of swap storage space to 8GB, default is 25% of available RAM。0 表示无交换文件
swap=1GB# Sets swapfile path location, default is %USERPROFILE%\AppData\Local\Temp\swap.vhdx
swapfile=D:\\soft\\wk\\wsldata\\wsl-swap.vhdx# Windows 是否能够回收分配给 WSL 2 虚拟机的未使用内存
# Disable page reporting so WSL retains all allocated memory claimed from Windows and releases none back when free
pageReporting=true# 在 WSL 中打开或关闭对 GUI 应用程序的支持
guiApplications = true# Turn on default connection to bind WSL 2 localhost to Windows localhost. Setting is ignored when networkingMode=mirrored
localhostforwarding=true# 用于打开或关闭嵌套虚拟化的布尔值,使其他嵌套 VM 能够在 WSL 2 中运行。 仅适用于 Windows 11
# Disables nested virtualization
nestedVirtualization=false# 用于在 WSL 2 发行版实例启动时打开显示 dmesg 内容的输出控制台窗口。 仅适用于 Windows 11
# Turns on output console showing contents of dmesg when opening a WSL 2 distro for debugging
debugConsole=false# VM 在关闭之前处于空闲状态的毫秒数。 仅适用于 Windows 11
vmIdleTimeout = 60000# 仅适用于 networkingMode = NAT。
# 通知 WSL 将 Linux 中的 DNS 服务器配置为主机上的 NAT
# 设置为 false 会将 DNS 服务器从 Windows 镜像到 Linux
dnsProxy = true# 如果值为 mirrored,则会启用镜像网络模式。
# 默认或无法识别的字符串会生成 NAT 网络。需要 Windows 11 版本 22H2 或更高版本
networkingMode = NAT# 如果设置为 true,则 Windows 防火墙规则以及特定于 Hyper-V 流量的规则可以筛选 WSL 网络流量
# 需要 Windows 11 版本 22H2 或更高版本
firewall = true# 是否将 DNS 请求从 WSL 代理到 Windows 的方式。需要 Windows 11 版本 22H2 或更高版本
dnsTunneling = true# WSL 是否使用 Windows 的 HTTP 代理信息。仅在 Windows 11 中可用
autoProxy = true# 设置存储 Linux 发行版(例如 Ubuntu)文件系统的虚拟硬盘 (VHD) 大小
# 可用于限制分发文件系统允许占用的最大大小
defaultVhdSize = 200GB# Enable experimental features
[experimental]
# 检测空闲 CPU 使用率后,自动释放缓存的内存
# 设置为 gradual 以慢速释放,设置为 dropcache 以立即释放缓存的内存
# disabled 禁用
autoMemoryReclaim = dropcache# 如果设置为 true,则任何新创建的 VHD 将自动设置为稀疏虚拟硬盘文件
# 只分配实际使用的磁盘空间,而不是预先分配整个文件大小的磁盘空间
sparseVhd = true# 仅当 wsl2.dnsTunneling 设置为 true 时才适用
# 如果设置为 true,Windows 将从 DNS 请求中提取问题并尝试解决该问题,从而忽略未知记录
# 需要 Windows 11 版本 22H2 或更高版本
bestEffortDnsParsing = false# 仅当 wsl2.dnsTunneling 设置为 true 时才适用
# 指定启用 DNS 隧道的情况下将在 Linux resolv.conf 文件中配置的 nameserver
# 需要 Windows 11 版本 22H2 或更高版本
# dnsTunnelingIpAddress = 10.255.255.254 # 仅当 wsl2.autoProxy 设置为 true 时才适用
# 配置启动 WSL 容器时,WSL 等待检索 HTTP 代理信息的时长(以毫秒为单位)
# 如果代理设置在此时间之后解析,则必须重启 WSL 实例才能使用检索到的代理设置
# 仅在 Windows 11 中可用
initialAutoProxyTimeout = 1000# 仅当 wsl2.networkingMode 设置为 mirrored 时才适用
# 指定 Linux 应用程序可以绑定到哪些端口(即使该端口已在 Windows 中使用)
# 通过此设置,应用程序能够仅侦听 Linux 中的流量端口
# 因此即使该端口在 Windows 上用于其他用途,这些应用程序也不会被阻止
# 例如,WSL 将允许绑定到 Linux for Docker Desktop 中的端口 53,因为它只侦听来自 Linux 容器中的请求
# 需要 Windows 11 版本 22H2 或更高版本
# ignoredPorts = 3000,9000,9090# 仅当 wsl2.networkingMode 设置为 mirrored 时才适用
# 如果设置为 True,将会允许容器通过分配给主机的 IP 地址连接到主机,或允许主机通过此方式连接到容器
# 始终可以使用 127.0.0.1 环回地址,此选项也允许使用所有额外分配的本地 IP 地址
# 仅支持分配给主机的 IPv4 地址
# 需要 Windows 11 版本 22H2 或更高版本
hostAddressLoopback = false
更换wsl默认安装位置
wsl默认安装到了
C:\Users\开机账号\AppData\Local\Packages下的
比如类似这样的:4210OracleAmericaInc.OracleLinux8.5_dm93watqnc2oz
每个子系统一个文件夹,该子目录下的LocalState文件夹里就一个文件,占用空间很大,我们可以通过导出导入方式进行更改。
导出wsl
wsl --export 默认是tar格式
wsl --export Ubuntu D:/XXX/Ubuntu.tar
wsl --export OracleLinux_8_5 E:/wsl/OracleLinux_8_5.tar
取消wsl注册
wsl --unregister <DistributionName>
取消注册后,LocalState文件夹下的大文件被自动删除,运行 wsl --list 将不会再列出
wsl --ungerister Ubuntu
wsl --ungerister OracleLinux_8_5
导入wsl
wsl --import
wsl --import Ubuntu E:/wsl/ubuntu Ubuntu.tar
wsl --import OracleLinux_8_5 E:/wsl/oracleLinux OracleLinux_8_5.tar
podman
Podman是开源软件,大多数公司应该都允许直接使用,其实就是几个二进制命令文件而已,下载地址
Podman Desktop是一个可视化的操作界面,不安装这个也是OK的,熟悉命令的话,类似Docker和Docker Desktop的关系。
完成后,在命令行执行
# 这个需要下载一些东东,要花一些时间
podman machine init
# 启动
podman machine start
# 查看镜像
podman images
# 拉取镜像
podman pull apache/flink
上面在执行podman machine init时,默认安装podman-machine-default在了C盘,并且磁盘增加,即使删除一些镜像后不会缩小,如何更改位置,可自行研究下,目前本人还没尝试更改。由于podman也依赖于wsl,因此本人直接使用的就是wsl。