实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用)
我有一个需求:
- 一方面,我需要在 Docker 容器环境下运行应用(因为有些环境在 Mac 下很难安装配置,并且希望环境干净隔离)。
- 另一方面,容器中的应用又需要进行图形界面的显示。
由于 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应用)相关推荐
- 在Docker容器中的Tomcat上运行ADF Essentials
我经常开发示例应用程序. 我尝试了一些想法,运用了一些技巧,并通过示例应用程序与同事和博客读者分享了我的调查结果. 当某人想要了解该技术的实现方式时,他们只需查看源代码,就足以理解这个想法. 但是,如 ...
- mac显示器如何显示docker container中的gui请求
参考这里:实现Mac主机上的Docker容器中的图形界面显示(运行GUI应用) - 何雨龙 - 博客园 step1: socat 安装 下载 文件,按照readme编译安装. tar xzf soca ...
- docker安装_以简便的方式监控Docker容器中的ADF应用程序
docker安装 在这篇简短的文章中,我将展示一种简单的方法来确保在Docker容器中运行的ADF应用程序在内存利用率方面是健康的Java应用程序. 我将使用标准工具JConsole,它是计算机上JD ...
- docker 容器监控_以简便的方式监控Docker容器中的ADF应用程序
docker 容器监控 在这篇简短的文章中,我将展示一种简单的方法来确保在Docker容器中运行的ADF应用程序在内存利用率方面是健康的Java应用程序. 我将使用标准工具JConsole,它是计算机 ...
- 轻松监控Docker容器中的ADF应用程序
在这篇简短的文章中,我将展示一种简单的方法,以确保在Docker容器中运行的ADF应用程序在内存利用率方面是健康的Java应用程序. 我将使用标准工具JConsole,它是计算机上JDK安装的一部分. ...
- 如何在Docker容器中运行Docker [3种方法]
在本博客中,我将向您介绍在docker中运行docker所需的三种不同方法. Docker In Docker的用处 dockerIndocker的一个潜在用处是CI管道,在代码成功构建后,您需要在其 ...
- Docker容器中GUI软件的远程图形界面交互:mobaXterm+SSH,以脑影像处理软件FSL为例;FSL6.0.3完整安装与可视化;docker容器图形化;远程登录docker容器;
前言 对docker容器中软件的操作,是基于命令行的,这就导致了习惯图形化界面的人比较难以使用docker,而它又是一个神器,所以很难受.一般情况下,可以给容器安装一个桌面环境,然后用类似VNC的 ...
- 如何在Docker容器中挂载主机目录
本文翻译自:How to mount a host directory in a Docker container I am trying to mount a host directory into ...
- sql docker容器_了解SQL Server Docker容器中的备份和还原操作
sql docker容器 In this 17th article of the series (see the full article index at bottom), we will disc ...
最新文章
- Adnroid文件存储路径getFilesDir()与getExternalFilesDir的区别
- 范数介绍及C++/OpenCV/Eigen的三种实现
- 批处理dir 保存到变量中_批处理|看大神如何教您30秒搞定批量提取文件名!
- iOS开发(1)写在前面的话
- gcc -E 产生预编译后的文件
- windows下boost库的基本使用方法
- 一篇 JPA 总结
- C语言图形库——easyx的使用
- 小学生十大计算机专业书排行,小学教辅十大排行榜2018 小学教辅书那些比较好...
- Jmeter 使用详解
- 玛雅日历转化(Maya calendar,POJ1008, UVA300)
- 阿里云服务器购买流程及连接测试(学习笔记)
- python做题记录之正方形拼接
- 人生算法第一天心得总结(A)九段进阶(3-6)
- 为你推荐10款开发常用的代码编辑器
- 英语四六级及考研语法(学习方法)
- python:talib 市场情绪指标 BRAR
- Gradle Could not resolve org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72.
- Spread 16.0 for ASP.NET-WEB-Crack
- 银行信贷系统调用链路和每个系统的作用