一、背景

许多小伙伴在安装 Dify 或是 RagFlow 这些工具的时候,往往会遇到一个难题,那就是 Docker 的安装。

首先,我们的PC安装的绝大部分是 Windows,但众所周知的原因,Windows 对 Docker 的支持并不是特别好,这方面的历史原因有很多,实际上 Docker 是 Linux 流派的技术,它主要得益于 Linux Namespace 和 CGroups 这些内核隔离技术,然而 Docker 大火之际,Windows 并没有提供类似的技术,这也导致了 Windows 在容器领域一直处于滞后的地位。

后来的演进过程中,Windows 为了跟进这项技术,也做了一些演进。目前市场上流行的 个人PC 操作系统,主要还是以 Windows 10 和 Windows 11为主。而这两个版本对 Docker 的支持是略有不同的,这也导致了许多小伙伴在安装 Docker 时会出现不少问题。

在通过 Windows 安装 Docker 之前,我们有必要花点时间了解下 WSL 和 HyperV 这两项技术。

HyperV

HyperV 是微软最早提供的虚拟化技术,得益于现代 CPU 硬件层虚拟化的发展,如Intel的 VT - x 和 AMD 的AMD - V,操作系统可以通过硬件层扩展接口来完成虚拟化。HyperV 主要通过对CPU、内存、网络、硬件外设等模块进行技术抽象来完成虚拟化管理和调度,并提供了 VMM 来支持虚拟机的生命周期管理。

需要注意的是 HyperV 是2008年发布的技术(对标的是 VMware ESX、开源的XEN/KVM等虚拟化技术),而 Docker 是 2013 年开始出现的,也就是说 HyperV 是后来支持的 Docker,最早在 Windows 10 版本上出现了支持 容器的 HyperV 组件,然而也仅限于专业版/企业版/教育版,如果是 Windows 10 个人家庭版本,需要单独安装 HyperV。

WSL

WSL 是 windows subsystem for linux 的简称,意思是Windows 上用于运行 Linux 的子系统。然而 WSL 历史上存在两个版本,这点同样也造成了大家的困扰。

  1. WSL1 发布于 2016 年 8 月,随 Windows 10-1607 版本发布,它是一种基于 Windows NT 内核实现的组件,支持在用户模式下运行 Linux 二进制文件,原理是将 Linux 系统调用转换为 Windows 系统调用。简单说,由于 WSL1 仅仅是做了一层系统调用的转换,它并没有真正的 Linux 内核,所以对 Docker 的支持不是太好。
  2. WSL2 于 2019 年 5 月,随 Windows 10-1903(高阶版本)发布。WSL2 相比 WSL1 带来了一个革命性的变化,那就是 WSL2 利用了 HyperV 的虚拟化功能来提供完整的 Linux 内核支持,而 WSL2 相比 HyperV 提供了更简单、简洁的操作接口。

不难发现,想要在 Windows 上完美运行 Docker,我们需要 WSL2 + HyperV 这两个底层技术,并至少确保操作系统在 Windows 10-1903 版本或以上。

二、环境准备

首先,我们需要明确 Windows 安装 Docker 的一些先决条件:

  1. 确保 Window 版本在 10/11 以上
  2. 确保系统启用了 虚拟化支持
  3. 确保系统支持 HyperV 组件
  4. 确保系统安装了 WSL2 最新版本
  5. 确保虚拟化所需的 Windows 功能服务已经开启

1. 查询 Windows 版本

打开 设置 -> 系统 -> 系统信息 -> Windows 规格

查看 Window 版本,如下:

2. 检查虚拟化支持

打开 任务管理器 -> 性能 -> CPU,查看虚拟化是否开启:

如果虚拟化未开启支持,需要重启电脑,打开BIOS/UEFI 设置,启用硬件虚拟化技术。

3. HyperV 组件支持

在程序中搜索 Hyper-V 管理器或控制台,检查是否已经安装了 HyperV组件。

此外还可以通过命令行进行检查:

systeminfo | findstr /C:"Hyper-V"
Hyper-V 要求: 已检测到虚拟机监控程序。将不显示 Hyper-V 所需的功能。

一般的 Windows 个人家庭版默认不带 HyperV,如果发现 HyperV组件未安装,可通过脚本进行安装。

pushd "%~dp0"
dir /b %SystemRoot%\servicing\Packages\*Hyper-V*.mum >hyper-v.txt
for /f %%i in ('findstr /i . hyper-v.txt 2^>nul') do dism /online /norestart /add-package:"%SystemRoot%\servicing\Packages\%%i"
del hyper-v.txt
Dism /online /enable-feature /featurename:Microsoft-Hyper-V-All /LimitAccess /ALL

