windows_wsl2_nvidia-docker2镜像记录

2024/10/20

Tags: X11 Windows Docker WSL2 Nvidia-docker2 GUI

Table of Contents

0. 写在前面

上上周我尝试了使用mac os 通过x11转发,显示从ubuntu docker中启动的gui程序,并使用ubuntu docker中的输入法的实践

上周我尝试了在windows上在其基础上加入了nvidia-docker2的步骤,也成功了,不过没时间记录,于是今日写此文档记录

不管是mac os还是windows上所做的这些实验,都是为了在docker中运行我的开源的yolo8辅助训练软件label-image

1. 前置条件

1.1 wsl 2

由于windows上的ubuntu docker container运行在wsl2可以支持得更好,也是nvidia-docker2的充分必要条件,所以如果你安装的wsl发行版本不是wsl版本的话,需要先安装一个wsl2的docker-desktop

安装成功后可以命令行查看

1
2
3
PS C:\WINDOWS\system32> wsl --list -v
  NAME              STATE           VERSION
* docker-desktop    Running         2

wsl2的安装方法,随便搜索一下就有很多,略

需要在docker-desktop中启用wsl2, 如果设置成功的放在, setting->resouces中显示如下图

image-20241013134544149

1.2 nvidia-docker2安装

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

参照些文,如此如此,这般这般,就好了,这里不再展开,没安装成功的再努力百度一下

相比linux下的步骤简单, 安装完后在docker-desktop中重启一下docker就可以生效

如果是在linux下, 需要

sudo systemctl reload-daemon && sudo systemctl restart docker

by the way ,

linux的docker的daemon.json在/etc/docker/daemon.json

widnows的docker的daemon.json在~/.config/docker/daemon.json

设置代理会解决很多镜像拉不下来的问题

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
{
    "registry-mirrors": [
        "https://dockerhub.icu",
        "https://docker.chenby.cn",
        "https://docker.1panel.live",
        "https://docker.awsl9527.cn",
        "https://docker.anyhub.us.kg",
        "https://dhub.kubesre.xyz"
    ],

  //...保存原来的..
}

验证安装的话,先拉一个ubuntu镜像(直接用hello-world镜像不行)

1
docker pull ubuntu20.04

查看镜像

1
2
3
PS C:\WINDOWS\system32> docker images
REPOSITORY    TAG                              IMAGE ID       CREATED       SIZE
ubuntu        20.04                            9522b5ff29b8   3 weeks ago   72.8MB

然后以这个hello-world镜像运行一个容器,在里面调用nvidia-smi 查看显示信息

1
docker run --rm ubuntu20.04 --runtime=nivdia --gpus all -it nvidia-smi

如果你机器上有多个gpu,但只想某一些gpu或某一个gpu, 可以查看文档,有多种方式可以约束

但是如果docker run加了--privileged 参数, 不管你怎么约束,所有gpu都将在docker container内可见.(linux上是如此,windows没有实验过)

1.3 安装windows上的x11 server

用于接收来自docker container中的gui程序交互消息

我安装的是这个 x11 server

安装后需要设置一下 禁用 访问策略或设置相应的规律,让自己的docker中的gui可以转发过来

我是直接禁用了

image-20241013143925868

image-20241013143950633

image-20241013144031054

2.构建ubuntu20.04运行时docker

和在使用x11转发在macos上从docker容器中启动gui程序一样,首先构建一个ubuntu20.04的环境,测试显示gui程序和使用容器中的中文输入法

基本和mac os 那篇记录中的脚本基本一致,只是做了几个改动

2.1 构建docker image

 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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
FROM nvidia/cuda:12.6.1-cudnn-devel-ubuntu20.04 
#FROM --platform=linux/amd64 nvidia/cuda:12.6.1-cudnn-devel-ubuntu20.04 
ENV DEBIAN_FRONTEND=noninteractive

COPY .gitconfig /root/.gitconfig
COPY .vimrc /root/.vimrc

RUN  cat <<EOF > /etc/apt/sources.list
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse

# 以下安全更新软件源包含了官方源与镜像站配置,如有需要可自行修改注释切换
deb http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ focal-security main restricted universe multiverse

# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
EOF

RUN \
apt update && \
apt install -y  \
build-essential \
software-properties-common &&\
apt update && \
apt install -y locales language-pack-zh-hans language-pack-gnome-zh-hans fonts-wqy-zenhei fonts-wqy-microhei ibus-rime librime-data-wubi && sed -i.bak 's/# zh_CN.UTF-8/zh_CN.UTF-8/g' /etc/locale.gen && locale-gen && update-locale LANG=zh_CN.UTF-8 && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
apt install -y \
  autoconf \
  automake \
  bison \
  build-essential \
  cmake \
  gcc \
  g++ \
  git \
  lsb-release \
  make \
  ninja-build \
  python3 \
  rsync \
  tar \
  unzip \
  vim \
  wget \
  curl \
  cowsay && \
  apt install -y openssh-server && echo 'root:aaa' | chpasswd && sed -i.bak 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config && service ssh restart  && \
  apt clean  && \
  mkdir -p /opt/label-image

RUN apt install -y gnome  && apt clean

COPY .config /root/.config


WORKDIR  /opt/label-image
ENTRYPOINT ["/bin/bash","-c" ,"service ssh start && tail -f /dev/null"]

2.2 启动docker container

我原本想要在windows上使用git bash 直接用 这个脚本启动容器

不过基于这几个原因重写了一个.bat批处理脚本来启动windows上的容器

runDocker.bat

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
@echo off

set display=host.docker.internal:0

set runcmd=docker run ^
--name hbb ^
--privileged ^
-p 2246:22 ^
--gpus all ^
--runtime=nvidia ^
-e DISPLAY=%display% ^
-e LANG=zh_CN.UTF-8 ^
-e XMODIFIERS="@im=ibus" ^
-e QT_IM_MODULE=ibus ^
-e GTK_IM_MODULE=ibus ^
--entrypoint /bin/bash ^
-e GID=%NUMBER_OF_PROCESSORS% ^
-e UID=%USERNAME% ^
-it ubuntu:20.04 -c "ibus-daemon -xrd && gedit"

%runcmd%

执行这个脚本后, 启动输入法,打开 文本编辑器gedit, 测试输入法没有问题后, 可以开始准备编译程序和部署程序了

3. label-image 编译部署

3.1 安装qt 开发环境

由于已经支持x11转发了,所以下载 qt 官方的在线安装器就能安装qt 5.15,不是arm64,所以不需要交叉编译qt 源码

所以… 略

唯一需要注意的一点是, 访问host的使用 host.docker.internal

3.2 编译

3.3 测试label-image docker中使用cuda加速训练

e680df290e84b9711218c6290689838d

虽然软件写得很烂,但还是成功在windows 上使用cuda加速训练了yolov8,

不过我的windows电脑的GPU是 1650, 最终还是以out of memory失败告终,但证实这个方案是可行的

>> Home

Comments