我有一個需求:
- 一方面,我需要在 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 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 國際許可協議
參考
- Running GUI’s with Docker on Mac OS X
- Docker有關GUI軟件的界面顯示設計(Windows 宿主主機)
- 在windows下使用Xming顯示群輝Docker鏡像里軟件圖形界面(Windows 宿主主機)
- Docker容器圖形界面顯示(運行GUI軟件)的配置方法
- 在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 宿主主機:成功)