Cyber Coding Course

師其意,不泥其跡

如何在Container內執行X client及X Window簡介(docker gui)

前言

今天來跟大家談談X,不是iPhone X,也不是X戰警哦 ,而是X Window System,
他是目前Linux系統主要的圖形化界面顯示元件。
由於他非常易於擴充及模組化,打從1986年建立,就一直使用至今。
X Window系統採用為Client / Server的架構,他把應用程式顯示拆分為兩個部份,
X Windows的應用程式通常我們稱為X Client,而顯示則是大家所熟知的X Server
X client與X server透過X協定(X protocol)溝通, 這是一個異步的網路通訊協定。

因為X protocol把作業系統個別特有的細項及硬體給隱藏了,
也就是說X Clinet可以在任何的作業系統上執行,並且顯示於另一台執行X Server的作業系統上。

即使在同一台電腦上,X Clients 及 X Server 也都依然使用X protocol(X協定)進行溝通。不過這裡並非使用TCP/IP,
取而代之是使用一個極高速的Unix domain socket。通常就是這個/tmp/.X11-unix/X0的socket檔。

本文的影片中,我將執行Linux上的X Client應用程式,並顯示於Mac Os上。

X Security (關於安全)

要顯示一個X client在一台遠端的主機上,這個server必需要授權給你的station。
我們可以透過xhost或xauth進行。
Host-based: 主機安全會使用xhost指令。
User-based: Xauthority使用每個使用者家目錄下的.xauthority設定。

下方這個影片中,我將介紹如執行Container內的X client,經由socket,將畫面顯示於我們的Mac OS主機上,
另外也會操作透過ssh公鑰驗證的方式,加上-Y參數,啟動X11轉發,
將遠端的X client執行結果,用圖形化方式,顯示在我們自己的Mac OS上。

由於Mac OS Leopard版之後,Apple已不在內建X11,要求大家使用open source的XQuartz,
所以如果您想在Mac OS上,顯示X client的畫面,記得先安裝Mac OS專用的X11 server:
https://www.xquartz.org/index.html

實際影片Demo:


Docker GUI環境簡易測試(2021 update):
#直接停用access control
xhost +

#一行搞定
X=/tmp/.X11-unix/X0 \
docker run --rm  -v $X:$X -e DISPLAY=host.docker.internal:0 -ti fedora bash

#直接安裝個xeyes測試
yum install -y xeyes

#然後執行xeyes,您的電腦應該就能看到眼睛了。

作者: Devin Yang