在Linux的Docker中运行GUI应用程序


假设您正在构建一个需要用户界面并在运行脚本时弹出窗口的应用程序。并且假设您想在Docker容器内运行该脚本。现在,您可能期望Docker容器为您运行UI应用程序并在屏幕上显示相同的内容。但是,使用普通的docker run命令,您将无法看到或与UI应用程序交互。为此,您需要将显示器与容器连接起来。在本文中,我们将讨论如何做到这一点。

在这里,我们将看到如何在Docker容器内运行Firefox实例并在您的主机上与它交互。为此,我们需要首先将X11套接字转发到容器,以便容器可以直接使用它。我们还需要转发显示环境变量。即使这样做了,也可能会失败,因为我们还没有为X服务器主机设置权限。这乍一看似乎是一项艰巨的任务。我们将在本文中引导您完成所有步骤。

让我们首先看一下Dockerfile,它将帮助我们构建镜像。

# Set ubuntu as base image
FROM ubuntu

# Install dependencies
RUN apt-get -y update
RUN apt-get -y install xauth
RUN apt-get -y install firefox

#Expose a port number
EXPOSE 8887

# Run firefox
CMD /usr/bin/firefox

我们已经拉取了ubuntu作为基础镜像。之后,在新形成的ubuntu镜像上运行更新。这也会形成一个新的中间层。使用给定的命令安装xauth和firefox。Xauth是一种简单的机制,它允许Docker容器访问对X服务器(也称为显示服务器)的控制。但是,我们需要手动添加一个随机生成的cookie,用于当前运行X服务器的会话。

要访问cookie,请在主机上运行以下命令。

xauth list

输出格式为:

username/unix:0 MIT-MAGIC-COOKIE-1 8fe8efc75454dbf178bbe00442689406

用户名将是您的系统用户名。复制上面的输出。

您现在可以使用上面创建的Dockerfile使用以下命令尝试构建Docker镜像。

sudo docker run -ti --net=host -e DISPLAY -v /tmp/.X11-unix <IMAGE NAME> bash

这将打开已创建的ubuntu镜像的bash。

在bash中,运行以下命令。

  • xauth add <之前复制的输出>

  • 使用此命令验证主机系统是否已连接到远程系统:xauth list

  • 运行命令:/usr/bin/firefox

这应该打开一个在容器内运行但在屏幕上显示的Firefox窗口。

请注意,如果出现诸如{无法连接到显示“−1”}之类的错误,则需要将您之前复制的token中的−0替换为−1。

执行类似的步骤,您将能够在Docker容器内运行任何GUI应用程序,并在屏幕上显示和与它们交互。

更新于:2020年10月1日

421 次浏览

启动您的职业生涯

通过完成课程获得认证

开始
广告