Kri*_*iss 6 x11 user-interface docker
我想为 GUI 应用程序(例如 Chrome)创建一个 docker 映像,并且希望这个 GUI 应用程序可以在没有安装 X 服务器的裸 Linux 服务器上运行。
我知道为 X Window 客户端(GUI 应用程序本身)创建和运行 docker 映像非常容易。这需要在主机上安装并运行 X 服务器。
sudo docker run -ti -v /tmp/.X11-unix:/tmp/.X11-unix xorg xterm -display :0
Run Code Online (Sandbox Code Playgroud)
但对我来说,我需要 X 客户端和服务器都在 docker 容器中运行。
这是我的 dockerfile:
FROM ubuntu:14.04
RUN apt-get update && apt-get install -y xorg
Run Code Online (Sandbox Code Playgroud)
我通过命令运行图像:
sudo docker run -i -t --rm -e DISPLAY=:0 --privileged xorg xinit
Run Code Online (Sandbox Code Playgroud)
X 服务器可以启动,屏幕变黑,几秒钟后,xterm 窗口显示。但是,我无法使用键盘和鼠标。屏幕似乎冻结了
我搜索并尝试了很多解决方案,但没有人能解决这个问题。(我不需要虚拟x服务器)
我已经解决了这个问题。
起初,我认为可能是docker容器中的x服务器无法访问主机设备,并且我在LXC/cgroup上花了很多时间。例如,我将 docker exec 引擎更改为 LXC,并添加了选项“ ”,并且还在容器中--lxc-conf='lxc.cgroup.devices.allow = c 13:* rwm创建了。/dev/input/*
所有这些操作都是不必要的。
如果我们在特权模式下运行 docker 容器,所有主机设备将自动添加。或者我们可以使用“ --device=/dev/input/mice”等选项来共享主机设备。
真正的问题是x服务器无法自动发现和添加设备。我不知道为什么。但我们可以修改 x 服务器的配置并自定义设备。
添加文件 /etc/X11/xorg.conf.d/10-input.conf
Section "ServerFlags"
Option "AutoAddDevices" "False"
EndSection
Section "ServerLayout"
Identifier "Desktop"
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
EndSection
Section "InputDevice"
Identifier "Keyboard0"
Driver "kbd"
Option "Device" "/dev/input/event2"
EndSection
Section "InputDevice"
Identifier "Mouse0"
Driver "mouse"
Option "Protocol" "auto"
Option "Device" "/dev/input/mice"
Option "ZAxisMapping" "4 5 6 7"
EndSection
Run Code Online (Sandbox Code Playgroud)
并运行 docker 容器:
docker run -i -t -v /tmp/.X11-unix:/tmp/.X11-unix --rm --privileged ubuntu startx
Run Code Online (Sandbox Code Playgroud)