运行 docker 容器内的 Xephyr
Running Xephyr inside a docker container
我正在尝试 运行 嵌套的 X-server Xephyr 在 docker 容器中直接访问 X11 套接字,但我收到奇怪的图形错误,我目前不明白。
Dockerfile
的内容正好
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -qqy xserver-xephyr
# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
用
构建它
sudo docker build -t xephyrtest .
并运行与
结合
sudo docker run -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix xephyrtest Xephyr :1
输出如下:
Xephyr unable to use SHM XImages
Initializing built-in extension Generic Event Extension
Initializing built-in extension SHAPE
Initializing built-in extension MIT-SHM
Initializing built-in extension XInputExtension
Initializing built-in extension XTEST
Initializing built-in extension BIG-REQUESTS
Initializing built-in extension SYNC
Initializing built-in extension XKEYBOARD
Initializing built-in extension XC-MISC
Initializing built-in extension SECURITY
Initializing built-in extension XINERAMA
Initializing built-in extension XFIXES
Initializing built-in extension RENDER
Initializing built-in extension RANDR
Initializing built-in extension COMPOSITE
Initializing built-in extension DAMAGE
Initializing built-in extension MIT-SCREEN-SAVER
Initializing built-in extension DOUBLE-BUFFER
Initializing built-in extension RECORD
Initializing built-in extension DPMS
Initializing built-in extension Present
Initializing built-in extension DRI3
Initializing built-in extension X-Resource
Initializing built-in extension XVideo
Initializing built-in extension XVideo-MotionCompensation
Initializing built-in extension SELinux
Initializing built-in extension GLX
[dix] Could not init font path element /usr/share/fonts/X11/cyrillic, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/Type1, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi, removing from list!
在这里,第一行 Xephyr unable to use SHM XImages
似乎是最重要的,因为它没有出现在我的 Xephyr 正常工作的主机上。
虽然 Xephyr window 弹出,但使用 :1
显示的应用程序会出现奇怪的故障。例如。 DISPLAY=:1 gedit
看起来像这样(当鼠标在 window 范围内移动时输出会快速变化):
SHM XImages
是什么意思,如何解决它在容器中不可用的问题?
MIT-SHM 扩展是一种允许在客户端和服务器之间更快地(主要)显示图像的方法,只要它们 运行 在同一台计算机上。这是通过创建一个 SysV shm 共享内存对象来完成的,客户端可以将图像数据写入并由 X 服务器直接显示,而不必通过套接字序列化图像。
如果 Docker 容器阻止它并且 gedit 依赖它,我不会感到惊讶。
事实证明,自从 Docker 1.5 使用命令 运行 Xephyr 在 docker 容器中实际上非常容易
sudo docker run -e DISPLAY -v /tmp:/tmp --ipc=host --pid=host xephyrtest Xephyr :1
另外两个参数是
--ipc=host
允许容器使用与主机相同的 IPC 命名空间,因此也可以访问相同的共享内存段
--pid=host
让容器看到(和修改)主机的进程。这是必要的,因为 X 服务器端口锁定是通过 /tmp/.Xi-lock
锁定文件完成的(将 i
替换为您的显示端口),其中包含端口 [=] 上的 X 服务器 运行ning 的 pid 14=].
除了容器内的 X11 unix 套接字之外,您还必须将 -v /tmp/.X11-unix:/tmp/.X11-unix
更改为 -v /tmp:/tmp
才能访问锁定文件。
虽然这很好用,但您必须注意,这两个附加参数和对主机 /tmp
文件夹的访问权限授予容器重要权限,这在某些情况下可能会带来安全风险。
运行 Xephyr 选项 -extension MIT-SHM
禁用共享内存。那么你不需要使用 docker 选项 --ipc=host
来打破容器隔离。
为了避免 docker 选项 --pid=host
,考虑 运行 主机上的 Xephyr,共享其 X 套接字并设置 -e DISPLAY=:1
。只共享socket文件/tmp/.X11-unix/X1
就够了,不需要共享整个文件夹,甚至整个/tmp
.
我正在尝试 运行 嵌套的 X-server Xephyr 在 docker 容器中直接访问 X11 套接字,但我收到奇怪的图形错误,我目前不明白。
Dockerfile
的内容正好
FROM ubuntu:14.04
RUN apt-get update
RUN apt-get install -qqy xserver-xephyr
# Clean up APT when done.
RUN apt-get clean && rm -rf /var/lib/apt/lists/* /tmp/* /var/tmp/*
用
构建它sudo docker build -t xephyrtest .
并运行与
结合sudo docker run -e DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix xephyrtest Xephyr :1
输出如下:
Xephyr unable to use SHM XImages
Initializing built-in extension Generic Event Extension
Initializing built-in extension SHAPE
Initializing built-in extension MIT-SHM
Initializing built-in extension XInputExtension
Initializing built-in extension XTEST
Initializing built-in extension BIG-REQUESTS
Initializing built-in extension SYNC
Initializing built-in extension XKEYBOARD
Initializing built-in extension XC-MISC
Initializing built-in extension SECURITY
Initializing built-in extension XINERAMA
Initializing built-in extension XFIXES
Initializing built-in extension RENDER
Initializing built-in extension RANDR
Initializing built-in extension COMPOSITE
Initializing built-in extension DAMAGE
Initializing built-in extension MIT-SCREEN-SAVER
Initializing built-in extension DOUBLE-BUFFER
Initializing built-in extension RECORD
Initializing built-in extension DPMS
Initializing built-in extension Present
Initializing built-in extension DRI3
Initializing built-in extension X-Resource
Initializing built-in extension XVideo
Initializing built-in extension XVideo-MotionCompensation
Initializing built-in extension SELinux
Initializing built-in extension GLX
[dix] Could not init font path element /usr/share/fonts/X11/cyrillic, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi/:unscaled, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/Type1, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/100dpi, removing from list!
[dix] Could not init font path element /usr/share/fonts/X11/75dpi, removing from list!
在这里,第一行 Xephyr unable to use SHM XImages
似乎是最重要的,因为它没有出现在我的 Xephyr 正常工作的主机上。
虽然 Xephyr window 弹出,但使用 :1
显示的应用程序会出现奇怪的故障。例如。 DISPLAY=:1 gedit
看起来像这样(当鼠标在 window 范围内移动时输出会快速变化):
SHM XImages
是什么意思,如何解决它在容器中不可用的问题?
MIT-SHM 扩展是一种允许在客户端和服务器之间更快地(主要)显示图像的方法,只要它们 运行 在同一台计算机上。这是通过创建一个 SysV shm 共享内存对象来完成的,客户端可以将图像数据写入并由 X 服务器直接显示,而不必通过套接字序列化图像。
如果 Docker 容器阻止它并且 gedit 依赖它,我不会感到惊讶。
事实证明,自从 Docker 1.5 使用命令 运行 Xephyr 在 docker 容器中实际上非常容易
sudo docker run -e DISPLAY -v /tmp:/tmp --ipc=host --pid=host xephyrtest Xephyr :1
另外两个参数是
--ipc=host
允许容器使用与主机相同的 IPC 命名空间,因此也可以访问相同的共享内存段--pid=host
让容器看到(和修改)主机的进程。这是必要的,因为 X 服务器端口锁定是通过/tmp/.Xi-lock
锁定文件完成的(将i
替换为您的显示端口),其中包含端口 [=] 上的 X 服务器 运行ning 的 pid 14=].
除了容器内的 X11 unix 套接字之外,您还必须将 -v /tmp/.X11-unix:/tmp/.X11-unix
更改为 -v /tmp:/tmp
才能访问锁定文件。
虽然这很好用,但您必须注意,这两个附加参数和对主机 /tmp
文件夹的访问权限授予容器重要权限,这在某些情况下可能会带来安全风险。
运行 Xephyr 选项 -extension MIT-SHM
禁用共享内存。那么你不需要使用 docker 选项 --ipc=host
来打破容器隔离。
为了避免 docker 选项 --pid=host
,考虑 运行 主机上的 Xephyr,共享其 X 套接字并设置 -e DISPLAY=:1
。只共享socket文件/tmp/.X11-unix/X1
就够了,不需要共享整个文件夹,甚至整个/tmp
.