我有一个需求:

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

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

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

实现的解决方案

socat 安装

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

brew install socat

xquartz 安装

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

brew install xquartz

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

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

xquartz 配置

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

echo $DISPLAY

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

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

open -a Xquartz

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

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

配置之后,此时暂时关闭 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 1500ether 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.255nd6 options=201<PERFORMNUD,DAD>media: autoselectstatus: 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()

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

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

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 的有些初始化工作没有完成,多运行几次就会成功跑通,并且比较稳定。

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

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

参考

  • Running GUI’s with Docker on Mac OS X
  • Docker有关GUI软件的界面显示设计(Windows 宿主主机)
  • 在Mac上尝试用Docker运行一个需要网络的Gui程序
  • Run GUI apps in containier in OSX (docker for mac)
  • OSX X11 Error cannot open display
  • Bring Linux apps to the Mac Desktop with Docker
  • Docker容器图形界面显示(运行GUI软件)的配置方法(Ubuntu 宿主主机:未成功,这个方案屏幕出现了崩溃)
  • Docker容器运行GUI程序的配置方法(Ubuntu 宿主主机:成功)

转载于:https://www.cnblogs.com/noluye/p/11405358.html

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

  1. 在Docker容器中的Tomcat上运行ADF Essentials

    我经常开发示例应用程序. 我尝试了一些想法,运用了一些技巧,并通过示例应用程序与同事和博客读者分享了我的调查结果. 当某人想要了解该技术的实现方式时,他们只需查看源代码,就足以理解这个想法. 但是,如 ...

  2. mac显示器如何显示docker container中的gui请求

    参考这里:实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用) - 何雨龙 - 博客园 step1: socat 安装 下载 文件,按照readme编译安装. tar xzf soca ...

  3. docker安装_以简便的方式监控Docker容器中的ADF应用程序

    docker安装 在这篇简短的文章中,我将展示一种简单的方法来确保在Docker容器中运行的ADF应用程序在内存利用率方面是健康的Java应用程序. 我将使用标准工具JConsole,它是计算机上JD ...

  4. docker 容器监控_以简便的方式监控Docker容器中的ADF应用程序

    docker 容器监控 在这篇简短的文章中,我将展示一种简单的方法来确保在Docker容器中运行的ADF应用程序在内存利用率方面是健康的Java应用程序. 我将使用标准工具JConsole,它是计算机 ...

  5. 轻松监控Docker容器中的ADF应用程序

    在这篇简短的文章中,我将展示一种简单的方法,以确保在Docker容器中运行的ADF应用程序在内存利用率方面是健康的Java应用程序. 我将使用标准工具JConsole,它是计算机上JDK安装的一部分. ...

  6. 如何在Docker容器中运行Docker [3种方法]

    在本博客中,我将向您介绍在docker中运行docker所需的三种不同方法. Docker In Docker的用处 dockerIndocker的一个潜在用处是CI管道,在代码成功构建后,您需要在其 ...

  7. Docker容器中GUI软件的远程图形界面交互:mobaXterm+SSH,以脑影像处理软件FSL为例;FSL6.0.3完整安装与可视化;docker容器图形化;远程登录docker容器;

    前言   对docker容器中软件的操作,是基于命令行的,这就导致了习惯图形化界面的人比较难以使用docker,而它又是一个神器,所以很难受.一般情况下,可以给容器安装一个桌面环境,然后用类似VNC的 ...

  8. 如何在Docker容器中挂载主机目录

    本文翻译自:How to mount a host directory in a Docker container I am trying to mount a host directory into ...

  9. sql docker容器_了解SQL Server Docker容器中的备份和还原操作

    sql docker容器 In this 17th article of the series (see the full article index at bottom), we will disc ...

最新文章

  1. Adnroid文件存储路径getFilesDir()与getExternalFilesDir的区别
  2. 范数介绍及C++/OpenCV/Eigen的三种实现
  3. 批处理dir 保存到变量中_批处理|看大神如何教您30秒搞定批量提取文件名!
  4. iOS开发(1)写在前面的话
  5. gcc -E 产生预编译后的文件
  6. windows下boost库的基本使用方法
  7. 一篇 JPA 总结
  8. C语言图形库——easyx的使用
  9. 小学生十大计算机专业书排行,小学教辅十大排行榜2018 小学教辅书那些比较好...
  10. Jmeter 使用详解
  11. 玛雅日历转化(Maya calendar,POJ1008, UVA300)
  12. 阿里云服务器购买流程及连接测试(学习笔记)
  13. python做题记录之正方形拼接
  14. 人生算法第一天心得总结(A)九段进阶(3-6)
  15. 为你推荐10款开发常用的代码编辑器
  16. 英语四六级及考研语法(学习方法)
  17. python:talib 市场情绪指标 BRAR
  18. Gradle Could not resolve org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72.
  19. Spread 16.0 for ASP.NET-WEB-Crack
  20. 银行信贷系统调用链路和每个系统的作用

热门文章

  1. shell中参数及带色彩打印
  2. 网页中的meta property
  3. 线程协作-CountDownLatch
  4. 归并排序Merge sort(转)
  5. Linux课程实践二:编译模块实现内核数据操控
  6. Java-Tomcat 5.5 下的JNDI
  7. 人类视觉计算理论经典著作,豆瓣评分9.7,中文版惊鸿面世!
  8. 【文末送书】调参太费力?自动化机器学习来帮你!
  9. Python基础入门的必备知识点
  10. 年终总结 | 2019年人工智能+计算机视觉+深度学习笔记思维导图汇总