0%

windows -- Docker -- vscode

目前使用 wsl2 的 docker 加上 vscode 的開發流程有一段時間了,因此寫下這篇紀錄環境的安裝,目前使用過的語言和框架:

  • python、tensorflow-gpu
  • c/c++、java

為什麼想使用 docker 來開發?

Docker 是一種容器(container)化的技術,將該技術用作 開發 有許多的好處:

  1. 用各種語言開發時不用將所有的環境都安裝在 pc 上,減少環境設定的衝突 (ex: py3.6, py3.8, nodejs, ….)。
  2. 多台電腦 (or 換新電腦) 開發時不用每一台都設定一次環境,從 repo 拉下來就可直接參與開發。
  3. 方便管理環境,並環境一但變動所有人都可拿到最新的可運行的環境(延伸第 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

  1. 打開 cmd 或 PowerShell 下指令 wsl --install
  2. 安裝 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 LTS
    • wsl --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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
C:\Users\frank>docker run --rm -it --gpus=all nvcr.io/nvidia/k8s/cuda-sample:nbody nbody -gpu -benchmark
Run "nbody -benchmark [-numbodies=<numBodies>]" to measure performance.
-fullscreen (run n-body simulation in fullscreen mode)
-fp64 (use double precision floating point values for simulation)
-hostmem (stores simulation data in host memory)
-benchmark (run benchmark to measure performance)
-numbodies=<N> (number of bodies (>= 1) to run in simulation)
-device=<d> (where d=0,1,2.... for the CUDA device to use)
-numdevices=<i> (where i=(number of CUDA devices > 0) to use for simulation)
-compare (compares simulation results running once on the default GPU and once on the CPU)
-cpu (run n-body simulation on the CPU)
-tipsy=<file.bin> (load a tipsy model file for simulation)

NOTE: The CUDA Samples are not meant for performance measurements. Results may vary when GPU Boost is enabled.

> Windowed mode
> Simulation data stored in video memory
> Single precision floating point simulation
> 1 Devices used for simulation
GPU Device 0: "Turing" with compute capability 7.5

> Compute 7.5 CUDA device: [NVIDIA GeForce GTX 1660 Ti with Max-Q Design]
24576 bodies, total time for 10 iterations: 48.718 ms
= 123.974 billion interactions per second
= 2479.476 single-precision GFLOP/s at 20 flops per interaction

問題

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 ,快速建立需要的環境並馬上開發。

  1. 下載 vscode … 官網->download-> 點兩下安裝
  2. vscode extension 安裝
    1. remote 三套件(Remote - SSH、Remote - Containers、Remote - WSL)
      • 主要是 Remote - Containers 幫我們創建 container ,但另外兩套也都十分有用就順便都裝一裝。
    2. Docker 套件: 從 vscode 管理 docker 環境和撰寫 dockerfile。
  3. 用 vscode 的操作面板生成 dockerfile 和 vscode 的環境設定
    1. 按下 F1ctrl + shift + p 打開 vscode 操作面板,輸入 remote-container ,找到 add development …
      vscode remote-container add development config
    2. 選擇需要的環境設定(這邊我選 c++ 當範例)
      remote-container c++ env
    3. 一路選下去就會生成必要的 cfg 檔案
      vscode docker cfg files
    4. 按下 F1ctrl + shift + p 打開 vscode 操作面板,輸入 remote-container ,找到 rebuild and reopen… ,等待環境建立,可能需要一陣子。
      vscode remote-container add development config
    5. 成功後 vscode 右下角會出現這一個標誌和環境的名稱
      success build container
    6. 寫一些 code 驗證是否有所需的編譯器和環境
      • F5 來 debug 看看,選擇一些設定:
        select env
        選擇編譯器
        select compiler
        執行結果
        cpp run result

更重要的是當我們關掉 vscode 可以到當初選擇放資料的地方,可以看到我們寫的東西都還存在本機端,因為 vscode 預設是用 bind 的方法將 windows 的資料夾綁到 docker 的 container 裡面,因此我們在 container 中修改的東西都還是會保存在主機上,不會隨著 container 消失而消失。
all develop files

.devcontainer 資料夾就是放 vscode 建立 container 的各種檔案,dockerfiles、devcontainer.json(vscode 的設定),有意思的是這兩個檔案都是文字檔,因此都可套用版本追蹤,推上 git server 之後只要下載下來並用 vscode 開啟環境和 code 都一併重現在其他電腦上。

參考

  1. 安裝 wsl
  2. wsl2 問題
  3. docker for windows
  4. microsoft 官網 – 安裝 docker
  5. Enable NVIDIA CUDA on WSL
  6. nvidia – CUDA on WSL