https://blog.csdn/qq_42362605/article/details/124898062 这个教程好

介绍

wsl

WSL的全称是Windows Subsystem for Linux(适用于Linux的Windows子系统)。

平时开发大部人都是在提供了高效GUI的window下工作,但是真正部署环境普遍都是在Linux中,所以为了让开发环境和部署环境统一,我们需要在windows模拟LInux环境,以前我们可能通过虚拟机的方式实现,不过自从微软拥抱开源更加开发提供了Linux的Windows子系统(WSL)后,我们又多了一个选择,通过WSL运行linux程序(WSL比通过虚拟机来运行linux性能更强,耗费资源更小,安装linux环境最大只需要200多M)!

wsl以及 1代和2代的区别

简介

wsl:Windows Subsystem for Linux 即linux子系统
wsl 1 :第一代的wsl,用的是Windows内核模拟的各种系统接口。 下文中,WSL默认指的是 WSL1
wsl2 :微软改用虚拟机运行linux内核的版本。是一个运行在windows下的linux内核(非发行版),现在一般都用wsl2了

微软官方的介绍 https://learn.microsoft/zh-cn/windows/wsl/compare-versions

WSL 1用的是Windows内核模拟的各种系统接口。虽然可以运行大部分Linux应用,但还是有不少依赖于内核的应用是无法正常运行的——例如Docker。另外WSL 1和Windows共用文件系统、网络,有些时候会比较头疼。

而 WSL2 则与此完全不同,WSL2 是第二代 WSL,包含在2020年5月正式发布 Windows 10 v2004 版中。win10 开始内置了一个轻量级虚拟机,经过不断的优化,这个虚拟机实现了与 windows 的高度集成,实现了虚拟机的高性能运行,WSL2 便是运行在虚拟机上的一个完整的 linux 内核。

传统的 VM 体验可能启动速度慢,是独立的,消耗大量资源,需要你花费时间进行管理。 WSL 2 没有这些属性。
启用WSL2的 Linux 系统启动时间非常快,内存占用很少,并且,WSL 2 还可以直接原生运行 Docker,VS Code 编辑器还有 Remote-WSL 插件,相对于完整的 linux 虚拟机只是不支持 systemctl、systemd,不能直接运行图形桌面

可见,WSL2 与 WSL 1 的设计理念有着天翻地覆的变化,WSL 的实现方式显然更为极客,但面临一系列的生态环境和性能的问题,这条路要想走通,简直比登天还难,如今,微软放弃这条路,转而走上虚拟机优化运行原生 linux 内核这条路确实是一条一劳永逸的正路。

具体区别

WSL 2 拥有完整的 Linux 内核
WSL 2 中的 Linux 内核是 Microsoft 根据最新的稳定版分支(基于 kernel 上提供的源代码)构建的。此内核已专门针对 WSL 2 进行了调整,针对大小和性能进行了优化,以便在 Windows 上提供良好的 Linux 体验。 内核将由 Windows 更新提供服务,这意味着你将获得最新的安全修补程序和内核改进功能,而无需自行管理它。

另外,在Windows 11中WSL 2能过访问GPU,这意味着可以使用一些Linux GUI程序,同时使得使用机器学习、人工智能和数据科学等应用场景更加方便快捷。

WSL 2 有 WSL 1 的优点,包括 Windows 和 Linux 之间的无缝集成,启动时间短,资源占用量少,并且无需 VM 配置或管理。 虽然 WSL 2 确实使用 VM,但 VM 是在幕后管理和运行的,因此你将具有与 WSL 1 相同的用户体验。

docker架构介绍与wsl下的注意问题

架构介绍看另一个博客

经过几次调整WSL(用于Linux的Windows子系统,也被称为Bash for Windows)可以用于Docker for Windows。
不过令人遗憾的是目前WSL是不支持Docker的守护进程,但您可以使用Docker CLI连接到通过Docker for Windows或您创建的任何其他VM 运行的远程Docker守护进程

然而,客户端不必与守护进程安装在同一个地方。例如,您可以在开发计算机上使用本地Docker客户端与Azure中的Docker进行通信。这使我们可以让WSL中的客户端与主机上运行的守护进程通信。