将以上脚本保存为 hyperv.cmd 文件,双击运行可完成安装。

脚本执行完成后,重新检查以确认 HyperV 安装完成。

4. 安装 WSL2 最新版本

访问如下地址获取安装包进行安装:

https://github.com/microsoft/WSL/releases

另一种办法,也可以通过 Microsoft Store进行下载安装。

安装完成之后,设置版本并检查状态:

> wsl --set-default-version 2
> wsl -v
WSL 版本: 2.5.4.0
内核版本: 6.6.75.1-1
WSLg 版本: 1.0.66
MSRDC 版本: 1.2.6074
Direct3D 版本: 1.611.1-81528511
DXCore 版本: 10.0.26100.1-240331-1435.ge-release
Windows: 10.0.22631.5039
4.1. 配置 WSL2

编辑 %USER_HOME%/.wslconfig文件:

对于 Windows 10 版本,采用如下配置:

[wsl2]
networkingMode=nat [experimental]
autoMemoryReclaim=dropcache

对于 Windows 11 版本,采用如下配置

[wsl2]
networkingMode=mirrored
dnsTunneling=true
autoProxy=true
firewall=true [experimental]
autoMemoryReclaim=dropcache
useWindowsDnsCache=true
bestEffortDnsParsing=true
hostAddressLoopback=true

保存 .wslconfig 文件,重启wsl服务:

 wsl --shutdown
wsl
4.2. 参数差异

在 Windows 11 版本中,WSL 可支持镜像网络模式,并带来了一系列的性能提升配置。

具体的参数差异如下表所示:

参数示例 说明 版本要求
networkingMode=mirrored 网络模式,mirrored为镜像模式,nat 为代理模式。

mirrored 模式下 WSL实例与主机系统共享网络接口,nat 则无法共享。
镜像模式要求 windows 11
dnsTunneling=true 是否启用启用DNS隧道功能,以便WSL实例通过主机操作系统的网络接口解析DNS请求 windows 11
autoProxy=true 启用自动代理功能,WSL实例能够自动同步主机的网络代理设置 windows 11
firewall=true 启用WSL的防火墙支持,允许HyperV对WSL网络流量进行控制 windows 11
autoMemoryReclaim=dropcache 开启内存自动回收功能,当内存紧张时,WSL实例会释放缓存 windows 10/11
useWindowsDnsCache=true 允许WSL使用主机Windows系统的DNS缓存 windows 10/11
bestEffortDnsParsing=true 启用“尽力而为”DNS解析功能,当DNS请求失败时,系统会尝试通过其他方法解析以提供更稳定的网络体验。 windows 11
hostAddressLoopback=true 除了环回地址之外,允许 WSL 2 子系统使用分配给主机的IP 与主机进行互访(通常使用不同网口) 镜像模式要求windows 11

5. 开启虚拟化服务功能

打开控制面板 -> 程序 -> 启用或关闭系统功能,

将如下系统功能打开:

  • 虚拟机平台
  • HyperV
  • 适用于WIndows的Linux子系统

启用后根据提示重启系统后生效。

三、安装 Linux 发行版

WSL 2 利用了 Hyper - V 的虚拟化功能来提供更高效的 Linux 环境。

而为了让 Docker 在 WSL 2 上运行,需要安装一个支持 Docker 的Linux 发行版,如Ubuntu或Debian等,使得Docker 能找到所需的Linux 的内核功能和服务。

方式一:命令行安装方式

查看可用系统版本:

wsl --list --online
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.6 openSUSE Leap 15.6
SUSE-Linux-Enterprise-15-SP5 SUSE Linux Enterprise 15 SP5
SUSE-Linux-Enterprise-15-SP6 SUSE Linux Enterprise 15 SP6
openSUSE-Tumbleweed openSUSE Tumbleweed

安装 ubuntu

wsl --install ubuntu

方式二:应用市场安装

打开 MicroSoft Store,搜索 Ubuntu,点击进行安装:

方式三:离线安装

如果在线安装失败,可进行离线安装,参考文档:

https://learn.microsoft.com/en-us/windows/wsl/install-manual

通过以上链接下载对应的 Linux 发行版,如 Ubuntu2204-221101。

下载完毕后,打开PowerShell进入离线包所在目录,执行命令:

Add-AppxPackage .\Ubuntu2204-221101.AppxBundle

随后会生成 xxx.AppxBundle文件,双击该文件进行安装。

配置软件镜像

执行如下命令进入 Ubuntu 系统:

wsl -d Ubuntu

基于当前的网络配置方式,可根据需要配置网络代理

编辑 ~/.bashrc 命令,添加如下内容:

export http_proxy=http://xxx
export https_proxy=http://xxx

