该系列文章的目的旨在之前的章节基础上,使用x11docker构建一个可以使用GPU的docker容器。该容器可以用于3D图形渲染/XR 等使用GPU渲染的程序调试和运行。
0 why docker
为什么非要用x11docker,而不是其他的docker呢?
因为一般的docker是不能够使用GPU来渲染3D图形化程序的,而且即便是可以运行3d图形化程序,默认也是使用CPU而不是GPU的。也就是说Docker本身是不提供允许使用图形用户界面运行应用程序的显示服务器。而x11docker 填补了空白。它运行一个X 显示服务器并将其提供给容器。X 服务器可以从主机或图像x11docker/xserver的容器中运行。此外 x11docker 还进行了一些安全设置以增强容器隔离并避免 X 安全漏洞。这允许沙盒环境很好地保护主机系统免受可能的恶意或错误软件的侵害。
1 了解和使用x11docker基础
@1 x11docker的github网址-> GitHub - mviereck/x11docker
@2 下载x11docker专属镜像。x11docker的镜像需要单下载,因为最后要使用x11docker命令来执行,不可以是任意的镜像,而是在docker hub网站上 以x11docker为前缀命名的docker镜像,检索链接如下(根据自己的实际需求下载镜像即可xfce、xserver、lxde等等。。。):
https://hub.docker.com/search?q=x11docker
@3 下载x11docker,使用如下命令:
curl -fsSL https://raw.githubusercontent.com/mviereck/x11docker/master/x11docker | sudo bash -s -- --update
@4 测试x11docker
命令有了,镜像也有了,接下来就可以执行命令看看效果了,比如执行以下命令:
x11docker --desktop --size 320x240 x11docker/lxde
就会直接显示桌面程序如下所示:
这里的desktop命令表示桌面版程序,--size表示显示窗口的大小。
2 x11docker构建自定义的GPU运行环境
2.1 镜像操作
#1 下载镜像
$docker pull x11docker/xfce
#2 运行容器并设置好共享文件夹
$docker run -it -v /home/share/:/home/share/ --name devt3 x11docker/xfce /bin/bash
#3 开始apt update 然后按需install各种软件,执行结束后exit
$apt update
$apt install ...
#4 commit操作,将容器压缩到镜像中,这样就可以docker push提交到自己的服务器了
$docker commit c83e26ce754e x11docker/xfce:v20 //将container容器直接输出到image镜像中。
这里下载好母板镜像后 根据自己的需要install各种软件,最后exit退出并将打包好的镜像提交到自己的服务器中。
2.2 直接运行镜像导致黑屏,怎么解?
使用Dockerfile编译出可运行的x11docker镜像。这里注意,经过安装软件后的镜像无法直接再用x11docker 运行,会黑屏,这时候怎么办呢?使用Dockerfile编译出一个特殊版本 x11docker/xfce:v20。这里使用了一个Dockerfile,内容如下
# x11docker/xfce
#
# Run XFCE desktop in docker.
# Use x11docker to run image.
# Get x11docker from github:
# https://github.com/mviereck/x11docker
#
# Examples:
# - Run desktop:
# x11docker --desktop x11docker/xfce
# - Run single application:
# x11docker x11docker/xfce thunar
#
# Options:
# Persistent home folder stored on host with --home
# Shared host folder with --share DIR
# Hardware acceleration with option --gpu
# Clipboard sharing with option --clipboard
# ALSA sound support with option --alsa
# Pulseaudio sound support with option --pulseaudio
# Language setting with --lang [=$LANG]
# Printing over CUPS with --printer
# Webcam support with --webcam
#
# Look at x11docker --help for further options.
FROM /x11docker/xfce:v20
RUN apt-get update && apt-mark hold iptables && \
env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
dbus-x11 \
psmisc \
xdg-utils \
x11-xserver-utils \
x11-utils && \
env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
xfce4 && \
env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
libgtk-3-bin \
libpulse0 \
mousepad \
xfce4-notifyd \
xfce4-taskmanager \
xfce4-terminal && \
env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
xfce4-battery-plugin \
xfce4-clipman-plugin \
xfce4-cpufreq-plugin \
xfce4-cpugraph-plugin \
xfce4-diskperf-plugin \
xfce4-datetime-plugin \
xfce4-fsguard-plugin \
xfce4-genmon-plugin \
xfce4-indicator-plugin \
xfce4-netload-plugin \
xfce4-places-plugin \
xfce4-sensors-plugin \
xfce4-smartbookmark-plugin \
xfce4-systemload-plugin \
xfce4-timer-plugin \
xfce4-verve-plugin \
xfce4-weather-plugin \
xfce4-whiskermenu-plugin && \
env DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
libxv1 \
mesa-utils \
mesa-utils-extra && \
sed -i 's%<property name="ThemeName" type="string" value="Xfce"/>%<property name="ThemeName" type="string" value="Raleigh"/>%' /etc/xdg/xfce4/xfconf/xfce-perchannel-xml/xsettings.xml
RUN apt-get install libxcb-xkb-dev
使用如下命令编译Dockerfile:
$docker build -f Dockerfile -t x11docker/xfcetestXXX
这样使用x11docker 运行该镜像就不会有问题了。
2.3 窗口显示无法使用GPU,怎么配置都不行,怎么办?
在调试时遇到一个新问题:使用这几个参数 要么使用--gpu后就只能全屏显示,要么无法显示,要么即便可以显示但无法使用GPU,一个黑屏卡在那里不动。后来仔细分析了下这几个参数。
- --gpu: 使用gpu加速
- --desktop:桌面版
- --xorg:在X环境中使用的选项
并未发现哪里不妥,正常情况是--desktop和 --gpu肯定是够了,但就是显示不正确。后来对x11docker/xserver这个镜像做了一些了解,发现有了x11docker/xserver这个镜像,x11docker可使用的扩展参数就多了,有--kwin --nxagent --weston --weston-xwayland --xephyr --xorg --xpra --xpra-xwayland --xvfb --xwayland。猜想weston的一些参数可解决该问题,于是尝试pull镜像x11docker/xserver,这时再使用如下命令就不会有问题了。详细命令如下:
$docker pull x11docker/xserver
$sudo x11docker --desktop x11docker/xfcetestXXX --gpu --share /home/share
这样就可以在窗口程序中直接使用GPU了。大功告成。