零、环境准备

  • CPU支持虚拟化(任务管理器-性能-cpu-虚拟化处查看,没有自行百度主板怎么开启)
  • 系统版本要求
    Windows 11 64-bit: Home or Pro version 21H2 or higher, or Enterprise or Education version 21H2 or higher.
    Windows 10 64-bit: Home or Pro 21H1 (build 19043) or higher, or Enterprise or Education 20H2 (build 19042) or higher.
  • 使用下面的命令启用WSL2,而不要功能管理直接开启。 后面会详细介绍【新版的docker安装的时候可以选择 使用wsl2还是hvperv作为虚拟机,使用wsl2就不用hyperv了】
  • windows功能管理开启虚拟化平台

注意最好按照下面的顺序安装 避免不必要的问题

一、如何启用wsl2 与安装linux发行版

新版安装方式(全自动)

新版文档:https://learn.microsoft/zh-cn/windows/wsl/install

ps 默认情况下,安装的 Linux 分发版为 Ubuntu

#管理员模式命令行输入
wsl --install #此命令将启用运行 WSL2 并安装 Linux 默认的 Ubuntu 发行版所需的功能。
重启

wsl --set-default-version 2 这个方法只能改变默认的 如果是已经启用了的系统 则这个命令不生效
在Power Shell中输入 wsl -l -v 可以查看WSL的版本

旧版安装方式(手动)

旧版文档:https://learn.microsoft/zh-cn/windows/wsl/install-manual
简要步骤说明如下

  1. 启用适用于 Linux 的 Windows 子系统
    以管理员身份打开powershell并运行 dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
    实际上似乎相当于windows可选功能里选中适用于windows的linux子系统

建议现在转到步骤 #2,更新到 WSL 2,但如果只想安装 WSL 1,现在可以重新启动计算机,然后继续执行步骤 6 - 安装所选的
Linux 发行版。 若要更新到 WSL 2,请等待重新启动计算机,然后继续执行下一步。

  1. 更新windows系统至1903或更高版本
  2. win可选功能启用“虚拟机平台“(VirtualMachinePlatform)。 计算机需要虚拟化功能才能使用此功能。注意,可能有的找不到,需要命令行开启:
    以管理员身份打开 PowerShell 并运行:
    dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
    重新启动计算机,以完成 WSL 安装并更新到 WSL 2。

VirtualMachinePlatform和hyper v不一样的

  1. 下载Linux内核更新包并安装:x64计算机的WSL2 Linux内核更新包(从文档看最新的)
    ​wslstorestorage.blob.core.windows/wslblob/wsl_update_x64.msi
  2. 将WSL2设置为默认版本
    wsl --set-default-version 2
  3. 安装Linux分发版
    打开Microsoft Store,搜索wsl或者直接具体的发行版本比如,选择你喜欢的Linux分发版并下载

注意事项

在Power Shell中输入 wsl -l -v 可以查看WSL的版本

优先使用新版文档,若不行再旧版

win下的centos好像有问题
特别微软商店里那个 root权限似乎都没有

推荐商店下载Windows Terminal 可以开启多窗口cmd 而且更好看

更多使用技巧

一个非常使用的技巧是,通过管道将指令的输出结果传入Windows的剪贴板。按下 Win+V 可以开启超级剪贴板。(首次按下 Win+V 需要点击打开,开启超级剪贴板)。


wsl等更多使用技巧(免密登录ssh、WSL中的服务开机自启动等等)可以看 https://zhuanlan.zhihu/p/394776349

二、安装docker

子系统内使用命令记得wsl内先sudo 到root!
使用docker for windows 子系统内无需再安装docker,且子系统自己安装docker的方式我试了没成功

子系统内确定删除了docker

下载docker for windows(一定用管理员安装和打开)

新版4.92也许可能出问题 下载旧版4.8。4.12也有问题emmm

安装的时候记得默认勾选wsl替换hyperv那个选项 或者软件内设置

配置连接-wsl连接外部deamon

如果Docker destop能看到你的子系统

  • 右键小鲸鱼 > settings > resource-wsl intergation下有你的子系统,那么勾选打开(不知道为啥有的没有?)