编辑 /etc/apt/sources.list ,添加国内镜像站,如阿里云镜像:

https://developer.aliyun.com/mirror/

更新镜像站:

sudo apt update

三、安装 Docker

Windows 上安装 DockerDesktop 来实现 Docker 的安装和管理。

1. 安装DockerDesktop

访问 Docker 官网,下载 Docker-Desktop:

https://docs.docker.com/desktop/setup/install/windows-install/

双机运行,直接安装,注意勾选 Use WSL Instead Of HyperV。

2. 配置Docker镜像源

安装完成之后,启动 DockerDesktop。

如果启动成功,可以看到启动界面。

选择 设定 -> Docker Engine:

编辑 yaml ,在其中添加镜像源地址,添加如下内容

{
...
"registry-mirrors": [
"https://xxx.com"
]
}

其中将地址替换为可用源,以如华为云镜像为例:

访问华为云容器镜像服务:https://console.huaweicloud.com/swr/,可获得自有镜像源地址。

四、安装容器

以 Neo4j 为例,进行容器的安装测试。

输入如下命令,拉取 Neo4j 镜像:

docker pull neo4j

打开 Docker Desktop 界面,找到 Neo4j 镜像,点击Run,配置参数:

设置端口,挂载目录,设置 NEO4J_AUTH=neo4j/password 环境变量。

执行 Run 动作后,可以看到 Neo4j 已经启动。

访问 http://localhost:7474 ,可以访问 Neo4j 的界面:

五、网络访问

NAT 网络模式

在 NAT 网络模式,WSL 2 借助 Hyper - V 虚拟交换机创建一个虚拟网络环境,它有自己独立的虚拟网卡(在 Windows 主机上显示为 vEthernet (WSL),在 WSL 2 内部通常为 eth0),通过该桥接网络,WSL2 子系统可访问外部网络,同时 Windows 主机也可以访问 WSL 2 实例暴露的端口,但该端口对外部主机不可见(需单独配置转发)

可以执行 ipconfig 命令,查看 WSL 实例的网络接口:

ipconfig
以太网适配器 vEthernet (WSL): 连接特定的 DNS 后缀 . . . . . . . :
IPv4 地址 . . . . . . . . . . . . : xxx
子网掩码 . . . . . . . . . . . . : 255.255.240.0
默认网关. . . . . . . . . . . . . :
  1. 容器可以通过 host.docker.internal 特殊域名访问宿主机
  2. 宿主机可以通过 环回地址 访问容器端口
  3. 容器可以通过 WSL 的 IP 地址访问宿主机

Mirrored 网络模式

在镜像网络模式中,WSL2 子系统与主机共享网络接口,此时不需要 独立的 WSL 网卡。

  1. 容器可以通过 host.docker.internal 特殊域名访问宿主机
  2. 宿主机可以通过 环回地址 访问容器端口
  3. 容器和宿主机可以通过主机的 IP 地址进行互访(需检测分别WSL和主机分别绑定的IP)

六、常见问题

端口绑定失败

对于windows 10来说,wsl2 尽管配置了镜像模式,也会自动降级为 NAT 模式。

如果发现端口没有被主机占用,但启动提示没有绑定端口权限,需要注意端口是否在 HyperV 的保留端口范围之内。

由于 HyperV 的保留端口是动态生成的,需通过如下命令检查 HyperV 保留范围内:

netsh interface ipv4 show excludedportrange protocol=tcp
开始端口 结束端口
---------- --------
80 80
2698 2797
2929 3028
8985 9084
9085 9184
9185 9284
9285 9384
9385 9484
9485 9584
9585 9684

如果存在冲突,最简单的做法是重启 NAT,让它的保留端口发生变化避免冲突

net stop winnat
docker start xxx
net start winnat

另一种彻底的做法是,直接添加动态端口范围,如下:

netsh int ipv4 set dynamic tcp start=49152 num=16384

