目前使用 wsl2 的 docker 加上 vscode 的開發流程有一段時間了,因此寫下這篇紀錄環境的安裝,目前使用過的語言和框架:
- python、tensorflow-gpu
- c/c++、java
為什麼想使用 docker 來開發?
Docker 是一種容器(container)化的技術,將該技術用作 開發 有許多的好處:
- 用各種語言開發時不用將所有的環境都安裝在 pc 上,減少環境設定的衝突 (ex: py3.6, py3.8, nodejs, ….)。
- 多台電腦 (or 換新電腦) 開發時不用每一台都設定一次環境,從 repo 拉下來就可直接參與開發。
- 方便管理環境,並環境一但變動所有人都可拿到最新的可運行的環境(延伸第 2 點)。
p.s. 再加上使用 vscode 產生 container 只需點按幾下就可產生各種環境和所需的各種 extension,方遍、快速、好管理。
環境設定 – windows
由於 docker 這一技術是在 linux 系統上出現的,因此最適合的方法就是將電腦重灌成 linux 系統,但這樣就失去 windows 系統的許多方便功能,office系列、steam的遊戲(這是無可比擬的優點 d(`・∀・)b)、…,因此本次環境設置是基於 wsl2 來設定的,wsl2 除了少數的機制和現代 linux distribution 有些許不太相同外 (目前有碰到的是 init & systemd,其他還有待查證) 都可當成 linux 系統來操作使用。
wsl2: Windows Subsystem for Linux version 2
安裝 wsl2
- 打開 cmd 或 PowerShell 下指令
wsl --install
- 安裝 linux distribution
wsl --list --online
查看有什麼版本可以安裝1
2
3
4
5
6
7
8
9
10
11
12以下是可安裝之有效發佈的清單。
使用 'wsl --install -d <Distro>' 安裝。
NAME FRIENDLY NAME
Ubuntu Ubuntu
Debian Debian GNU/Linux
kali-linux Kali Linux Rolling
openSUSE-42 openSUSE Leap 42
SLES-12 SUSE Linux Enterprise Server v12
Ubuntu-16.04 Ubuntu 16.04 LTS
Ubuntu-18.04 Ubuntu 18.04 LTS
Ubuntu-20.04 Ubuntu 20.04 LTSwsl --install -d <DistroName>
安裝所需的版本,我是選擇 Ubuntu-20.04,這便看你偏好的是什麼版本。
完成上面兩道指令 wsl2 就安裝完成了,但我有碰到一個問題,在後面會提供找到的解法。
安裝 windows 版本的 docker
下載 docker desktop,點兩下安裝。
讓 WSL 可以使用 CUDA
為了讓 WSL 可以使用電腦的 NVIDIA GPU 訓練 model, 需要做一些設定….
在 win10 21H2 或 win11 之後就不用這麼麻煩了,之前還需要加入 windows 的開發者計畫才有這功能…,所以我的電腦才需要重灌 (◢▆▅▄▃崩╰(〒皿〒)╯潰▃▄▅▇◣),現在只需要裝 nvidia 最新的 driver 即可在 wsl 和 docker 使用 gpu 訓練 model。
驗證 gpu 是否可以運作 docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
:
1 | C:\Users\frank>docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark |
問題
error: 0x800701bc
如果在 docker run ....
這道指令出現 WslRegisterDistribution failed with error: 0x800701bc
的錯誤的話就代表需要升級 wsl2 ????(查詢到的資訊,不太確定),下載 update package 並點兩下安裝,重啟後就可以了。
error: 0x80370102
需要到 bios 檢查是否有開啟”虛擬化”,我是使用 amd 的 cpu & asus 主機板
因此在 bios > advanced > svm mode
選擇 enabled 即可開啟虛擬化。
vscode 操作 docker
環境設定完成後最重要的就是用 vscode 簡單的操作 docker ,快速建立需要的環境並馬上開發。
- 下載 vscode … 官網->download-> 點兩下安裝
- vscode extension 安裝
- remote 三套件(Remote - SSH、Remote - Containers、Remote - WSL)
- 主要是 Remote - Containers 幫我們創建 container ,但另外兩套也都十分有用就順便都裝一裝。
- Docker 套件: 從 vscode 管理 docker 環境和撰寫 dockerfile。
- remote 三套件(Remote - SSH、Remote - Containers、Remote - WSL)
- 用 vscode 的操作面板生成 dockerfile 和 vscode 的環境設定
- 按下
F1
或ctrl + shift + p
打開 vscode 操作面板,輸入 remote-container ,找到 add development …
- 選擇需要的環境設定(這邊我選 c++ 當範例)
- 一路選下去就會生成必要的 cfg 檔案
- 按下
F1
或ctrl + shift + p
打開 vscode 操作面板,輸入 remote-container ,找到 rebuild and reopen… ,等待環境建立,可能需要一陣子。
- 成功後 vscode 右下角會出現這一個標誌和環境的名稱
- 寫一些 code 驗證是否有所需的編譯器和環境
F5
來 debug 看看,選擇一些設定:
選擇編譯器
執行結果
- 按下
更重要的是當我們關掉 vscode 可以到當初選擇放資料的地方,可以看到我們寫的東西都還存在本機端,因為 vscode 預設是用 bind 的方法將 windows 的資料夾綁到 docker 的 container 裡面,因此我們在 container 中修改的東西都還是會保存在主機上,不會隨著 container 消失而消失。
.devcontainer
資料夾就是放 vscode 建立 container 的各種檔案,dockerfiles、devcontainer.json(vscode 的設定),有意思的是這兩個檔案都是文字檔,因此都可套用版本追蹤,推上 git server 之後只要下載下來並用 vscode 開啟環境和 code 都一併重現在其他電腦上。