- 文章信息 - author: 李俊才 (jclee95)
visit me at csdn:
my website:http://thispage.tech/
email: 291148484@163.com.
shenzhen china
address of this article:
huawei:https://bbs.huaweicloud.com/blogs/429017
1. 概述
docker是一种广泛使用的容器化平台,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,以便在任何地方都能够以相同的方式运行。在windows操作系统上,docker desktop是一种流行的docker安装方式,它提供了一个用户友好的图形界面,使得安装和管理docker变得非常简单。
然而,尽管docker desktop在windows上的安装和使用非常方便,但它仍然存在一些局限性和不完善的地方。例如,一些功能在docker desktop上可能无法完全发挥作用,或者仍处于试验阶段,这可能会影响到使用体验。
此外,docker desktop作为一个独立的应用程序,会占用一定的系统资源,并且可能与其他应用程序产生冲突。对于一些对性能要求较高的开发者来说,这可能是一个问题。
为了解决这些问题,一种替代方案是在windows subsystem for linux 2(wsl2)中直接安装docker engine。wsl2是微软推出的一项功能,它允许在windows上运行linux环境,并提供了更好的性能和兼容性。通过在wsl2中安装docker engine,开发者可以获得更原生的docker体验,并且可以避免docker desktop的一些限制和问题。
在接下来的文章中,我们将详细介绍如何在wsl2中安装docker engine,并探讨这种方法相对于使用docker desktop的优势和注意事项。
2. 部署wsl2环境
2.1 wsl2简介及其安装
windows subsystem for linux 2(wsl2)是微软在windows 10版本2004及更高版本中引入的一项功能,它是wsl的一个重大更新。wsl2基于虚拟机技术,提供了一个完整的linux内核,使得在windows上运行linux环境变得更加高效和兼容。
与第一代wsl相比,wsl2具有以下优势:
-
更好的性能:wsl2使用虚拟机技术,可以实现接近原生linux的性能表现。
-
完整的系统调用兼容性:wsl2提供了一个完整的linux内核,支持所有的linux系统调用,使得更多的linux应用程序可以在windows上运行。
-
更好的文件系统性能:wsl2引入了一个新的文件系统,称为vhdx,它提供了更快的文件读写性能。
要在windows上安装wsl2,你需要按照以下步骤进行操作:
-
确保你的windows版本为2004或更高版本(内部版本19041及更高版本)或windows 11。可以在设置->系统->关于中查看版本信息。
-
以管理员身份打开powershell或windows命令提示符,方法是右键单击并选择"以管理员身份运行"。
-
在powershell或命令提示符中输入以下命令并按回车键:
wsl --install
这个命令将启用运行wsl并安装linux的ubuntu发行版所需的功能。如果你想安装其他发行版,可以使用-d
标志,例如:
wsl --install -d debian
不过你也可以在后续查看安装各种发行版本。
-
命令执行完毕后,最好需要重启计算机以完成安装。
-
重启后,打开已安装的linux发行版,它会自动打开一个控制台窗口。
2.2 查找wsl2和安装支持的其它发行版
之前提到-d debian
可以选择初始化时一个默认版本,如未选择就是使用默认的ubuntu。实际上我们还可以继续安装其它发行版本,要了解当前wsl2支持的linux发行版,可以使用这个命令:
wsl --list --online
它将搜索当前的支持列表并打印输出出来,例如:
ps c:\users\jclee95> wsl --list --online
以下是可安装的有效分发的列表。
使用 'wsl.exe --install <distro>' 安装。
name friendly name
ubuntu ubuntu
debian debian gnu/linux
kali-linux kali linux rolling
ubuntu-18.04 ubuntu 18.04 lts
ubuntu-20.04 ubuntu 20.04 lts
ubuntu-22.04 ubuntu 22.04 lts
ubuntu-24.04 ubuntu 24.04 lts
oraclelinux_7_9 oracle linux 7.9
oraclelinux_8_7 oracle linux 8.7
oraclelinux_9_1 oracle linux 9.1
opensuse-leap-15.5 opensuse leap 15.5
suse-linux-enterprise-server-15-sp4 suse linux enterprise server 15 sp4
suse-linux-enterprise-15-sp5 suse linux enterprise 15 sp5
opensuse-tumbleweed opensuse tumbleweed
我们可以选择喜欢的版本通过下面的命令进行安装,例如安装ubuntu-24.04
版本:
wsl --install ubuntu-24.04
在已经被windows集成到windows 11上作为系统终端的,开发者神器 windows terminal上,你可以找到你安装的发行版本:
如果系统是首次启动时,需要等待一段时间,让系统完成初始化并提示你创建一个新的linux用户帐户和密码。例如:
你需要设置一个用户名和密码。
对于已经初始化完成的系统,切换终端后将直接执行其/bin/bash
、/bin/sh
或类似项目,打开一个交互式环境:
在windows termimal上,以后如果需要进入默认wsl系统(如未修改就是安装wsl时的ubuntu),可以直接指定bash
命令:
bash
这会通过一个wsl的批处理激活对应的linux交互环境,如果需要回退windows终端,则执行exit
即:
exit
例如:
2.3 关于wsl容器中的http/https代理
这里可以看到一点小提示:
wsl: 检测到 localhost 代理配置,但未镜像到 wsl。nat 模式下的 wsl 不支持 localhost 代理。
一般用户如果没有使用代理不需要关注。它表明,在 windows 主机上配置了 localhost
代理(主要用于特定网络的访问),但 wsl 无法使用这个代理配置。在 wsl 的 nat 模式下,localhost
代理是不被支持的。
这个意思是,localhost
一般在系统上是回环ip如127.0.0.1
的本地host
中指定的域名,而然wsl中的系统是独立的,两个系统都有自己的回环地址,因此如果你在你的windows宿主机上使用的vpn代理是不会影响到wsl中安装的系统的回环地址。
如果你了解docker网络就知道,docker所管理的容器中类似。实际上在windows上,一个docker容器也是一个wsl系统,只不过容器主要是由docker软件所管理的。
如果你不需要在 wsl 中使用代理,可以在 windows 的代理设置中禁用 localhost 代理。这样 wsl 就不会尝试使用这个代理配置了。
说了这么多要在你的wsl容器中使用代理,你就不因该将http/https代理设置为127.0.0.1,虽然在windows上可能这样做如(假设代理端口为6666):
$env:http_proxy="http://192.168.31.25:6666";$env:https_proxy="http://192.168.31.25:6666"
你应该先在你的windows终端上使用ipconmfig
查询一下自己的ip地址,假设为192.168.31.25
,那么,在你的wsl 的linux容器中,就应该使用这样的格式来使用代理了:
export http_proxy="http://192.168.31.25:6666"
export https_proxy="http://192.168.31.25:6666"
另外,如果你希望默认使用这个代理,还可以在~/.bashrc
中配置bash启动运行:
vim ~/.bashrc
添加这两行命令:
export http_proxy="http://192.168.31.25:6666"
export https_proxy="http://192.168.31.25:6666"
注意,需要替换为你实际的代理服务器地址和端口。如果你喜欢这个配置文件的修改立刻生效则需要运行下面的命令:
source ~/.bashrc
另外,如果如果你使用的不是bash shell而是 zsh shell,则运行:
source ~/.zshrc
现在,http_proxy
和 https_proxy
环境变量已经设置好了。你可以使用以下命令来验证环境变量是否设置正确:
echo $http_proxy
echo $https_proxy
然后在你的对应wsl容器中curl
特定的网站,看实际访问是否成功,如:
可见我这里是成功的。
另外,这种方法是在当前用户的 shell 配置文件中设置环境变量,因此只对当前用户生效。如果你想要为所有用户设置代理环境变量,可以将这两行内容添加到 /etc/environment
文件中,并重新登录或重启系统以使更改生效。
2.4 wsl的其它常用管理命令
为了便于读者进行相关调试,这里顺便介绍一些wsl中常用的命令
列出已安装的 wsl 发行版
wsl -l
例如:
这里安装了2个wsl系统,都是ubuntu,一个为24.04
版本的,另外一个为22.04
版本的。
设置为默认使用系统版本
例如设置22.04
的为默认版本:
wsl --set-default ubuntu-22.04
关闭所有正在运行的 wsl 实例
wsl --shutdown
注销并删除一个 wsl 发行版
wsl --unregister <distroname>
更新 wsl 到最新版本
wsl --update
显示 wsl 的状态,包括版本信息
wsl --status
从 tar 文件导入 wsl 发行版
wsl --import <distroname> <installlocation> <filename>
将 wsl 发行版导出到 tar 文件
wsl --export <distroname> <filename>
终止指定的 wsl 发行版
wsl --terminate <distroname>
3. 从deb包安装docker
3.1 关于apt repository的安装方式
安装过程与直接在ubuntu物理机上安装是一样的。在wsl中通过apt
包管理器仓库安装时,需要设置docker的repository
,但是有时即使你正确使用了http/https代理,也可能由于网络问题安装失败。如果你需要尝试这个安装方式,可以按照下面的步骤进行:
3.2 手动下载deb安装
首先访问:https://download.docker.com/linux/ubuntu/dists/?_gl=1dzadrf_gcl_aumjaznjixnjkxmy4xnze3ote2mta5_ganjq5mjuwndyylje3mtc5mtyxmdk._ga_xjwpqmjyhq*mtcxodi3nzgwni43ljeumtcxodi3oduync41my4wlja.,从这个网站中选择你的ubuntu版本:
这个页面列举的是各个ubuntu发行版本的版本代号,
每个 ubuntu 版本都有一个代号,通常由一个形容词和一个动物名称组成,并按字母顺序排列。例如:
- ubuntu 18.04: bionic beaver
- ubuntu 20.04: focal fossa
- ubuntu 22.04: jammy jellyfish
- ubuntu 22.10: kinetic kudu
这里,我想为 ubuntu 22.04 下载 docker 文件,因此选择 jammy/ 目录,来到了第2个页面:
这些是 docker 提供的不同版本或发布渠道:
-
stable/
: 这是 docker 的稳定版本,推荐大多数用户使用。稳定版本经过了广泛的测试,可靠性高,并提供了长期支持。如果你正在生产环境中使用 docker 或者不需要最新的功能,选择稳定版本是最佳选择。 -
test/
: 这是 docker 的测试版本,包含了新的功能和改进,但可能不如稳定版本可靠。如果你想尝试最新的功能并且可以容忍可能出现的问题,你可以选择测试版本。测试版本通常会在几周或几个月后成为新的稳定版本。 -
nightly/
: 这是 docker 的每夜构建版本,包含了最新的代码更改。每夜版本是自动构建的,没有经过广泛测试,因此可能不稳定。除非你是开发人员或者想测试最新的代码,否则不建议使用每夜版本。 -
pool/
: 这不是一个特定的 docker 版本,而是一个包含所有 docker deb 包的目录。你通常不需要直接使用这个目录。 -
inrelease
,release
, 和release.gpg
: 这些是用于验证软件包完整性和真实性的文件,不代表特定的 docker 版本。
现在我们使用deb包进行安装,因此访问pool/
目录:
选择stable
稳定版,进入第4个页面:
这些目录包含了适用于不同 cpu 架构的 docker deb 安装包。下面是一个表格,描述了每个目录的用途:
目录 | 描述 |
---|---|
amd64/ | 包含适用于 amd64 (x86-64) 架构的 docker deb 安装包。这是最常见的架构,用于大多数个人计算机和服务器。 |
arm64/ | 包含适用于 arm64 (aarch64) 架构的 docker deb 安装包。这种架构常用于嵌入式设备、移动设备和一些服务器。 |
armhf/ | 包含适用于 armhf (arm hard float) 架构的 docker deb 安装包。这种架构常用于 32 位 arm 设备,如 raspberry pi。 |
ppc64el/ | 包含适用于 powerpc 64 位小端 (ppc64el) 架构的 docker deb 安装包。这种架构常用于 ibm power 系统。 |
s390x/ | 包含适用于 ibm system z (s390x) 架构的 docker deb 安装包。这种架构常用于 ibm 大型机。 |
一般该根据你的系统 cpu 架构选择相应的目录。对于大多数个人计算机和服务器,amd64/ 是正确的选择。你可以使用以下命令来检查你的系统架构:
dpkg --print-architecture
可以看到我这里是amd64,就打开amd64
目录,进入实际的下载页面:
需要注意下载版本的匹配,否则安装时可能会出错。这里我选择的是当前较新的一套版本:
我是直接点击下载到我的windows主机上的,在下面一章将介绍如何直接在wls容器上找到你的windows宿主机上的文件。
当然,还有一个在写脚本实现的时候可以用的方法是通过wget
命令下载到指定的目录,这在linux系统上还是很常见的,如:
wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/containerd.io_1.6.33-1_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-ce-cli_26.1.4-1~ubuntu.22.04~jammy_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-ce_26.1.4-1~ubuntu.22.04~jammy_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-buildx-plugin_0.14.1-1~ubuntu.22.04~jammy_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-compose-plugin_2.27.1-1~ubuntu.22.04~jammy_amd64.deb
wget https://download.docker.com/linux/ubuntu/dists/jammy/pool/stable/amd64/docker-ce-rootless-extras_26.1.4-1~ubuntu.22.04~jammy_amd64.deb
4. wsl容器访问windows位置以安装deb
4.1 wsl容器中的卷绑定
在wsl2中,microsoft引入了一个非常方便的功能,允许在wsl容器中直接访问windows文件系统。这意味着你可以在wsl的linux环境中,使用熟悉的linux命令和工具来操作windows上的文件和目录。
当你启动一个wsl发行版时,它会自动将windows文件系统中的某些位置挂载到wsl的文件系统中。默认情况下,会发生以下挂载:
-
c:盘会被挂载到
/mnt/c
-
d:盘会被挂载到
/mnt/d
其他盘符也以此类推,如e:盘会被挂载到/mnt/e
等。
例如,如果你在windows的d:\downloads目录中有一些文件,你可以在wsl中通过/mnt/d/downloads路径来访问它们。
这个功能非常强大,它允许你在wsl中无缝地使用windows文件系统,而不需要复制文件或在两个系统之间切换。你可以在wsl中使用ls,cd,cp,mv等命令来浏览和操作这些文件。
需要注意的是,虽然你可以在wsl中访问整个windows文件系统,但反过来并不成立。从windows中,你只能访问wsl的linux文件系统的一部分,默认位置是:
\\wsl$\<distroname>\home\<username>
其中<distroname>是你的wsl发行版的名称,<username>是你的linux用户名。
了解了wsl的卷绑定功能后,我们就可以方便地在wsl中安装之前下载到windows中的docker deb包了。
4.2 安装deb
假设你已经将docker的deb安装包下载到了windows的d:\downloads
目录,现在我们可以在wsl中进行安装。首先,启动你的wsl发行版,然后切换到/mnt/d/downloads
目录:
cd /mnt/d/downloads
然后,使用dpkg
命令来安装这些deb包。注意要按照一定的顺序,因为有些包有依赖关系:
sudo dpkg -i containerd.io_1.6.33-1_amd64.deb
sudo dpkg -i docker-ce-cli_26.1.4-1~ubuntu.22.04~jammy_amd64.deb
sudo dpkg -i docker-ce_26.1.4-1~ubuntu.22.04~jammy_amd64.deb
sudo dpkg -i docker-buildx-plugin_0.14.1-1~ubuntu.22.04~jammy_amd64.deb
sudo dpkg -i docker-compose-plugin_2.27.1-1~ubuntu.22.04~jammy_amd64.deb
sudo dpkg -i docker-ce-rootless-extras_26.1.4-1~ubuntu.22.04~jammy_amd64.deb
安装完成后,docker就已经安装到你的wsl系统中了。
你可以尝试启动docker服务和在系统启动时自动启动:
sudo systemctl start docker
sudo systemctl enable docker
然后,检查docker服务的状态和安装的版本:
sudo docker version
从这个截图可以看出,docker已经成功在wsl容器中部署了,但拉取镜像却失败了,因此下一章介绍如何配置代理,这对于网络访问加速docker拉取很有用。
5. 为docker配置代理
为了直接使用docker官方仓库,可以设置docker访问代理,前提是你自己已有代理服务器。关于代理服务器不在本文的介绍范围内。
5.1 创建docker配置文件(如果不存在)
sudo mkdir -p /etc/systemd/system/docker.service.d
sudo touch /etc/systemd/system/docker.service.d/http-proxy.conf
5.2 添加代理设置
sudo vim /etc/systemd/system/docker.service.d/http-proxy.conf
在配置文件中,添加以下内容:
[service]
environment="http_proxy=http://服务端主机ip:vpn服务端口号"
environment="https_proxy=http://服务端主机ip:vpn服务端口号"
environment="no_proxy=localhost,127.0.0.1"
例如:
[service]
environment="http_proxy=http://192.168.31.25:7890"
environment="https_proxy=http://192.168.31.25:7890"
environment="no_proxy=localhost,127.0.0.1"
这里我使用的依然是192.168.31.25和端口7890。请将http://192.168.31.25:7890
替换为你实际的代理服务器地址和端口。
no_proxy
环境变量指定了不应该通过代理访问的主机或域名,通常包括本地主机和回环地址。
5.3 重新加载docker服务配置并重启docker
- 重新加载docker服务配置:
sudo systemctl daemon-reload
- 重启docker服务:
sudo systemctl restart docker
然后再次尝试拉取镜像,现在拉取流量将通过代理隧道转发:
拉取结束后,可以再次查看一下你的镜像:
可见成功了。
发表评论