【保姆級教程】windows 安裝 docker 全流程
一、背景
許多小伙伴在安裝 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 歷史上存在兩個版本,這點同樣也造成了大家的困擾。
- WSL1 發布于 2016 年 8 月,隨 Windows 10-1607 版本發布,它是一種基于 Windows NT 內核實現的組件,支持在用戶模式下運行 Linux 二進制文件,原理是將 Linux 系統調用轉換為 Windows 系統調用。簡單說,由于 WSL1 僅僅是做了一層系統調用的轉換,它并沒有真正的 Linux 內核,所以對 Docker 的支持不是太好。
- WSL2 于 2019 年 5 月,隨 Windows 10-1903(高階版本)發布。WSL2 相比 WSL1 帶來了一個革命性的變化,那就是 WSL2 利用了 HyperV 的虛擬化功能來提供完整的 Linux 內核支持,而 WSL2 相比 HyperV 提供了更簡單、簡潔的操作接口。
不難發現,想要在 Windows 上完美運行 Docker,我們需要 WSL2 + HyperV 這兩個底層技術,并至少確保操作系統在 Windows 10-1903 版本或以上。
二、環境準備
首先,我們需要明確 Windows 安裝 Docker 的一些先決條件:
- 確保 Window 版本在 10/11 以上
- 確保系統啟用了 虛擬化支持
- 確保系統支持 HyperV 組件
- 確保系統安裝了 WSL2 最新版本
- 確保虛擬化所需的 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
默認網關. . . . . . . . . . . . . :
- 容器可以通過 host.docker.internal 特殊域名訪問宿主機
- 宿主機可以通過 環回地址 訪問容器端口
- 容器可以通過 WSL 的 IP 地址訪問宿主機
Mirrored 網絡模式
在鏡像網絡模式中,WSL2 子系統與主機共享網絡接口,此時不需要 獨立的 WSL 網卡。
- 容器可以通過 host.docker.internal 特殊域名訪問宿主機
- 宿主機可以通過 環回地址 訪問容器端口
- 容器和宿主機可以通過主機的 IP 地址進行互訪(需檢測分別WSL和主機分別綁定的IP)
關于網絡訪問更多信息,可參考官網說明:
https://learn.microsoft.com/zh-cn/windows/wsl/networking
六、常見問題
端口綁定失敗
對于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
七、參考文檔
使用 WSL 訪問網絡應用程序
https://learn.microsoft.com/zh-cn/windows/wsl/networking
WSL 高級配置
https://learn.microsoft.com/zh-cn/windows/wsl/wsl-config
作者: 美碼師(zale)
出處: http://www.rzrgm.cn/littleatp/, 如果喜歡我的文章,請關注我的公眾號
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出 原文鏈接 如有問題, 可留言咨詢.
浙公網安備 33010602011771號