如果如果Docker destop看不到你的子系统

  • 右键小鲸鱼 > settings > General ,开启expose daemon
  • ubuntu ,将WSL配置为连接到Docker for Windows执行命令:export DOCKER_HOST=tcp://127.0.0.1:2375
  • service docker start 开启docker (可能报错 /usr/bin/dockerd not present or not executable 但是好像也不影响)

  • 持久化运行
echo "export DOCKER_HOST='tcp://0.0.0.0:2375'" >> ~/.bashrc
source ~/.bashrc

然后就可以愉快使用了

# 检查dockerd进程启动
service docker status
ps aux|grep docker

# 查看 Docker 版本
docker version

# 检查拉取镜像等正常
docker pull mysql
docker images

WSL2 Docker最爽的地方是和宿主机Win10共享network,我们在宿主机Win10使用localhost加端口号就可以访问Docker中对应container中的服务,十分方便

如果有vpn代理 那么可能出现问题 https://zhuanlan.zhihu/p/151392411这里解决

低版本的windows用docker toolbox 功能上没有docker desktop全 而且好像不需要开hv 那些乱七八糟的?

使用windows 容器

请看另一篇博客关于windows容器的介绍

子系统需要更换软件源-乌班图为例

开始更换国内镜像源(注意:如果你选择的不是 Ubuntu18.04,这一步不太一样)

WSL 默认源的服务器地址在国外,速度很慢,强烈建议使用国内源,而不同 Linux 发行版镜像源文件地址不一样,比如 Ubuntu 是在 /etc/apt/sources.list,Centos 是在/etc/yum.repos.d/CentOS-Base.repo ,同一 Linux 发行版的不同版本使用的源文件仓库地址也是不一样,这点需要注意。

如果是新手小白朋友,WSL 换源操作可以参考这篇文章:教你如何将WSL系统更换国内源?+固定路径+国内镜像源+详细教程
进入终端,输入以下命令

切换到源路径
cd /etc/apt

备份 Ubuntu 原始源
cp sources.list sources.list.bak

开始换源
sudo vim sources.list
1
2
3
4
5
6
7
8
Ubuntu18.04 阿里镜像源

deb http://mirrors.aliyun/ubuntu/ bionic main restricted universe multiverse
deb http://mirrors.aliyun/ubuntu/ bionic-security main restricted universe multiverse
deb http://mirrors.aliyun/ubuntu/ bionic-updates main restricted universe multiverse
deb http://mirrors.aliyun/ubuntu/ bionic-proposed main restricted universe multiverse
deb http://mirrors.aliyun/ubuntu/ bionic-backports main restricted universe multiverse
deb-src http://mirrors.aliyun/ubuntu/ bionic main restricted universe multiverse
deb-src http://mirrors.aliyun/ubuntu/ bionic-security main restricted universe multiverse
deb-src http://mirrors.aliyun/ubuntu/ bionic-updates main restricted universe multiverse
deb-src http://mirrors.aliyun/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun/ubuntu/ bionic-backports main restricted universe multiverse
1
2
3
4
5
6
7
8
9
10
Ubuntu18.04 中科大镜像源

deb https://mirrors.ustc.edu/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.ustc.edu/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.ustc.edu/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.ustc.edu/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.ustc.edu/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.ustc.edu/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.ustc.edu/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.ustc.edu/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.ustc.edu/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.ustc.edu/ubuntu/ bionic-proposed main restricted universe multiverse
1
2
3
4
5
6
7
8
9
10
Ubuntu18.04 清华镜像源

deb https://mirrors.tuna.tsinghua.edu/ubuntu/ bionic main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu/ubuntu/ bionic main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu/ubuntu/ bionic-updates main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu/ubuntu/ bionic-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu/ubuntu/ bionic-backports main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu/ubuntu/ bionic-backports main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu/ubuntu/ bionic-security main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu/ubuntu/ bionic-security main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu/ubuntu/ bionic-proposed main restricted universe multiverse
deb-src https://mirrors.tuna.tsinghua.edu/ubuntu/ bionic-proposed main restricted universe multiverse
1
2
3
4
5
6
7
8
9
10
换源之后,进行更新

更新源
sudo apt update
更新软件包
sudo apt upgrade
————————————————
版权声明:本文为CSDN博主「陈所长研究室」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn/qq_42362605/article/details/124898062

