将xserver添加到Docker容器中(主机是无头的)

Osc*_*vis 3 containers headless xserver docker

我正在构建一个具有 Maven 和一些依赖项的 Docker 容器。然后它在容器内执行脚本。看起来,其中一个依赖项需要 Xserver 才能工作。屏幕上没有显示任何内容,但这似乎是必要且无法避免的。

我让它工作了,ENV DISPLAY=x.x.x.x:0在 Dockerfile 上放置了一个,它连接到外部 Xserver 并且它工作了。但重点是让 Docker 成为一个自给自足的容器。

因此,我需要将 Xserver 添加到我的容器中,并在 Dockerfile 中添加必要的内容。我希望 Xserver 只能由 Docker 容器本身访问,而不能从外部访问。

FROM我的 Dockerfile 的 是不可FROM ubuntu:15.04更改的,因为我的 Dockerfile 有很多内容取决于该特定版本。

我读过一些关于如何从 docker 容器连接到 Docker 主机的 Xserver 的文章,如下所示。但正如我提出问题的标题一样,Docker 主机是无头的,并且没有 Xserver。

  • apt-get要安装到容器中才能拥有 Xserver,最少需要安装哪些软件包?
  • 我想在我的 Dockerfile 中将需要显示环境变量,例如ENV DISPLAY=:0. 它是否正确?
  • 命令中还需要添加什么吗docker run

谢谢。

shi*_*zhz 6

x11vnc您可以在 docker 容器内安装并运行。我将向您展示如何使其在无头主机上运行并远程连接它以运行 X 应用程序(例如 xterm)。

Dockerfile:

FROM joprovost/docker-x11vnc

RUN mkdir ~/.vnc && touch ~/.vnc/passwd
RUN x11vnc -storepasswd "vncdocker" ~/.vnc/passwd
EXPOSE 5900
CMD ["/usr/bin/x11vnc", "-forever", "-usepw", "-create"]
Run Code Online (Sandbox Code Playgroud)

并构建一个docker image名为vnc

docker build -t vnc .
Run Code Online (Sandbox Code Playgroud)

运行容器并记住将端口映射5900到主机以进行远程连接(我在--net=host这里使用):

docker run -d --name=vnc --net=host vnc
Run Code Online (Sandbox Code Playgroud)

现在你已经有了一个正在运行的容器x11vnc,下载一个像realvnc这样的vnc客户端并尝试从本地连接<server_ip>:5900,密码是在vncdocker中设置的Dockerfile,你将进入远程X屏幕并打开xterm。如果执行的话env会发现环境变量DISPLAY=:20

让我们转到 docker 容器并尝试打开另一个xterm

docker exec -it vnc bash
Run Code Online (Sandbox Code Playgroud)

然后在容器内执行以下命令:

DISPLAY=:20 xterm
Run Code Online (Sandbox Code Playgroud)

您的窗口中将弹出一个新的 xterm 窗口vnc client。我想这就是您运行应用程序的方式。

笔记

  • 基本 vnc 映像基于ubuntu 14,但我猜该包类似于ubuntu 16
  • 如果您不想远程连接,请不要公开 5900

希望这可以帮助:-)