Docker运行GUI程序

Docker一般用于后端程序使用,默认是不需要GUI的。但是有时候我们希望,前端程序也能用上Docker这种简单的打包方式,方便管理。这里记录下Docker运行GUI程序的方法:

首先,我们Docker镜像需要本身提供GUI,比如默认的centOS和Ubuntu都是不带GUI的,需要手动安装X11。
X11协议是C/S架构,显示过程是这样的:

[应用程序]->[X11客户端]->[X11服务端]->[显示屏幕]

然后,我们需要打开X11的访问限制,默认只允许本地用户程序显示。这里我们可以运行本地docker显示:

$ sudo apt-get install x11-xserver-utils
$ xhost +local:docker
non-network local connections being added to access control list

或者允许所有显示选项(不建议):

$ sudo apt-get install x11-xserver-utils
$ xhost +
access control disabled, clients can connect from any host

最后,我们通过Docker的文件映射共享套接字,就可以转发X11协议了,参数如下:

$ docker run -it --rm \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e DISPLAY=unix$DISPLAY \
    ...

文件存储

我们使用GUI程序的时候往往避免不了对文件进行操作,这里我们可以使用文件夹映射的方式,讲主机文件夹挂载到容器中。需要解决的问题是,docker本身以root登录时,创建的文件也是root属性,不是主机上当前用户所有。
我们通过创建在容器中创建一个普通用户,并将主机用户的uid和gid传入,从而使得容器创建的文件保持和主机用户相同的所有者。
Dockerfile编写如下:

RUN useradd user \
	&& mkdir /home/user \
	&& chown user:user /home/user \
	&& addgroup user staff

WORKDIR /home/user

容器启动命令如下:

$ docker run -it --rm \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -e DISPLAY=unix$DISPLAY \
    -e uid=$(id -u) \
    -e gid=$(id -g) \
    -v $HOME:/home/user \
    ...

这里我们直接把容器和主机的HOME目录映射了起来。

GUI程序涉及到的 网络、音视频 等其他方面,请参考 这篇博客

posted @ 2021-01-01 13:13  与MPI做斗争  阅读(853)  评论(0编辑  收藏  举报