可能遇到的问题

wsl中卸载docker

卸载,报错,原因就是 docker 这个服务已经停了,如果一个服务从来没有被运行过,则他无法被卸载,太狗了

$ sudo apt remove docker-ce
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
  containerd runc
Use 'sudo apt autoremove' to remove them.
The following packages will be REMOVED:
  docker-ce
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 62.7 MB disk space will be freed.
Do you want to continue? [Y/n] y
(Reading database ... 30768 files and directories currently installed.)
Removing docker-ce (1.13.1-0ubuntu1~16.04.2) ...
invoke-rc.d: could not determine current runlevel
 * Stopping Docker: docker
No process in pidfile '/var/run/docker-ssd.pid' found running; none killed.
invoke-rc.d: initscript docker, action "stop" failed.
dpkg: error processing package docker-ce (--remove):
 subprocess installed pre-removal script returned error exit status 1
dpkg: error while cleaning up:
 subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
 docker-ce
E: Sub-process /usr/bin/dpkg returned an error code (1)

报错信息就是上面这样,网上搜了一下,有人给出了相似的经历,但是解决方案都不行,最终在 GitHub issue 上找到了一个较相似的解决方案,自己改了一下,就可以了

$ cd /var/lib/dpkg/info
$ sudo vim docker-ce.prerm

然后可以看到里面是这样的东西(我的已经被删除了,网上找的)

if ([ -x "/etc/init.d/docker" ] || [ -e "/etc/init/docker.conf" ]) && \
   [ "$1" = remove ]; then
        invoke-rc.d docker stop || exit $?
fi

直接将这一整个 if 语句(四行)给注释了(解决方案给出的是将 invoke 那一行注释,但是发现 if 语句会报错,所以把这四行都注释了) ,再重新 apt remove docker-ce 就能够将 docker 给卸载了

不能打开 deamon报错可能的解决方案

客户端打开提示:
Docker failed to initialize. Docker Desktop is shutting down

win自己的 cmd 显示:

error during connect: In the default daemon configuration on Windows, 
the docker client must be run with elevated privileges to connect.: 
Get http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json: 
open //./pipe/docker_engine: The system cannot find the file specified.

wsl或者发行版内 docker命令显示:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
System has not been booted with systemd as init system (PID 1). Can't operat

论坛比较全的错误总结:
https://forums.docker/t/solved-docker-failed-to-start-docker-desktop-for-windows/106976/39

可能的解决方案

退出杀毒软件

安装和打开用管理员如果不是,可能第一次打开不显示,第二次打开会报错。此时需要重启再管理员打开 或者卸载重安装

删除roaming下的docker文件夹

可能要关闭除了虚拟机平台和wsl其他的虚拟功能(不知道是不是这个)

!!!安装旧版的docker 4.90 新版4.92也许可能出问题

wsl内彻底卸载docker(可能要用到下面问题提到的方法)

# win的cmd下管理员
cd "C:\Program Files\Docker\Docker"
DockerCli.exe -SwitchDaemon

如果能打开destop客户端 但是wsl内不行

docker desktop for windows能打开 还是报错

docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?.See 'docker run --help'.

为了方便开发需要在子系统下安装Docker来部署推送一些镜像资源,可惜的是目前的wsl是不支持Docker的守护进程的,但是可以通过安装Docker利用Docker CLI链接到远程的Docker守护进程来实现

确保安装docker配置连接那里做了

systemd的问题 需要用service替换systemctl

System has not been booted with systemd as init system (PID 1). Can‘t operate.

System has not been booted with systemd as init system (PID 1). Can‘t operate.问题解决方法
ichen820 于2021-07-10 14:28:16
在这里插入图片描述
用window10下WSL使用Ubuntu来用Docker
当我使用命令sudo systemctl start docker的时候报错:
System has not been booted with systemd as init system (PID 1). Can’t operate.

查了原因:
如果是一般的Linux操作系统,可能是因为Linux中没有使用systemd,想用systemd命令来管理Linux上的服务,因此会报错,很可能是使用的是经典的SysV init(sysvinit)系统。
但我这个是window10下WSL的Ubuntu,就会使SysV init而不是systemd。
解决方法:
更换命令,用SysV init的命令代替systemd的

