因此,在WSL2沒有出現之前如果要在Windows上玩Docker很多人是不建議的。
因為即使是使用Docker官方的提供的Docker for Windows也是經常出些奇奇怪怪的錯誤並遲遲得不到解決。通過虛擬機安裝boot2docker.iso,在虛擬出來的Linux系統下玩,但啟動虛擬機是真慢。而且隨著WSL2的推出boot2docker也不在維護。因此WSL2,對於經常需要使用一些辦公程序軟體、又想玩Docker、還沒錢買Mac的用戶來說,確實是一個福音!
安裝 WSL2查看系統版本Update to WSL2 Requirements即:最新的WSL2特性要求在 Windows 10 x64 Version 1903及以上版本的系統或ARM64 systems: Version 2004及以上版本的系統.
Win+R 輸入 winver,即可查看到當前自己Windows版本信息:
一定要確保系統已經達到標準,不然通過WSL使用Docker會遇到各種不知道為啥的坑,而且啟動Docker也非常慢。
WSL2 更新特性:https://docs.microsoft.com/en-us/windows/wsl/compare-versions#whats-new-in-wsl-2
下列命令都需要使用管理員身份運行PowerShell,運行下列腳本!!!
安裝WSL:開啟Windows-Subsystem-Linux特性dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestartdism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart升級完畢之後,需要重啟計算機!!!
查看系統類型,在 PowerShell 中輸入systeminfo即可查看,如下圖是x64的版本:
systeminfoWSL2 Linux kernel update package for x64 machinesWSL2 Linux kernel update package for ARM64 machines
下載對應補丁包安裝補丁!
要使用管理員身份運行PowerShell,運行下列腳本:
wsl --set-default-version 2如果你之前已經通過 WSL1 安裝了 Linux,現在想轉為WSL2運行,可參考:https://docs.microsoft.com/en-us/windows/wsl/install-win10#set-your-distribution-version-to-wsl-1-or-wsl-2
安裝 Linux 子系統在Microsoft Store上搜索一個你自己喜歡的子系統進行安裝Microsoft Store Result for search Linux
打開PowerShell,輸入wsl -l -v可以看到你的子系統運行版本
wsl -l -v
如果你想重啟 WSL 系統,使用管理員身份打開 PowerShell 執行下列命令
Get-Service LxssManager | Restart-Service
安裝Windows TerminalWindows的命令行向來是以醜著稱,Windows Terminal總算是挽救了一點它的顏值。
Windows Terminal安裝:https://github.com/microsoft/terminal使用指南:https://docs.microsoft.com/zh-cn/windows/terminal/customize-settings/global-settings如何給 Windows Terminal 增加一個新的終端
下述是我將Git-Bash添加到Windows Terminal的配置
{
// guid 可以通過網上查詢 guid 生成器生成:http://tool.pfan.cn/guidgen
"guid": "{ce7a80b8-da75-4628-a2e1-663af0f3ce7c}", // 終端唯一標識號,用於設置`defaultProfile`-默認打開哪個終端
"name": "Git Bash", // 終端名稱
"icon": "C:\\Self\\code\\CVS\\Git\\git-for-windows.ico", // 終端ICON圖標路徑
"commandline": "C:\\Self\\code\\CVS\\Git\\bin\\bash.exe --login -i", // 終端所在絕對路徑
"startingDirectory":"D:\\htdocs", // 打開終端默認打開路徑,如果為null則默認上一次退出時路徑
"hidden": false, // 是否隱藏不展示
"useAcrylic" : true, // 是否使用磨砂效果
"acrylicOpacity" : 0.8, // 磨砂效果
"colorScheme" : "Campbell", // 配色方案
"cursorColor" : "#FFFFFD", // 光標顏色
"fontFace" : "Fira Code", // 終端字體
"backgroundImage":"C:\\Users\\Minso\\Pictures\\Camera Roll\\view.jpg", // 終端背景圖
"backgroundImageOpacity":0.75, // 背景圖透明度
}
方式一:Docker Desktop+WSL2 運行 DockerDocker Desktop 將 Docker CE、Docker Compose、Kubernets 等軟體整合在了一起進行安裝,省去了一一安裝的煩惱。
Docker Daemon 由於是安裝在宿主機上的,因此可以直接使用宿主機的網卡信息對容器進行訪問。
下載安裝Docker Desktop運行 Docker,可以讓你在Windows中方便的管理配置DockerDocker for Windows:https://desktop.docker.com/win/stable/Docker%20Desktop%20Installer.exeDoecker for Mac:https://desktop.docker.com/mac/stable/Docker.dmg傻瓜式安裝即可!
配置Docker Desktop使用WSL2運行Docker engineUse the WSL 2 based engine
Configure which WSL 2 distros you want to access Docker from
現在你就可以在對應的子系統中玩 Docker 了,打開安裝好的子系統,輸入docker info就可以查看到對應的系統信息了.
方式二:WSL2子系統中安裝Docker該方式是利用 Windows Hyper-v 將 Docker 裝在子系統虛擬機中的,但該方式裝的虛擬機啟動、讀寫性能方面要比使用Virtual Box、VM 的方式更好。
安裝最新Docker CE
curl -fsSL get.docker.com -o /tmp/get-docker.sh && sudo /bin/sh /tmp/get-docker.sh --mirror Aliyun && rm -f /tmp/get-docker.sh
啟動並檢驗安裝是否成功# 啟動 docker 服務
sudo service docker start # 注意:有的Linux系統時通過`systemctl start docker`啟動
# 列印docker系統詳細信息
docker infodocker info
看到以上信息證明已經安裝完成並成功啟動了服務!
踩坑預警使用docker info列印信息時可能會遇到下述信息,提示/var/run/docker.sock權限不足
Client:
Debug Mode: false
Server:
ERROR: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.40/info: dial unix /var/run/docker.sock: connect: permission denied
errors pretty printing info/var/run/docker.sock connect permission denied
通過ls -al /var/run/docker.sock查看該文件權限信息,發現文件是root用戶或docker組用戶才能進行讀寫
ls -al show files info可以通過id或groups ${USER}查看當前用戶所在的組信息,發現當前用戶的附加組信息裡並沒有docker,那麼問題就好解決了:只需將當前用戶加入到docker組即可.
id show ${USER} groupssudo groupadd dockersudo usermod -aG docker ${USER}你需要先登出再重新登錄一次,這樣當前系統會重新刷新你的身份信息。或者,使用下列方式不用退出即可刷新當前進程的用戶身份信息:
exec su -l ${USER}此時再運行docker info應該就正常列印信息了!
安裝最新Docker Compose可參考:https://docs.docker.com/compose/install/#install-compose-on-linux-systems
# 下載當前最新版本是:1.27.4
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 賦予 docker-compose 可執行權限
sudo chmod +x /usr/local/bin/docker-compose
# 刷新當前進程信息
exec $SHELL -l
# 檢查docker-compose是否安裝成功
docker-compose --version
設置Docker Server鏡像源加速Docker 官方中國區鏡像地址:https://registry.docker-cn.com網易鏡像地址:http://hub-mirror.c.163.comustc鏡像地址:https://docker.mirrors.ustc.edu.cn阿里雲鏡像地址設置參考文章底部:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors如果想使用阿里雲鏡像地址需要有阿里雲帳號,但我在廣州試用了上述的鏡像地址,確實設置了阿里雲的鏡像加速是效果最好的
通過Docker Desktop配置registry-mirrors如果是使用 Docker Desktop+WSL 方式安裝 Docker 直接使用面板即可修改!
set registry-mirrors for Docker Desktop配置 WSL2 中的 Docker 鏡像加速地址
當你的docker版本較新(Docker Version >= 1.10)時,建議直接通過 /etc/docker/daemon.json 進行配置(若沒有該文件則直接新建,寫入下述配置即可)
{
"registry-mirrors": ["http://hub-mirror.c.163.com"]
}若Docker版本比較舊,則需根據系統的不同而修改不同位置的配置文件,詳細參考此處
修改完成後,執行sudo service docker restart重啟docker
update setting registry-mirrors解決 WSL2 安裝 Docker 的一些問題1. 開機啟動Docker服務
WSL的是一個基於Windows系統的Hyper V服務運行的Linux系統,但沒有對應的開機自檢程序,因此在WSL中設置服務開機啟動是沒有用的。
因此,通過實現Windows的開機啟動項執行一端腳本調用WSL內的服務,從而達到 WSL 開機啟動服務的目的。
查閱並試驗了網上的一些文章,大致分為兩類:
通過將VBScript腳本的快捷方式放到C:\Users\{USER}\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup下,從而實現開機自啟【試驗結果:Windows 10 似乎由於權限問題,不能將 *.vbs 格式腳本放置到該目錄下】通過修改註冊列表的實現開機自動執行一段命令【試驗結果:可行】shell-script-init.wsl
配置/etc/sudoers文件,將下述信息加入到文件末端
# 設置sudo腳本-無需輸入密碼驗證
%sudo ALL=NOPASSWD: /etc/init.wsl# -u root 通過roo用戶啟動wsl
# -e /etc/init.wsl 啟動執行 /etc/init.wsl腳本
wsl -u root -e /etc/init.wslpowershell 調用 wsl內部腳本2. 解決 WSL2 內網IP變動問題
由於WSL 2新的體系結構使用虛擬化的網絡組件,每次計算機重啟的時候都會重置WSL 2的虛擬網卡,因此每次重啟完計算機後WSL2中的IP位址都不一定一樣。
Get-Servcie-LxssManager-Restarat-Service.png
雖然我們可以通過localhost訪問到WSL中的服務,但是當需要配置多個虛擬域名的時候該方法顯然就不適用了,此時若要在宿主機中通過虛擬域名訪問WSL 2中的網絡服務需要每次手動對宿主機的hosts文件修改其IP-Domain映射關係。
於是,想了兩個方案:
方法一:通過批處理腳本,啟動時自動獲取WSL 2的網卡信息,自動修改宿主機的hosts原有的IP-Domain信息該方法需要懂批處理腳本語言,而且實際開發情景中開發環境一般都是整個開發組統一進行維護的。包括hosts文件一般也是統一進行維護然後通過SwitchHosts從遠端獲取。因此方式一比較適用個人本地項目,因為hosts一般不會變動,但並不適用協同辦公的情景。
方法二:想辦法將WSL的網卡信息「固定下來」-設置私有IP,組建宿主機-WSL 2區域網由於WSL 2的網卡每次都會被重置,因此設置靜態IP的方式勢必是走不通的。因此:只能在每次計算機開機或重啟的時候通過腳本為WSL 2增置一個新的私有網卡IP,並同時在宿主機上增設一個一樣網段的乙太網卡私有IP,在宿主機與虛擬機之間組建一個小型的區域網進行服務通信。
# `WSL 2`新增網卡
# - 設置私有IP網段為192.168.33.10-192.168.33.28
# - 廣播地址為192.168.169.15
# - 網卡名稱為 eth0
# - 設置網卡標籤 eth0:1
wsl -u root ip addr add 192.168.33.10/28 broadcast 192.168.169.15 dev eth0 label eth0:1
# 設置宿主機網卡`vEthernet (WSL)`地址為 `192.168.33.1`-需要管理員權限
netsh interface ip add address "vEthernet (WSL)" 192.168.33.1 255.255.255.240
3. 修改註冊列表實現宿主機開機自動執行初始化腳本WSL2 開機啟動Docker服務腳本-放在虛擬機中/etc/init.wsl位置#!/bin/sh
# 啟動docker服務
sudo service docker start
# 開啟 rpcbind 服務
sudo mkdir -p /run/sendsigs.omit.d/ && sudo /etc/init.d/rpcbind start
Windows宿主機開機需自動執行的init-wsl.bat腳本@echo off
:: run task as administrator
%1 %2
ver|find "5.">nul&&goto :Admin
mshta vbscript:createobject("shell.application").shellexecute("%~s0","goto :Admin","","runas",1)(window.close)&goto :eof
:Admin
:: set WSL distribution
set distribution=Ubuntu-20.04
:: 設置WSL初始化腳本位置
set initWSL=/etc/init.wsl
:: 配置宿主機私有網絡IP、WSL2私有網絡IP、廣播地址、子網掩碼
set hostOSIP=192.168.33.1
set WSL2IP=192.168.33.10
set WSL2Broadcast=192.168.33.15
set subnetMask=255.255.255.240
:: init WSL2 services
wsl -d %distribution% -u root -e %initWSL%
if %ERRORLEVEL% NEQ 0 (
echo init WSL services error OR Already init WSL!
pause
) else (
echo init WSL success!
)
:: set wsl2 ip
wsl -d %distribution% -u root ip addr | findstr "%WSL2IP%" > nul
if !errorlevel! equ 0 (
echo wsl ip has set!
) else (
wsl -d %distribution% -u root ip addr add %WSL2IP% broadcast %WSL2Broadcast% dev eth0 label eth0:1
echo set wsl ip success: %WSL2IP%
)
:: set windows ip
ipconfig | findstr %hostOSIP% > nul
if !errorlevel! equ 0 (
echo windows ip has set!
) else (
netsh interface ip add address "vEthernet (WSL)" %hostOSIP% %subnetMask%
echo set windows ip success: %hostOSIP%
)Windows鍵+R,輸入regedit打開註冊列表,在地址欄輸入計算機\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run定位到對應註冊表位置,右鍵新建一個字符串值,鍵入對應命令即可,如下圖!
set regist service重啟計算機即可發現,WSL中的Docker服務已經被啟動,通過192.168.33.10可以直接訪問到WSL內部的網絡!