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

我有一個需求:html

  1. 一方面,我須要在 Docker 容器環境下運行應用(由於有些環境在 Mac 下很難安裝配置,而且但願環境乾淨隔離)。
  2. 另外一方面,容器中的應用又須要進行圖形界面的顯示

因爲 Docker 容器是命令行的形式,自己不支持圖形界面顯示,所以我但願 Docker 容器能和個人 Mac 主機上的 GUI 進行鏈接linux

個人 Mac OS X 系統版本是:10.14.2git

實現的解決方案

socat 安裝

首先用 socat 來解決容器和 Mac 主機 GUI 的通訊問題:docker

brew install socat

xquartz 安裝

接下來是處理 X windows system,咱們須要安裝 Xquartz。能夠採用 brew 安裝(我沒有使用這種方式):macos

brew install xquartz

因爲個人網絡極差,裏面 git clone 下載不下來,我最終選擇進入官網直接安裝 dmg(v2.6.1),大概 70M 大小。windows

安裝好了以後須要註銷並從新進入 Mac 主機網絡

xquartz 配置

重啓以後咱們發現有了環境變量 $DISPLAY。app

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

參考

相關文章
相關標籤/搜索