在 Windows 上部署支持 CUDA 的 Docker 容器
概述
本指南將幫助你在 Windows 系統上部署一個支持 CUDA 的 Docker 開發容器,該容器基于 Ubuntu 20.04,并預裝了 Python、PyTorch 等開發環境,同時配置了 SSH 服務以便遠程訪問。
前提條件
- Windows 10 或 Windows 11(版本 21H2 或更高)
- 已安裝 Docker Desktop for Windows
- 支持 CUDA 的 NVIDIA GPU
- 已安裝 NVIDIA 顯卡驅動(版本 516.xx 或更高)
- 已安裝 WSL 2(Windows Subsystem for Linux 2)
步驟
1. 驗證系統準備情況
首先,確保你的系統滿足以下要求:
-
確認已啟用 WSL 2:
wsl --list --verbose -
確認已安裝 NVIDIA 驅動且支持 CUDA:
nvidia-smi -
如果沒有安裝該驅動的可以移步至我的另一篇blog:“在Windows 系統上安裝和配置 NVIDIA 驅動”
2. 安裝 NVIDIA Container Toolkit
-
下載并安裝 NVIDIA Container Toolkit:
- 訪問 NVIDIA Container Toolkit 官網
- 按照 Windows 安裝指南進行操作
-
或在 WSL 2 的 Linux 發行版中運行:
distribution=$(. /etc/os-release;echo $ID$VERSION_ID) curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add - curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit sudo nvidia-ctk runtime configure --runtime=docker sudo systemctl restart docker
3. 配置 Docker Desktop
- 打開 Docker Desktop 設置
- 前往 "General" 確保已勾選 "Use the WSL 2 based engine"
- 前往 "Resources" > "WSL Integration" 啟用你的 WSL 2 發行版
- 前往 "Docker Engine" 并確保配置中包含以下內容:
{ "runtimes": { "nvidia": { "path": "nvidia-container-runtime.exe", "runtimeArgs": [] } } }
4. 創建項目文件
-
在你的工作目錄中創建以下文件:
Dockerfile:
# 使用官方 CUDA 鏡像作為基礎 FROM nvidia/cuda:11.8.0-runtime-ubuntu20.04 # 避免安裝過程中交互式提示 ENV DEBIAN_FRONTEND=noninteractive # 配置 Ubuntu 使用清華源 RUN sed -i 's/archive.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list && \ sed -i 's/security.ubuntu.com/mirrors.tuna.tsinghua.edu.cn/g' /etc/apt/sources.list # 安裝系統依賴和開發工具,包括 SSH 服務器 RUN apt-get update && apt-get install -y \ curl \ wget \ git \ build-essential \ openssh-server \ python3 \ python3-pip \ sudo \ && rm -rf /var/lib/apt/lists/* # 為 VS Code 創建用戶并設置密碼 RUN useradd -m -s /bin/bash vscode && \ echo "vscode:vscode" | chpasswd && \ usermod -aG sudo vscode && \ echo "vscode ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers # 配置 SSH RUN mkdir /var/run/sshd && \ sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \ sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config # 安裝 Python 包 USER vscode WORKDIR /home/vscode RUN pip install numpy pandas torch -i https://pypi.tuna.tsinghua.edu.cn/simple # 暴露 SSH 端口 EXPOSE 22 # 啟動 SSH 服務 CMD ["sudo", "/usr/sbin/sshd", "-D"]docker-compose.yml:
version: '3.8' services: cuda-dev: build: context: . dockerfile: Dockerfile container_name: cuda-dev ports: - "2222:22" # 將容器的SSH端口映射到宿主機的2222端口 runtime: nvidia # 使用NVIDIA容器運行時以支持GPU deploy: resources: reservations: devices: - driver: nvidia count: all capabilities: [gpu] restart: unless-stopped volumes: - ./workspace:/home/vscode/workspace # 可選:掛載工作目錄以便持久化代碼 environment: - NVIDIA_VISIBLE_DEVICES=all
5. 構建和運行容器
- 打開 PowerShell 或 WSL 終端,導航到項目目錄
- 構建 Docker 鏡像:
docker-compose build - 啟動容器:
docker-compose up -d
6. 測試容器
-
驗證容器是否正常運行:
docker ps -
測試 SSH 連接:
ssh -p 2222 vscode@localhost密碼是
vscode -
測試 CUDA 是否可用:
python3 -c "import torch; print(torch.cuda.is_available())"
網絡配置:在 Windows 防火墻中開放 2222 端口
為了讓宿主機或其他設備能夠通過 SSH 訪問容器,需要配置 Windows 防火墻,允許對 2222 端口的入站連接。以下是兩種方法:
方法一:通過圖形化界面操作 (Windows Defender 防火墻)
-
打開 Windows Defender 防火墻
- 在開始菜單搜索“高級安全 Windows Defender 防火墻”并打開它。
- 或者,按
Win + R,輸入wf.msc然后回車。
-
創建新的入站規則
- 在左側窗格中,右鍵點擊“入站規則”,然后選擇“新建規則...”。
-
規則類型
- 選擇“端口”,然后點擊“下一步”。
-
協議和端口
- 選擇“TCP”。
- 選擇“特定本地端口”,并在旁邊的輸入框中輸入
2222。 - 點擊“下一步”。
-
操作
- 選擇“允許連接”,然后點擊“下一步”。
-
配置文件
- 根據您的網絡環境選擇何時應用該規則(通常默認全選“域”、“專用”、“公用”即可),點擊“下一步”。
-
名稱
- 為該規則起一個易于識別的名稱,例如“Docker Container SSH”或“Port 2222 for CUDA Dev”。
- 可以添加更詳細的描述,如“允許通過 SSH 訪問運行在 Docker 中的開發容器”。
- 點擊“完成”。
現在,新的規則會出現在入站規則列表中,表示端口 2222 已對外部開放。
方法二:通過 PowerShell (管理員權限)
使用命令行可以快速完成同樣的操作。
-
以管理員身份運行 PowerShell
- 在開始菜單搜索“PowerShell”。
- 右鍵單擊“Windows PowerShell”,然后選擇“以管理員身份運行”。
-
執行命令創建防火墻規則
- 將以下命令復制到 PowerShell 中執行:
New-NetFirewallRule -DisplayName "允許 Docker 容器 SSH (TCP 2222)" -Direction Inbound -LocalPort 2222 -Protocol TCP -Action Allow- 命令參數解釋:
-DisplayName “...”:規則的名稱,便于識別。-Direction Inbound:規則針對入站流量。-LocalPort 2222:開放的本地端口號。-Protocol TCP:協議類型。-Action Allow:執行允許的操作。
-
驗證規則是否添加成功
- 可以運行以下命令查看所有包含“2222”端口的規則:
Get-NetFirewallRule | Where-Object { $_.DisplayName -like "*2222*" } | Format-Table DisplayName, Enabled, Direction, Action
注意事項
- 管理員權限:兩種方法都需要管理員權限。
- 安全性:開放端口會帶來一定的安全風險。請確保您信任連接到該端口的設備,并且容器內的 SSH 密碼足夠強壯(建議使用密鑰認證以獲得更高安全性)。
- 即時生效:規則創建后會立即生效,無需重啟電腦或 Docker。
故障排除
- NVIDIA 驅動問題:
[... 后續內容保持不變 ...]
故障排除
-
NVIDIA 驅動問題:
- 確保已安裝最新 NVIDIA 驅動
- 運行
nvidia-smi確認驅動正常工作
-
WSL 2 問題:
- 確保 WSL 2 已更新到最新版本
- 運行
wsl --update更新 WSL
-
端口沖突:
- 如果端口 2222 已被占用,請在
docker-compose.yml中更改端口映射
- 如果端口 2222 已被占用,請在
-
權限問題:
- 如果遇到文件權限問題,嘗試在 Docker Desktop 設置中啟用 "Use the WSL 2 based engine"
使用建議
- 可以使用 VS Code 的 Remote - SSH 擴展連接到容器
- 將代碼放在
workspace目錄中以便持久化存儲 - 如需其他 Python 包,可以修改 Dockerfile 中的 pip install 命令
參考資料
通過以上步驟,你應該能夠在 Windows 上成功部署支持 CUDA 的 Docker 容器。如果遇到任何問題,請參考故障排除部分或查閱相關文檔。
浙公網安備 33010602011771號