Docker默认在命令行下工作,通过一些方法可以在Docker环境中调试和运行Linux图形化软件。

测试环境:

  • 主机:Ubuntu 20.04
  • Docker-Image: tensorflow/tensorflow:2.6.1-gpu

主流的docker-linux镜像应该都可以

准备好Docker和Image后,分别需要在主机和Docker环境进行配置。

步骤

在主机上,配置x11工具,用于提供给Docker访问主机的显示

1
2
3
4
5
# 安装x11工具,方便x11配置
sudo apt install x11-xserver-utils

# 允许所有用户访问x11端口(在每次机器重启或x11重启后都要执行)
xhost +

在启动Docker容器时,增加以下参数

1
2
3
4
-v /tmp/.X11-unix:/tmp/.X11-unix \
-e DISPLAY=unix$DISPLAY \
-e GDK_SCALE \
-e GDK_DPI_SCALE \

启动Docker容器,在容器内执行测试

1
2
3
4
5
6

# 安装gui时钟
apt install xarclock

# 启动后,主机屏幕上会出现时钟
xarclock

原理

Linux系统的显示本质也是通过文件完成。

在Docker容器启动时的-v /tmp/.X11-unix:/tmp/.X11-unix参数,将主机的显示文件挂载到(覆盖了)容器内部的显示文件。

-e参数让容器复用了外部主机的GDK缩放变量,保证最终展示出来的大小、尺寸等和外部主机一致。

容器内运行GUI会往容器内的.X11-unix上写入需要展示的内容,其本质是直接写入到了主机端的品屏幕,因此在主机环境上可以看到相应的GUI软件运行结果。