Bootstrap

Docker进阶:Docker容器图形化显示(Ubuntu22系统下运行带图形界面的 Ubuntu20 Docker容器)

0. 本机环境

Ubuntu22.04 

Docker version 27.1.1

1. Docker 安装

参考文章 Ubuntu22 下 Docker 安装,VS Code Docker配置

2. Docker 容器可视化原理介绍

Docker 本身的工作模式是命令行的,其主要使用场景是运行无界面的后台服务』或者『运行Web服务』。但有时候我们需要在 Docker 容器里运行一些图形界面的软件,或者要调用摄像头,输出图像等,这时就需要解决 Docker 容器 “可视化”的问题。这里的“可视化”不是指 Docker 容器可视化管理,而是 Docker 容器运行可视化。

原理上可以把 Docker 镜像看做一台没配显示器的电脑,程序可以运行,但是没地方显示。
而 Unix/Linux 目前的主流图像界面服务X11采用客户端/服务端(Client/Server)的工作模式,服务端是用于提供显示信息。在服务端和客户端之间,X11通过『DISPLAY』环境变量来指定将图形显示到何处。只要在容器启动的时候,将 『unix:端口』或『主机名:端口』共享给 docker, docker 就可以通过端口找到显示输出的地方,和 Unix/Linux  宿主机系统共用显示。

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

DISPLAY的格式是『unix:端口』或『主机名:端口』,前一种格式表示使用本地的unix套接字,后一种表示使用tcp套接字。

默认情况下,X11的服务端会监听本地的『unit:0』端口,而DISPLAY的默认值为『:0』,这实际上是『unit:0』的简写。因此如果在Linux的控制台启动一个图形程序,它就会出现在当前主机的显示屏幕中。

2.1 Docker中的GUI程序进行外部显示的两种思路

基于上述原理,将Docker中的GUI程序显示到外面,就是通过某种方式把 X11 的客户端的内容从容器里面传递出来。基本的思路有以下两种:

1. 通过SSH连接或远程控制软件,最终通过tcp套接字将数据发送出来
2. 让容器和主机共享X11的unix套接字&

;