實現Mac主機上的Docker容器中的圖形界面顯示(運行GUI應用)


我有一個需求:

  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 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()

運行這個腳本后,成功出來圖像:

在實際過程中,運行這個腳本可能會報這樣的錯誤

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 國際許可協議

參考

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM