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

Add xserver into Docker container (the host is headless)

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

我把 ENV DISPLAY=x.x.x.x:0 放在 Docker 文件上,它可以连接到外部 Xserver,并且可以正常工作。但是重点是做一个Dockerself-sufficient容器。

所以我需要在我的容器中添加一个 Xserver,并在 Dockerfile 中添加必要的文件。我希望 Xserver 只能由 Docker 容器本身访问,而不能从外部访问。

我的 Docker 文件的 FROMFROM ubuntu:15.04 并且这是不可更改的,因为我的 Docker 文件有很多东西取决于那个特定的版本。

我已经阅读了一些 post 关于如何从 docker 容器连接到 Docker 主机的 Xserver,例如 this。但是正如我提出问题的标题,Docker 主机是无头的并且没有 Xserver。

谢谢。

您可以在 docker 容器中安装 运行 一个 x11vnc。我将向您展示如何在无头主机上实现 运行ning 并将其远程连接到 运行 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"]

并构建一个名为 vnc:

docker image
docker build -t vnc .

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

docker run -d --name=vnc --net=host vnc

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

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

docker exec -it vnc bash

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

DISPLAY=:20 xterm

一个新的 xterm window 将在您的 vnc client window 中弹出。我想这就是您 运行 申请的方式。

:

  • 基础 vnc 映像基于 ubuntu 14,但我猜包在 ubuntu 16
  • 中类似
  • 不想远程连接就不要暴露5900

希望这可以帮助:-)