手繪流程圖,教你WSL2與Docker容器無縫互相遷移
摘要:本文主要介紹WSL2與Docker容器無縫遷移映象。
本文分享自華為雲社群《WSL2與Docker容器,無縫互相遷移》,作者: tsjsdbd 。
注:本文提到的WSL都是指WSL2
WSL與Docker
WSL非常像windows版的Docker,可以直接啟動“容器”(故意加引號,下面有解釋),並且在容器世界裡面,可以執行各種Linux操作。像下面這樣,是不是和Docker很像?
ps:上面提到的“容器”,實際是安全容器(即:虛機),WSL2內部架構如下:
雖WSL和Docker很像,但是它對WSL映象有要求,就是得從 MS的應用商店下載:
這個就稍顯不那麼方便,畢竟你可能已經有很多現成的Docker容器了,這裡又得重新安裝一遍。
我是Windows上有WSL,我的Linux開發機上有Docker,那我怎麼在WSL裡面跑Docker呢?
WSL執行Docker容器
常見的WSL裡面執行Docker,是這樣子的:
就是把WSL當做一臺新的開發機,然後在WSL裡面,安裝Docker軟體。
這樣子,也能解決問題。就是稍微麻煩了一點點。那能不能WSL直接執行Docker映象呢?
答案是可以的:
參考:https://docs.microsoft.com/en-us/windows/wsl/use-custom-distro
這種方法下,是類似這個樣子的:
具體操作如下:
- 在Docker裡面,將容器匯出來
//檢視正在執行的容器 docker ps//根據容器ID,匯出映象包 docker export $ContainerID > ./tsjsdbd.tar
- 然後再WSL裡面,將Docker映象匯入:
wsl --import <DistributionName> <InstallLocation> <FileName>
示例
比如,我這裡用Docker運行了一個busybox容器:
docker run -it busybox /bin/sh
然後查詢容器ID:
docker ps
CONTAINER ID IMAGE
c1e9e8f77336 busybox
匯出:
docker export c1e9e8f77336 > tsjsdbd_busybox.tar
然後我把這個 映象檔案,拷貝到我的windows電腦上。
並在wsl裡面匯入:
wsl --import tsjsdbd_busybox ./busybox ./tsjsdbd_busybox.tar
匯入後檢視:
wsl -l
這時,我啟動這個 busybox 映象。
wsl -d tsjsdbd_busybox
OK,這時我已經在WSL容器裡面了,這是一個busybox的Docker容器映象。
Docker執行WSL映象
從上面的操作可以看出來,WSL和Docker的映象是相通的。所以WSL系統,也可以匯出給Docker直接執行。類似這個樣子:
具體操作如下:
先檢視下當前跑了哪些wsl容器:
wsl -l -v NAME STATE VERSION * Ubuntu-18.04 Stopped 2 tsjsdbd_busybox Running 2
匯出指定的wsl映象
wsl --export tsjsdbd_busybox ./mybox.tar
其中 “tsjsdbd_busybox” 就是你希望導給Docker執行的WSL容器(裡面可能安裝了一些你需要的軟體)。匯出的tar包,就可以看做是WSL映象了(可以直接匯入給Docker)
最後,在Docker裡面,匯入這個映象:
docker import - mybox < mybox.tar
可以查詢此映象
docker images |grep mybox
並啟動
docker run -it mybox /bin/sh
WSL映象與Docker映象
大體上,我給個示意:
所以WSL確實挺香的。
WSL啟動GUI介面
整體方案是利用 X11 Server,原理參考:
《Docker執行帶UI介面的應用,並將它的介面投射到你的Windows電腦》
https://bbs.huaweicloud.com/blogs/281862
X11 Server,一般網上推薦 VcXsrv,我自己用下來,感覺 MobaXterm 更傻瓜一些。所以我都用 MobaXterm 的。
附:安裝WSL
1. 系統要求
Windows 10,版本 2004 以上。
比如我的是 20H2,是OK的。
點選:開始-設定-關於,查詢自己的版本
2. 判斷wsl2是否已有
開啟 power shell,輸入
wsl -l -o
如OK,則不用後續步驟了(說明你的windows版本已經比較高)。
不行,則手動執行後續步驟
3. 允許開發者模式
4. 啟動WSL2功能
啟用WSL2
dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart
啟用虛擬機器平臺
dism.exe /online /enable-feature /featurename:VirtualMachinePlatform /all /norestart
啟用Hyper-V
dism.exe /online /enable-feature /featurename:Microsoft-Hyper-V /all /norestart
設定WSL2為預設
wsl --set-default-version 2
5. 重啟,安裝wsl補丁
wsl_update_x64.msi
執行以上補丁包。
補丁包下載地址:
https://wslstorestorage.blob.core.windows.net/wslblob/wsl_update_x64.msi
附:高階版 GPU,GUI介面
Windows版本高的(win10 21H2),可以在WSL2裡面跑CUDA
https://docs.microsoft.com/en-us/windows/ai/directml/gpu-cuda-in-wsl
再高一點(win11),可以原生支援帶GUI介面的Linux程式。
https://docs.microsoft.com/en-us/windows/wsl/tutorials/gui-apps