原生 Linux 安装 Docker 方式,Docker 无法实现开机自启和每次 WSL 启动Ip会发生变换

每次重启电脑后给 wsl2 分配的 IP 一般都会变动,我们要连接子系统内部的应用频繁换 IP 会很麻烦,参照别人的解决方法,可以给 Ubuntu 子系统中添加一个新的网卡来给宿主机连接用。

1 查看安装的是哪个子系统发行版本
C:\Users\cdavid>wsl -l
适用于 Linux 的 Windows 子系统分发版:
Ubuntu-18.04 (默认)

2 在子系统中创建 init.wsl
sudo vim /etc/init.wsl

输入以下内容
#network static ip
ip addr add 192.168.50.28/24 broadcast 192.168.50.255 dev eth0 label eth0:1
#docker start
service docker start

给文件进行授权
sudo chmod +x /etc/init.wsl

3 在 Windows 创建 bat 脚本,输入以下内容,放在 C 盘目录下(哪里都想,不要随手删了就行)。
初始化脚本,注意这是 Ubuntu-18.04 和你的发行版本对应
wsl -d Ubuntu-18.04 -u root /etc/init.wsl
添加一个网卡
netsh interface ip add address “vEthernet (WSL)” 192.168.50.93 255.255.255.0

在Windows下 输入快捷键 WIN+R 打开运行窗口,输入 shell:startup,该目录下新建 ubuntu.vbs。
set ws=WScript.CreateObject(“WScript.Shell”)
ws.Run “C:\wsl2-start.bat”,0

进入子系统,输入ifconfig, 以后 192.168.50.28 就是 WSL 的固定 IP 地址了

https://blog.csdn/qq_42362605/article/details/124898062

怎么看docker日志

你会发现这个Docker怎么都启动不了,那现在怎么办?一定要先看日志(/var/log/docker.log )

docker dead but subsys locked

service docker status输出:

docker dead but subsys locked

各种找资料
尝试:

rm -rf /var/run/docker.*

rm -rf /var/lock/subsys/docker

(备注:如果有需要备份的docker此处千万不要用rm -rf /var/lib/docker,否则会删除所有容器数据)

尝试:

service docker stop

thin_check /var/lib/docker/devicemapper/devicemapper/metadata

thin_check --clear-needs-check-flag /var/lib/docker/devicemapper/devicemapper/metadata

service docker start

最后的办法
docker -d可以启动

那就采用

nohup docker -d &

先临时用着,后续有空更深入研究。
————————————————
版权声明:本文为CSDN博主「普通网友」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn/Ajekseg/article/details/124173562

如何以非root用户身份管理Docker

官方文档有写

以非root用户身份管理Docker
Docker 守护进程绑定到 Unix 套接字而不是 TCP 端口。默认情况下,Unix 套接字归用户所有root,其他用户只能使用sudo。Docker 守护程序始终以root用户身份运行。

如果您不想在docker命令前加上sudo,请创建一个名为 docker 的Unix组并将用户添加到其中。当 Docker 守护进程启动时,它会创建一个可供docker组成员访问的 Unix 套接字。

该docker组授予与root 用户等效的权限。有关这如何影响系统安全性的详细信息,请参阅Docker Daemon Attack Surface。

创建 docker 组
sudo groupadd docker
1
将用户添加到 docker 组中
sudo usermod -aG docker $USER
1
注销并重新登录
验证是否可以不使用 sudo 运行docker
docker run hello-world
1
若报下方的错误

WARNING: Error loading config file: /home/user/.docker/config.json
stat /home/user/.docker/config.json: permission denied

则修改权限

sudo chown “ U S E R " : " USER":" USER":"USER” /home/“ U S E R " / . d o c k e r − R s u d o c h m o d g + r w x " USER"/.docker -R sudo chmod g+rwx " USER"/.dockerRsudochmodg+rwx"HOME/.docker” -R
————————————————
版权声明:本文为CSDN博主「MAVER1CK」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn/qq_35395195/article/details/125381254

参考资料

https://blog.csdn/qq_42362605/article/details/124898062

更多推荐

window下使用linux子系统及基于wsl2安装docker