将 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 文件的 FROM
是 FROM ubuntu:15.04
并且这是不可更改的,因为我的 Docker 文件有很多东西取决于那个特定的版本。
我已经阅读了一些 post 关于如何从 docker 容器连接到 Docker 主机的 Xserver,例如 this。但是正如我提出问题的标题,Docker 主机是无头的并且没有 Xserver。
- 要安装到具有 Xserver 的容器中,至少需要
apt-get
个包?
- 我想在我的 Docker 文件中将需要像
ENV DISPLAY=:0
这样的显示环境变量。这是正确的吗?
docker run
命令中还需要添加什么吗?
谢谢。
您可以在 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
希望这可以帮助:-)
我正在构建一个 Docker 容器,其中包含 Maven 和一些依赖项。然后它在容器内执行脚本。看起来,其中一个依赖项需要 Xserver 才能工作。屏幕上没有显示任何内容,但似乎有必要且无法避免。
我把 ENV DISPLAY=x.x.x.x:0
放在 Docker 文件上,它可以连接到外部 Xserver,并且可以正常工作。但是重点是做一个Dockerself-sufficient容器。
所以我需要在我的容器中添加一个 Xserver,并在 Dockerfile 中添加必要的文件。我希望 Xserver 只能由 Docker 容器本身访问,而不能从外部访问。
我的 Docker 文件的 FROM
是 FROM ubuntu:15.04
并且这是不可更改的,因为我的 Docker 文件有很多东西取决于那个特定的版本。
我已经阅读了一些 post 关于如何从 docker 容器连接到 Docker 主机的 Xserver,例如 this。但是正如我提出问题的标题,Docker 主机是无头的并且没有 Xserver。
- 要安装到具有 Xserver 的容器中,至少需要
apt-get
个包? - 我想在我的 Docker 文件中将需要像
ENV DISPLAY=:0
这样的显示环境变量。这是正确的吗? docker run
命令中还需要添加什么吗?
谢谢。
您可以在 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
希望这可以帮助:-)