【保姆级教程】windows 安装 docker 全流程的更多相关文章

  1. 保姆级教程——Ubuntu16.04 Server下深度学习环境搭建:安装CUDA8.0,cuDNN6.0,Bazel0.5.4,源码编译安装TensorFlow1.4.0(GPU版)

    写在前面 本文叙述了在Ubuntu16.04 Server下安装CUDA8.0,cuDNN6.0以及源码编译安装TensorFlow1.4.0(GPU版)的亲身经历,包括遇到的问题及解决办法,也有一些 ...

  2. Java/JDK安装教程手册(正规图文全流程)、运行、环境配置

    Java/JDK教程手册 本文提供全流程,中文翻译.Chinar坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) 一 Download Resouc ...

  3. 自建本地服务器,自建Web服务器——保姆级教程!

    搭建本地服务器,Web服务器--保姆级教程! 本文首发于https://blog.chens.life/How-to-build-your-own-server.html. 先上图!大致思路就是如此. ...

  4. Eclipse for C/C++ 开发环境部署保姆级教程

    Eclipse for C/C++ 开发环境部署保姆级教程 工欲善其事,必先利其器. 对开发人员来说,顺手的开发工具必定事半功倍.自学编程的小白不知道该选择那个开发工具,Eclipse作为一个功能强大 ...

  5. 强大博客搭建全过程(1)-hexo博客搭建保姆级教程

    1. 前言 本人本来使用国内的开源项目solo搭建了博客,但感觉1核CPU2G内存的服务器,还是稍微有点重,包括服务器内还搭建了数据库.如果自己开发然后搭建,耗费时间又比较多,于是乎开始寻找轻量型的博 ...

  6. RocketMQ保姆级教程

    大家好,我是三友~~ 上周花了一点时间从头到尾.从无到有地搭建了一套RocketMQ的环境,觉得还挺easy的,所以就写篇文章分享给大家. 整篇文章可以大致分为三个部分,第一部分属于一些核心概念和工作 ...

  7. 用 Python 写个贪吃蛇,保姆级教程!

    本文基于 Windows 环境开发,适合 Python 新手 本文作者:HelloGitHub-Anthony HelloGitHub 推出的<讲解开源项目>系列,本期介绍 Python ...

  8. Windows 安装 Docker 并使用 VS code 连接

    安装前提 Docker是基于linux的,在win10中安装wsl2:Windows Subsystem for Linux,让win10能够原生运行Linux二进制可执行文件的兼容层,且不会产生传统 ...

  9. 保姆级教程!使用k3d实现K3s高可用!

    你是否曾经想尝试使用K3s的高可用模式?但是苦于没有3个"备用节点",或者没有设置相同数量的虚拟机所需的时间?那么k3d这个方案也许你十分需要噢! 如果你对k3d尚不了解,它的名字 ...

  10. windows使用docker运行mysql等工具(一)windows安装docker

    由于我本地的mysql版本比较低,最近想着要升级一下mysql版本,鉴于docker容器的火热,就想着在本地装个docker环境,然后下载最新版的mysql镜像,完成mysql8.0的安装.电脑是wi ...

随机推荐

  1. Netty5 服务端和客户端-copy

    概述netty 5 已经放弃掉了,作为学习netty4和5的差别不大,本例子是基于netty5 https://github.com/netty/netty/issues/4466 线程安全一个thr ...

  2. Windows 激活

    参考:链接1   链接2   链接3  链接4

  3. MySQL5.7x 主从复制

    原文链接:https://blog.liuzijian.com/post/9f8ede8e-26de-75d6-6347.html 在MySQL中,主从复制(Master-Slave Replicat ...

  4. Linux下安装jdk的两种方法

    Linux下安装jdk的两种方式和安装mvn 有网的环境 yum方式下载安装1.查找java相关的列表   1 yum -y list java* 或者   1 yum search jdk 2.安装 ...

  5. 管理虚拟机(virtual-manager)

  6. 百万架构师第三十七课:RabbitMq:高可用集群搭建步骤|JavaGuide

    安装环境 Centos-7 三台虚拟机 192.168.8.150(磁盘节点) 192.168.8.45 (内存节点) 192.168.8.40 (内存节点) 一.安装Erlang 1.erlang ...

  7. WPF DevExpress GridColumn ComboBox 显示选择内容的 TooTip

    实现显示当前选择的ComboBox中项的ToolTip信息: 1. 设置 GridColumn 的 CellTemplate 为 ComboBoxEdit , 然后自定义他的 ItemContaine ...

  8. 【忍者算法】从拉链到链表:探索有序链表的合并之道|LeetCode 21 合并两个有序链表

    从拉链到链表:探索有序链表的合并之道 生活中的合并 想象你正在整理两叠按日期排好序的收据.最自然的方式就是:拿起两叠收据,每次比较最上面的日期,选择日期较早的那张放入新的一叠中.这个简单的日常操作,恰 ...

  9. [SDOI2016] 数字配对 题解

    发现题目中描述的配对条件可以理解为:\(pc_i-pc_j=1\) 且 \(a_i\bmod a_j=0\),其中 \(pc_i\) 表示 \(a_i\) 的质因数个数. 自然想到以 \(pc\) 奇 ...

  10. intellij debug模式提示 Method breakpoints may dramatically slow down debugging 解决办法

    直接上图........ 点击图中按钮  或者 快捷键(Ctrl - Shift -F8 ) 出现下图