如何在不使用 Docker Desktop 的情况下在 Windows 上运行 Docker
由于 Docker 宣布为个人用户、教育机构、非商业开源项目和小企业提供 Docker Desktop 的新订阅服务,其他企业需要为所有 Docker Desktop 安装购买许可证。
那么,在 Windows 上是否有其他方法可以继续合法地使用容器,例如使用 docker 命令和像 VSCode 这样的友好用户界面,而无需支付许可证费用?答案是肯定的!
我们正在利用 Windows 10、WSL2 上的 Ubuntu、 Windows 版Docker 构建器命令行工具以及一点努力来实现这个功能。
非常感谢 Jonathan Bowman 的文章。
我重新利用并对其进行了修改,使VisualCode能够在 WSL2 下与dockerd一起工作。
在 Windows 系统上安装
你的Windows系统需要安装以下几个程序:
- WSL2:安装 WSL | 微软文档
- 在 WSL2 上运行 Ubuntu:可在 Microsoft Store 中找到 Ubuntu 20.04 LTS
- Visual Code:可从Visual Studio Code - 代码编辑下载。重新定义
- 适用于 VSCode 的 Docker 扩展:直接来自 Visual Code 扩展市场

在 WSL2/Ubuntu 中安装 dockerd
(灵感来自乔纳森·鲍曼的文章)
您的用户是否拥有 sudo 权限?
检查是否已安装sudo,如果未安装*apt install sudo*:
grep -E 'sudo|wheel' /etc/group
你会看到类似这样的命令:sudo:x:27:myusername
否则,我们使用usermod将用户添加到sudoer组。
usermod -aG sudo myusername
最后,您可以使用以下命令进行检查:
sudo grep -E '%sudo|%wheel' /etc/sudoers
你会得到类似这样的东西。
%wheel ALL=(ALL) ALL
如果在第一个位置看到 #,则表示该行已被注释,运行sudo visudo,找到相应的行并删除 #,保存并再次检查。
更新您的 Ubuntu 发行版
sudo apt update && sudo apt upgrade
清除先前 Docker 安装遗留的进程
sudo apt remove docker docker-engine docker.io containerd runc
Debian/Ubuntu软件包仓库配置
源 /etc/os-release
信任该仓库:
curl -fsSL https://download.docker.com/linux/${ID}/gpg | sudo apt-key add -
更新仓库信息:
echo "deb [arch=amd64] https://download.docker.com/linux/${ID} ${VERSION_CODENAME} stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update
安装官方 Docker 版本
sudo apt install docker-ce docker-ce-cli containerd.io
将用户添加到 Docker 组
sudo usermod -aG docker $USER
然后关闭 WSL 窗口,再重新启动 WSL。运行 `groups` 命令列出组成员关系时,应该就能看到 docker 了。
在 WSL2 中获取 IP 地址
回声`ifconfig eth0 | grep -E "([0-9]{1,3}.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | grep -v 127.0.0.1 | grep -v 127.0.0.1 awk '{ 打印 $2 }' |切-f2-d:`
你应该看到类似172.20.5.64的地址。
启动 dockerd
在 WSL 中,没有systemd或其他初始化系统。因此,我们需要手动启动 Docker,并自动收集 IP 地址。
sudo dockerd -H `ifconfig eth0 | grep -E "([0-9]{1,3}.){3}[0-9]{1,3}" | grep -v 127.0.0.1 | grep -v 127.0.0.1 | grep -v 127.0.0.1 awk '{ 打印 $2 }' |切-f2-d:`
应该会显示几行信息,包括与 TLS 相关的警告等等,最后会显示类似“API 监听地址: 172.20.5.64:2375”这样的内容。如果是这样,那就成功了。
测试 Docker 命令
获取 API listen 命令指定的 IP 地址,然后在另一个 WSL 终端中,您可以测试以下命令:
docker -H 172.20.5.64 run --rm hello-world
你会看到类似这样的内容:
来自 Docker 的问候!
...
在 Windows 上安装Docker.exe
Stefan Scherer 在GitHub上维护着 docker-cli-builder 项目,我们可以从中下载独立版本的docker.exe命令:
- 下载exe文件
- 把它放在类似c:\bin 的目录下。
- 将此目录添加到可执行文件路径中:系统属性\环境变量\系统变量\路径
检查Docker是否正常工作
完成后,注销会话并重新登录。
在 Windows 终端(Windows PowerShell)中,运行:
docker --version
你会得到类似这样的结果:
Docker 版本 20.10.5,构建版本 55c4c8896
启动 dockerd
在 Wsl2 中打开终端,然后执行
sudo dockerd -H `ifconfig eth0 | grep -E "([0-9]{1,3}.){3}[0-9]{1,3}" | grep -v 127.0.0.1 |awk '{ print $2 }' |切-f2-d:`
然后你就能得到 IP 地址,就像之前描述的那样。
在 Windows 上测试 Docker
在终端的 PowerShell 窗口中,您可以运行以下命令:c:\bin\docker -H tcp://172.20.5.64 run --rm hello-world
你会得到:
来自 Docker 的问候!
...
太棒了,我们现在已经在 Windows 系统上使用 WSL2 运行 Docker 了。
但让我们继续探索更多精彩内容吧!
配置 VSCode 以访问 WSL2 Docker 容器
如果您启动 Visual Studio Code 并选择 Docker 扩展,面板中会显示错误信息,询问 Docker 是否已安装……当然,Docker 已安装,但未配置为访问 WSL2。
为此,请点击“容器”部分右上角的图标(?),然后选择“编辑设置...”
你会看到大约 56 个设置项,找到“Docker:Host”并输入“tcp://172.20.5.64:2375”这行,然后将高亮显示的 IP 地址替换为你之前获取的 IP 地址。
完成后,返回面板并点击“刷新”图标(每个部分右上角),即可获取在 WSL2 中运行的dockerd的信息。
无需了解IP就能让一切正常运行
那么,如何在不通过命令行或 VSCode 复制粘贴 IP 地址的情况下运行dockerd和docker 呢?
在 WSL2 中,虽然无法直接分配 IP 地址,但我可以使用 Windows 端口转发功能,将主机上的本地端口重定向到我的发行版中的特定端口。因此,我可以在 VS Code 中输入“tcp://localhost:2375”,这样请求就会被重定向到运行在 WSL2-Ubuntu 中的 dockerd 服务。
为此,我在以管理员身份运行的Windows 终端中运行 PowerShell 脚本:
$ip = (wsl sh -c "hostname -I").Split(" ")[0]
netsh interface portproxy add v4tov4 listenport=2375 connectport=2375 connectaddress=$ip
wsl sh -c "sudo dockerd -H tcp://$ip"
脚本说明:
- 首先,我使用 wsl 命令收集我的默认发行版的 IP 地址。
- 其次,我将端口2375转发到我的发行版
- 第三,我使用 IP 地址在我的发行版中启动 dockerd。
执行这些命令后,系统会提示您输入发行版密码(sudo),之后我会查看 dockerd 的日志。当我看到“API listen on 172.18.75.23:2375”这条消息时,一切就正常了。
同时,在我的发行版中打开的 Windows 终端中,我可以使用top或htop检查dockerd进程是否正在运行。
在VSCode中,我将Docker:Host设置更新为tcp://localhost:2375:
而魔法就在那里:
现在我可以使用上一行命令创建一个专用的 PowerShell 脚本:start_docker.ps1
在以管理员权限运行的 Windows 终端中,我使用以下命令设置了执行策略:
设置执行策略 RemoteSigned
每次我想运行dockerd时,我都会运行start_docker.ps1脚本:
如果您看到API 监听地址为 172.18.75.23:2375
一切正常!
现在,我想在不使用-H参数的情况下使用Docker,为此,我添加了一个名为DOCKER_HOST 的新系统环境变量,并将其设置为tcp://localhost:2375
最后,在 Windows 终端中,我可以简单地运行如下命令:
docker 镜像 ls
综上所述
本文展示了如何在 Windows 和 WSL2 中使用 Docker,而无需 Docker Workstation。
为此,我们只需首先运行一个 PowerShell 脚本,在 WSL2 中启动dockerd,一旦dockerd开始监听,我们就可以简单地使用docker命令(由 Stefan Scherer 维护)。
是的!即使没有 Docker Workstation,我们也可以继续使用容器进行开发。
享受 !
文章来源:https://dev.to/_nicolas_louis_/how-to-run-docker-on-windows-without-docker-desktop-hik










