实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)

摘要:
另一方面,容器中的应用程序需要显示图形界面。由于Docker容器是命令行形式,不支持图形界面显示,我希望Docker容器可以连接到我的Mac主机上的GUI。我的Mac OS X系统版本为10.14.2。socat安装的解决方案是首先使用socat解决容器和Mac GUI之间的通信问题:brewinstall socatxquartz。下一步是处理Xwindows系统。我们需要安装Xquartz。现在重新启动Xquartz应用程序。

我有一个需求:

  1. 一方面,我需要在 Docker 容器环境下运行应用(因为有些环境在 Mac 下很难安装配置,并且希望环境干净隔离)。
  2. 另一方面,容器中的应用又需要进行图形界面的显示

由于 Docker 容器是命令行的形式,本身不支持图形界面显示,因此我希望 Docker 容器能和我的 Mac 主机上的 GUI 进行连接

我的 Mac OS X 系统版本是:10.14.2

实现的解决方案

socat 安装

首先用 socat 来解决容器和 Mac 主机 GUI 的通信问题:

实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)第1张

brew install socat

xquartz 安装

接下来是处理 X windows system,我们需要安装 Xquartz。可以采用 brew 安装(我没有使用这种方式):

brew install xquartz

由于我的网络极差,里面 git clone 下载不下来,我最终选择进入官网直接安装 dmg(v2.6.1),大概 70M 大小。

实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)第2张

安装好了之后需要注销并重新进入 Mac 主机

xquartz 配置

重启之后我们发现有了环境变量 $DISPLAY。

echo $DISPLAY
/private/tmp/com.apple.launchd.nzm51qjuIW/org.macosforge.xquartz:0

点击应用图标或者命令行输入

open -a Xquartz

程序坞可以看到有一个 Xquartz 应用:

实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)第3张

在这个应用下进行偏好设置,勾选允许从网络客户端连接:

实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)第4张

配置之后,此时暂时关闭 Xquartz 应用。

Socat 配置

与其他参考的方法不同,我们在有了 DISPLAY 环境变量之后,才会对 Socat 进行配置,输入

socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:"$DISPLAY"

注意这个进程一直是运行状态,不要中断它。

现在重新开启 Xquartz 应用(因为我的实践发现 Xquartz 似乎有可能会占用 6000 端口,如果先开启它的话,上面的命令可能不能正常执行)。

此外 Xquartz 应用需要多点击几次。

容器配置

让我们查看主机 OS 上的 IP 地址

ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMPLEX,MULTICAST> mtu 1500
	ether 60:30:d4:61:f2:fa 
	inet6 fe80::1021:a4c7:f106:2c02%en0 prefixlen 64 secured scopeid 0x5 
	inet 192.168.0.106 netmask 0xffffff00 broadcast 192.168.0.255
	nd6 options=201<PERFORMNUD,DAD>
	media: autoselect
	status: active

然后在容器内设置环境变量指向这个 IP 地址(由于退出容器后不会保存环境变量,因此每次进入容器都要执行这个命令):

export DISPLAY=192.168.0.106:0

或者在一开始启动容器时就进行设置:

docker run -e DISPLAY=192.168.0.106:0 [image_id]

这样就配置好了。

测试

简单测试应用

在容器内安装钟表小动画并执行:

sudo apt-get install xarclock
xarclock

测试脚本

或者,我们可以在容器内写一个 Python 测试脚本:

1 import matplotlib.pyplot as plt
2 import numpy as np
3  
4 x = np.linspace(-1, 1, 50)
5 y = 2 * x
6  
7 plt.plot(x, y)
8 plt.show()

运行这个脚本后,成功出来图像:

实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)第5张

在实际过程中,运行这个脚本可能会报这样的错误

XIO:  fatal IO error 11 (Resource temporarily unavailable) on X server "192.168.0.106:0"
      after 382 requests (382 known processed) with 11 events remaining.

我自己的理解是可能 Socat 或者 Xquatz 的有些初始化工作没有完成,多运行几次就会成功跑通,并且比较稳定。

这个问题折腾了半天总算实现,还是比较爽的哦。

实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)第6张

原文作者:雨先生
原文链接:https://www.cnblogs.com/noluye/p/11405358.html 
许可协议:知识共享署名-非商业性使用 4.0 国际许可协议

参考

免责声明:文章转载自《实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇php错误处理,自动加载,以及栈堆内存和运行模式堆浅解 (转)redis宕机如何解决?如果是项目上线的宕机呢?下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

记Windows10下安装Docker的步骤

本文主要是记录吾八哥本人在Windows10下安装Docker的过程,当然这些步骤也是在网上搜索查阅资料得知而来的!具体步骤如下: 一、启用Hyper-V 打开控制面板 - 程序和功能 - 启用或关闭Windows功能,勾选Hyper-V,然后点击确定即可,如图: 点击确定后,启用完毕会提示重启系统,我们可以稍后再重启。 二、安装Docker Docke...

docker pull镜像失败

版权声明:本文为博主原创文章,支持原创,转载请附上原文出处链接和本声明。  本文地址:https://www.cnblogs.com/wannengachao/p/12119840.html 问题描述: 服务器重启后docker pull镜像报错:TLS握手超时。(见下图)  第一反应查看网络是否正常,于是尝试下ping外部网络发现网络是通的。 因为毕竟...

Mac &amp;amp; XCode 使用技巧总结

Mac OS 是基于UNIX 的操作系统。 一 基本技巧 1. 允许安装任何来源的APP 系统偏好设置 -> 安全性和隐私 -> 通用 选择”允许从以下位置下载的应用程序“ 中的 “任何来源”。 2.使用虚拟机安装Mac后,分辨率自适应屏幕 如果宿主的屏幕分辨率为"1920 * 1080" 。虚拟机设置--> 显示器-->选中指定监...

Harbor 2.1.2 安装部署

环境 首先需要准备好 Docker + Docker-Compose 环境,Docker 在 CentOS 7.x 的安装教程请参考 这篇文章,后续文章假设你已经安装好了上述环境。 安装 标准安装 首先从 Harbor 的官方 GitHub Relase 下载最新的安装包,Harbor 本身的运行也是依赖于 Docker Compose ,整个压缩包本质上...

kubernetes之健康状态检测

1.说明容器探针: kubelet 对容器执行的定期诊断探针执行方式: LivenessProbe: 判断容器是否存活 running状态, 如果不健康kubelet就会杀掉pod,根据重启策略RestartPolicy进行相应的处理 ReadinessProbe: 判断容器是否处于可用Ready状态, 达到ready状态表示pod可以接受请求, 如果...

python GUI界面编程 口算题生成系统

问题描述 口算题生成系统 功能: (1)口算:题目显示在界面上(除法必须是整除),逐个显示题目,用户通过输入框输入计算结果。系统能实时统计正确率,将错误题目打印到文件里。 (2)生成题目:用户选择生成的题目数量,打印时的列数,运算符的数量,将题目生成到docx文件里。 设计说明 (1)拟设计的功能及实现思路、需要用到的知识功能(1)的实现思路: 1.初始化...