我有一個需求:html
- 一方面,我須要在 Docker 容器環境下運行應用(由於有些環境在 Mac 下很難安裝配置,而且但願環境乾淨隔離)。
- 另外一方面,容器中的應用又須要進行圖形界面的顯示。
因爲 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 國際許可協議
參考
- 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 宿主主機:成功)