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程序涉及到的 网络、音视频 等其他方面,请参考 这篇博客。