之前一直有做 CI/DEV 环境的 Dockerize。想着自己的桌面环境,于是也打算将其整个 Dockerize 一下。 这样做有不少好处:

  1. 重装系统之后只需要一个 docker 即可,不用从头再配置一遍,节省很大量的重复劳动
  2. 状态被分离,系统组件无状态,而状态被分离到 VOLUMES 上
  3. 非常方便审计自己的系统,可以在数月后依然清晰知道自己对系统做过什么
  4. 系统可以很方便得运行在远程服务器,可以用阿里云的竞价节点非常低成本得创建临时性的高性能开发环境

实现方案

Mount X unix socket

docker run -it -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix IMAGE [COMMAND]

最常见也是最简单的 docker 内运行图形化程序的方案,共享宿主的 X Unix Socket, 缺点是这样做等于让容器可以控制宿主机,让隔离形同虚设。

x11docker

x11docker 实际上是个 Bash 脚本,但是提供了非常实用和常见的包装。 对于直接使用 X unix socket 引入的问题,x11docker采用的措施很简单,直接再开一个新的 X Server(通过 xpra & Xephyr)。 x11docker 另外还提供了 GPU、声音、剪贴板、远程等的支持。

SPICE / VNC / RDP

这种方案需要修改容器镜像,在镜像内开启 SPICE Server 或者 RDP Server。 这种方式的好处是,可以直接在 Android 上跑 Client,如果手机支持 DisplayPort over USB-C 的话会非常方便。

xserver-spice 或者 xrdp 都很不错。

总结

实际用下来图形性能会有一些损耗,但是用来做开发环境还是很足够的。 本地的话推荐用 x11docker 这样的方案,如果远程的话个人会更加偏好 SPICE 那套方案。

Tips

硬件加速

Docker 提供了 --device,可以直接 --device=/dev/dri:/dev/dri 来访问 GPU。 x11docker 中提供了 --gpu 选项可以直接用。

Docker inside docker

直接新开个 docker-machine,或者(在确保容器的可信的情况下)和 docker-compose 的 Container 版本一样直接:-v /var/run/docker.sock:/var/run/docker.sock

Fcitx

事实上,fcitx 提供了很方便的 cli 工具:

fcitx-imlist -e googlepinyin # enable googlepinyin
fcitx-imlist -s fcitx-keyboard-us,googlepinyin # set order

二步认证

对于任何远程环境,若条件允许,建议都开启二步认证。 参见 libpam-google-authenticator 这个包。

stow

散落四处的配置文件建议使用 GNU Stow 来集中管理。

References