क्या आप डॉक कंटेनर में GUI एप्लिकेशन चला सकते हैं?


409

आप डॉक कंटेनर में GUI एप्लिकेशन कैसे चला सकते हैं ?

क्या कोई ऐसी छवियां हैं जो सेट अप करती हैं vncserverया ऐसा कुछ है जिससे आप कर सकते हैं - उदाहरण के लिए - फ़ायरफ़ॉक्स के चारों ओर एक अतिरिक्त स्पीडबम्प सैंडबॉक्स जोड़ें?


यह प्रश्न केवल लिनक्स (उम्र और उत्तरों की सामग्री के आधार पर) से संबंधित है, न कि विंडोज से। यदि हां, तो क्या हम इसे स्पष्ट करने के लिए शीर्षक संपादित कर सकते हैं? धन्यवाद
UuDdLrLrSs


जवाबों:


238

आप बस फ़ायरफ़ॉक्स के साथ एक vncserver स्थापित कर सकते हैं :)

मैंने एक चित्र, vnc / फ़ायरफ़ॉक्स, यहाँ धकेल दिया: docker pull creack/firefox-vnc

इस डॉकफाइल के साथ चित्र बनाया गया है:

# Firefox over VNC
#
# VERSION               0.1
# DOCKER-VERSION        0.2

FROM    ubuntu:12.04
# Make sure the package repository is up to date
RUN     echo "deb http://archive.ubuntu.com/ubuntu precise main universe" > /etc/apt/sources.list
RUN     apt-get update

# Install vnc, xvfb in order to create a 'fake' display and firefox
RUN     apt-get install -y x11vnc xvfb firefox
RUN     mkdir ~/.vnc
# Setup a password
RUN     x11vnc -storepasswd 1234 ~/.vnc/passwd
# Autostart firefox (might not be the best way to do it, but it does the trick)
RUN     bash -c 'echo "firefox" >> /.bashrc'

यह पासवर्ड के साथ VNC चलाने वाला डॉकटर कंटेनर बनाएगा 1234:

डॉकर संस्करण 18 या नए के लिए:

docker run -p 5900:5900 -e HOME=/ creack/firefox-vnc x11vnc -forever -usepw -create

डॉकर संस्करण 1.3 या नए के लिए:

docker run -p 5900 -e HOME=/ creack/firefox-vnc x11vnc -forever -usepw -create

संस्करण 1.3 से पहले डॉकर के लिए:

docker run -p 5900 creack/firefox-vnc x11vnc -forever -usepw -create

2
मैं दूरस्थ रूप से देखने के लिए VNC क्लाइंट का उपयोग कैसे करूंगा? IP + पोर्ट में टाइप करना काम नहीं करता है।
user94154

17
सबसे पहले, आपको आवंटित पोर्ट की जांच करने की आवश्यकता है ( docker inspect <container id>बस या करके docker ps, फिर आप अपने मेजबान के आईपी को उस पोर्ट से जोड़ दें जो आपको अभी मिला है।
creack

9
creackfirefox-vnc छवि त्रुटि के साथ विफल हो जाती है: VNC पासवर्ड दर्ज करें: stty: मानक इनपुट: उपकरण के लिए अनुचित ioctl: कोई फ़ाइल या निर्देशिका नहीं stty: मानक इनपुट: डिवाइस पर अनुचित ioctl x11vnc -usepw: उपयोग करने के लिए एक पासवर्ड नहीं मिल सका।
अल्फोंसोडेव

6
डोकर उपयोग अच्छी तरह से> चल जीयूआई डोकर वाले ऐप्स fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker
डेनिस सी

7
कोई उपयोगकर्ता नाम नहीं है, पासवर्ड स्पष्ट रूप से उत्तर में इंगित किया गया है और कोई भी vnc क्लाइंट करेगा। मेरे मामले में, मुझे देशी ओएक्सएक्स एक पसंद है। (खोजक से, कमांड + के दबाएं और vnc से कनेक्ट करें: // <docker ip>: <कंटेनर
एक्सपोज्ड

195

नए सिस्टम के साथ Xauthority एक मुद्दा बन जाता है। मैं या तो अपने डॉकर कंटेनरों को चलाने से पहले xhost + के साथ किसी भी सुरक्षा को त्याग सकता हूं, या मैं एक अच्छी तरह से तैयार किए गए Xauthority फ़ाइल में पास कर सकता हूं। विशिष्ट Xauthority फाइलें होस्टनाम विशिष्ट हैं। Docker के साथ, प्रत्येक कंटेनर में एक अलग होस्ट नाम (docker run -h के साथ सेट) हो सकता है, लेकिन यहां तक ​​कि होस्ट सिस्टम के समान कंटेनर के होस्टनाम को सेट करने से मेरे मामले में मदद नहीं मिली। xeyes (मुझे यह उदाहरण पसंद है) बस मैजिक कुकी को नजरअंदाज कर देगा और सर्वर को कोई क्रेडेंशियल नहीं देगा। इसलिए हमें एक त्रुटि संदेश मिलता है 'कोई प्रोटोकॉल निर्दिष्ट नहीं किया जा सकता खुले प्रदर्शन'

Xauthority फ़ाइल एक तरह से लिखी जा सकती है ताकि होस्टनाम को कोई फर्क न पड़े। हमें ऑथेंटिकेशन फ़ैमिली को 'फ़ैमिलीवाइड' में सेट करना होगा। मुझे यकीन नहीं है, अगर xauth के पास इसके लिए एक उचित कमांड लाइन है, तो यहां एक उदाहरण है जो xauth और sed को ऐसा करने के लिए जोड़ती है। हमें nlist आउटपुट के पहले 16 बिट्स को बदलने की आवश्यकता है। FamilyWild का मान 65535 या 0xffff है।

docker build -t xeyes - << __EOF__
FROM debian
RUN apt-get update
RUN apt-get install -qqy x11-apps
ENV DISPLAY :0
CMD xeyes
__EOF__
XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth
xauth nlist :0 | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
docker run -ti -v $XSOCK:$XSOCK -v $XAUTH:$XAUTH -e XAUTHORITY=$XAUTH xeyes

8
बस एक नोट, -v $XSOCK:$XSOCK -v $XAUTH:$XAUTHछोटा किया जा सकता है-v $XSOCK -v $XAUTH
Piotr अलेक्जेंडर Chmielowski

2
@PiotrAleksanderChmielowski कि मेरे लिए काम नहीं किया, डॉकर संस्करण १.१२.०१, निर्माण t जगह
tbc0

14
@ डर्क: आप के :0साथ प्रतिस्थापित करना चाहते हो सकता है $DISPLAY। इसका मतलब है कि xauth nlist $DISPLAY | ...और docker run -ti -e DISPLAY=$DISPLAY ...। आमतौर पर एक्स प्रदर्शन होता है :0, लेकिन हमेशा नहीं (और विशेष रूप से तब नहीं जब आप ssh -X के माध्यम से कनेक्ट हो रहे हों)।
जॉन्डोडो

4
Ubuntu 16.04 पर xauth /tmp/.docker.xauthफ़ाइल को 600अनुमतियों के साथ बनाता है । डॉक कंटेनर के अंदर xauth में यह परिणाम फ़ाइल को पढ़ने में सक्षम नहीं है। आप xauth listडॉकटर कंटेनर के भीतर चलाकर सत्यापित कर सकते हैं । मैंने इसे हल करने के chmod 755 $XAUTHलिए xauth nlist :0 | ...कमांड के बाद जोड़ा है ।
अबई

2
@ @बाई ,४५ या ६४४ के लिए 55५५ का उपयोग पर्याप्त क्यों है?
डैनियल एल्डर

68

मुझे बस यह ब्लॉग प्रविष्टि मिली और मैं इसे आपके साथ यहाँ साझा करना चाहता हूं क्योंकि मुझे लगता है कि यह करना सबसे अच्छा तरीका है और यह इतना आसान है।

http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/

PROS:
+ डॉक कंटेनर में कोई x सर्वर सामान
नहीं + कोई vnc क्लाइंट / सर्वर की जरूरत
नहीं + x ss अग्रेषण के साथ + ssh नहीं
+ बहुत छोटे डॉक कंटेनर

कान्स:
- होस्ट पर एक्स का उपयोग करना (सुरक्षित-सैंडबॉक्सिंग के लिए नहीं)

अगर किसी दिन लिंक फेल हो जाएगा तो मैंने सबसे महत्वपूर्ण हिस्सा यहाँ रखा है:
dockerfile:

FROM ubuntu:14.04

RUN apt-get update && apt-get install -y firefox

# Replace 1000 with your user / group id
RUN export uid=1000 gid=1000 && \
    mkdir -p /home/developer && \
    echo "developer:x:${uid}:${gid}:Developer,,,:/home/developer:/bin/bash" >> /etc/passwd && \
    echo "developer:x:${uid}:" >> /etc/group && \
    echo "developer ALL=(ALL) NOPASSWD: ALL" > /etc/sudoers.d/developer && \
    chmod 0440 /etc/sudoers.d/developer && \
    chown ${uid}:${gid} -R /home/developer

USER developer
ENV HOME /home/developer
CMD /usr/bin/firefox

चित्र बनाएँ:

docker build -t firefox .

और रन कमांड:

docker run -ti --rm \
   -e DISPLAY=$DISPLAY \
   -v /tmp/.X11-unix:/tmp/.X11-unix \
   firefox

बेशक आप रन कमांड में भी ऐसा कर सकते हैं sh -c "echo script-here"

HINT: ऑडियो के लिए इस पर एक नज़र डालें: https://stackoverflow.com/a/28985715/2835523


मैं इसे विंडोज 7 पर कैसे कर सकता हूं? क्या मुझे एक्स सर्वर स्थापित करने की आवश्यकता है?
वॉकसिग्निसन

3
यहाँ अधिकांश उत्तर के रूप में यह केवल मुझे लगता है कि यूनिक्स पर लागू होता है - जब तक कि विंडोज़ एक्स सर्वर विंडो सिस्टम का समर्थन नहीं करता है।
ए। Binzxxxxxx

क्या आपको लगता है कि यह काम कर सकता है अगर मैंने विंडोज़ पर एक्स सर्वर स्थापित किया है या यहां तक ​​कि अपने डॉकर कंटेनर में एक्स सर्वर को बंडल किया है?
वॉकसिग्निसन

1
मुझे लगता है कि आपको फ़ोल्डर apt-get -y install sudoबनाने के लिए डॉकफाइल में भी इंस्टॉल करना होगा /etc/sudoers.d
mulg0r

1
यह भी साथ किसी भी मेजबान से एक्स के लिए कनेक्शन की अनुमति के लिए आवश्यक हो सकता है$ xhost +
Bandoos

52

डॉकटर डेटा वॉल्यूम के साथ एक्सगॉर के यूनिक्स डोमेन सॉकेट को कंटेनर के अंदर उजागर करना बहुत आसान है।

उदाहरण के लिए, इस तरह से एक डॉकरफाइल के साथ:

FROM debian
RUN apt-get update
RUN apt-get install -qqy x11-apps
ENV DISPLAY :0
CMD xeyes

आप निम्नलिखित कर सकते हैं:

$ docker build -t xeyes - < Dockerfile
$ XSOCK=/tmp/.X11-unix/X0
$ docker run -v $XSOCK:$XSOCK xeyes

यह पाठ्यक्रम अनिवार्य रूप से एक्स-अग्रेषण के समान है। यह मेजबान पर एक्ससर्वर के लिए कंटेनर की पूर्ण पहुंच प्रदान करता है, इसलिए यह केवल तभी अनुशंसित है जब आपको भरोसा है कि अंदर क्या है।

नोट: यदि आप सुरक्षा के बारे में चिंतित हैं, तो एक बेहतर समाधान यह होगा कि ऐप को अनिवार्य या भूमिका-आधारित- अभिगम नियंत्रण के साथ परिभाषित किया जाए । डॉकर काफी अच्छा अलगाव हासिल करता है, लेकिन इसे एक अलग उद्देश्य को ध्यान में रखकर बनाया गया था। AppArmor , SELinux या GrSecurity का उपयोग करें , जो आपकी चिंता को दूर करने के लिए डिज़ाइन किए गए थे।


5
आपको Xhost जैसे टूल का उपयोग करके अन्य होस्ट्स से एक्स सर्वर तक पहुंचने की अनुमति देने की भी आवश्यकता है। पूरी तरह से इसे खोलने के xhost +लिए मेजबान पर उपयोग करें ।
टुल्ली

3
@ केवल xhost +localआवश्यक है। बेहतर होगा कि ~/.Xauthorityफाइल को कंटेनर में उपलब्ध कराया जाए, लेकिन यह खुद को प्रमाणित कर सकता है।
आर्येह लीब तौआरोग

3
क्या आप इसे मैक पर काम करने में कामयाब रहे हैं (बूट 2 डॉक का उपयोग करके)?
कार्ल फोर्नर

4
यह मेरे लिए उबंटू 14.04 लैपटॉप पर अच्छी तरह से काम कर रहा था। लेकिन अब मेरे लिए Ubuntu 15.04, docker 1.6.2 पर त्रुटि के साथ विफल हो रहा है Can't open display: :0। कोई विचार?
cboettig

6
मैं xhost +si:localuser:$USERकंटेनर को शुरू करने वाले उपयोगकर्ता को अधिकृत करता था।
निक ब्रिन

26

आप सब्युसर का भी उपयोग कर सकते हैं: https://github.com/timthelion/subuser

यह आपको doi में कई gui ऐप पैकेज करने की अनुमति देता है। फ़ायरफ़ॉक्स और एमएसीएस का अब तक परीक्षण किया गया है। फ़ायरफ़ॉक्स के साथ, वेबजीएल हालांकि काम नहीं करता है। क्रोमियम बिल्कुल काम नहीं करता है।

संपादित करें: ध्वनि काम करता है!

EDIT2: जब से मैंने पहली बार यह पोस्ट किया है, उस समय के बाद से सबसर बहुत प्रगति कर चुका है। अब मेरे पास एक वेबसाइट है subuser.org , और XP11 ब्रिजिंग के माध्यम से X11 से कनेक्ट करने के लिए एक नया सुरक्षा मॉडल ।


3
कृपया ध्यान दें कि सबसियर अभी भी बहुत नया और अपेक्षाकृत अप्रयुक्त है। यदि आप किसी भी समस्या में भाग लेते हैं, तो कृपया बग रिपोर्ट सबमिट करें!
22

मैं X11 से बचता हूँ अगर कोई रास्ता हो तो आप कर सकते हैं। आपका किलर ऐप डॉकर में टोर प्रॉक्सी चला रहा होगा, और एक चाइल्ड डॉक में प्लग इन के साथ एक पूर्ण ब्राउज़र चल रहा होगा, जैसे कि फ़ायरवॉलिंग आदि सभी नेटवर्क को टॉर डॉक के माध्यम से बाहर करता है। यह वेब प्रयोज्य के लिए वर्तमान टोर ब्राउज़र बंडल के चारों ओर लैप्स चलाएगा क्योंकि आप इसके माध्यम से समृद्ध सामग्री देंगे।
विल

1
क्या X11 सिक्योरिटी के लिए आपके लिए मुसीबत है? या यह है कि आप खिड़कियों के साथ यह काम करना चाहते हैं? या कि आप इसे दूर से काम करना चाहते हैं? ऊपर के सभी? मुझे लगता है कि vnc के साथ यह काम करना काफी संभव है (हालाँकि मैं इसे डिफ़ॉल्ट विधि नहीं बनाऊँगा क्योंकि यह vcc पर निर्भरता जोड़ता है)। दूर से काम करना वास्तव में संभव / अर्थपूर्ण नहीं है। यह भी है: github.com/rogaha/docker-desktop लेकिन बग रिपोर्ट से ऐसा लगता है कि xpra वास्तविक जीवन में अनुपयोगी हो सकता है।
टाइमहेलियन

24

OSX

Jürgen Weigert का सबसे अच्छा जवाब है जो मेरे लिए उबंटू पर काम करता था, हालांकि OSX पर, docker VirtualBox के अंदर चलता है और इसलिए समाधान कुछ और काम के बिना काम नहीं करता है।

मैं इसे इन अतिरिक्त सामग्रियों के साथ काम कर रहा हूँ:

  1. Xquartz (OSX अब X11 सर्वर के साथ जहाज नहीं)
  2. सॉकेट सोसाइटी के साथ अग्रेषित करना (शराब की दुकान स्थापित करना)
  3. कंटेनर को लॉन्च करने के लिए स्क्रिप्ट को बैश करें

मैं OSX के लिए इस उत्तर को बेहतर बनाने के लिए उपयोगकर्ता टिप्पणियों की सराहना करता हूं, मुझे यकीन नहीं है कि एक्स के लिए सॉकेट अग्रेषित करना सुरक्षित है, लेकिन मेरा इरादा उपयोग केवल स्थानीय रूप से डॉक कंटेनर को चलाने के लिए है।

इसके अलावा, स्क्रिप्ट थोड़ी नाजुक है, क्योंकि हमारे स्थानीय वायरलेस पर मशीन का आईपी पता प्राप्त करना आसान नहीं है, इसलिए यह हमेशा कुछ यादृच्छिक आईपी है।

कंटेनर को लॉन्च करने के लिए BASH स्क्रिप्ट का उपयोग करता हूं:

#!/usr/bin/env bash

CONTAINER=py3:2016-03-23-rc3
COMMAND=/bin/bash
NIC=en0

# Grab the ip address of this box
IPADDR=$(ifconfig $NIC | grep "inet " | awk '{print $2}')

DISP_NUM=$(jot -r 1 100 200)  # random display number between 100 and 200

PORT_NUM=$((6000 + DISP_NUM)) # so multiple instances of the container won't interfer with eachother

socat TCP-LISTEN:${PORT_NUM},reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\" 2>&1 > /dev/null &

XSOCK=/tmp/.X11-unix
XAUTH=/tmp/.docker.xauth.$USER.$$
touch $XAUTH
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -

docker run \
    -it \
    --rm \
    --user=$USER \
    --workdir="/Users/$USER" \
    -v "/Users/$USER:/home/$USER:rw" \
    -v $XSOCK:$XSOCK:rw \
    -v $XAUTH:$XAUTH:rw \
    -e DISPLAY=$IPADDR:$DISP_NUM \
    -e XAUTHORITY=$XAUTH \
    $CONTAINER \
    $COMMAND

rm -f $XAUTH
kill %1       # kill the socat job launched above

मैं xeyes और matplotlib इस दृष्टिकोण के साथ काम करने में सक्षम हूं।

विंडोज 7+

यह MobaXterm के साथ विंडोज 7+ पर थोड़ा आसान है:

  1. विंडोज़ के लिए MobaXterm स्थापित करें
  2. MobaXterm प्रारंभ करें
  3. X सर्वर कॉन्फ़िगर करें: सेटिंग्स -> X11 (टैब) -> X11 रिमोट एक्सेस को पूर्ण पर सेट करें
  4. कंटेनर लॉन्च करने के लिए इस BASH स्क्रिप्ट का उपयोग करें

run_docker.bash:

#!/usr/bin/env bash

CONTAINER=py3:2016-03-23-rc3
COMMAND=/bin/bash
DISPLAY="$(hostname):0"
USER=$(whoami)

docker run \
    -it \
    --rm \
    --user=$USER \
    --workdir="/home/$USER" \
    -v "/c/Users/$USER:/home/$USER:rw" \
    -e DISPLAY \
    $CONTAINER \
    $COMMAND

पीसी पर चल रहे xeyes


मुझे समझ में नहीं आया कि आपको बैश स्क्रिप्ट से क्या मतलब है - मैं इसे विंडोज़ में कैसे चलाऊँ?
deller

@ डेलर मैं जीआईटी का उपयोग करके विंडोज़ पर सॉफ्टवेयर विकास करता हूं, इसलिए मेरे पास जीआईटी-बैश शेल उपलब्ध है।
निक

मैंने चरणों का पालन किया। हालांकि, मैं मिलता है error: XDG_RUNTIME_DIR not set in the environment.और Error: cannot open display: VAIO:0.0। क्या आपका इस तरह से सामना हुआ?
5:32 बजे user3275095

1
मुझे उपयोगकर्ता से संबंधित एक त्रुटि मिल रही है अर्थात "पासवार्ड फ़ाइल में कोई मेल नहीं खाता है" कोई लीड?
वॉकसिग्निसन

19

होस्ट प्रदर्शन साझा करना: 0, जैसा कि कुछ अन्य उत्तरों में कहा गया है, में दो कमियां हैं:

  • यह कुछ एक्स सुरक्षा लीक के कारण कंटेनर अलगाव को तोड़ता है। उदाहरण के लिए, साथ keylogging xevया xinputसंभव है, और साथ मेजबान अनुप्रयोगों के रिमोट कंट्रोल xdotool
  • एक्स एक्सटेंशन एमआईटी-एसएचएम के लिए साझा की गई मेमोरी के लापता होने के कारण अनुप्रयोगों में रेंडरिंग ग्लिट्स और खराब रैम एक्सेस त्रुटियां हो सकती हैं। (आइसोलेशन डिग्रेडिंग विकल्प के साथ भी तय किया जा सकता है --ipc=host)।

एक उदाहरण स्क्रिप्ट के नीचे Xephyr में एक docker छवि को चलाने के लिए जो इस मुद्दे को संबोधित करता है।

  • यह X सुरक्षा लीक से बचा जाता है क्योंकि नेस्टेड X सर्वर में डॉक एप्लिकेशन चलते हैं।
  • RAM पहुंच विफलताओं से बचने के लिए MIT-SHM अक्षम है।
  • कंटेनर सुरक्षा के साथ सुधार हुआ है --cap-drop ALL --security-opt no-new-privileges। साथ ही कंटेनर उपयोगकर्ता रूट नहीं है।
  • Xephyr डिस्प्ले तक पहुंच को प्रतिबंधित करने के लिए एक एक्स कुकी बनाई जाती है।

स्क्रिप्ट को कुछ तर्क की उम्मीद है, पहले एक मेजबान खिड़की प्रबंधक को एक्सपीर में चलाने के लिए, दूसरे में एक डॉक छवि, वैकल्पिक रूप से तीसरी छवि को निष्पादित करने के लिए। डॉकटर में डेस्कटॉप वातावरण चलाने के लिए, एक मेजबान विंडो मैनेजर के बजाय ":" का उपयोग करें।

Xephyr विंडो को बंद करना docker कंटेनर अनुप्रयोगों को समाप्त करता है। डॉक किए गए एप्लिकेशन को समाप्त करने से Xephyr विंडो बंद हो जाती है।

उदाहरण:

  • xephyrdocker "openbox --sm-disable" x11docker/lxde pcmanfm
  • xephyrdocker : x11docker/lxde
  • xephyrdocker xfwm4 --device /dev/snd jess/nes /games/zelda.rom

xephyrdocker स्क्रिप्ट:

#! /bin/bash
#
# Xephyrdocker:     Example script to run docker GUI applications in Xephyr.
#
# Usage:
#   Xephyrdocker WINDOWMANAGER DOCKERIMAGE [IMAGECOMMAND [ARGS]]
#
# WINDOWMANAGER     host window manager for use with single GUI applications.
#                   To run without window manager from host, use ":"
# DOCKERIMAGE       docker image containing GUI applications or a desktop
# IMAGECOMMAND      command to run in image
#
Windowmanager="$1" && shift
Dockerimage="$*"

# Container user
Useruid=$(id -u)
Usergid=$(id -g)
Username="$(id -un)"
[ "$Useruid" = "0" ] && Useruid=1000 && Usergid=1000 && Username="user$Useruid"

# Find free display number
for ((Newdisplaynumber=1 ; Newdisplaynumber <= 100 ; Newdisplaynumber++)) ; do
  [ -e /tmp/.X11-unix/X$Newdisplaynumber ] || break
done
Newxsocket=/tmp/.X11-unix/X$Newdisplaynumber

# cache folder and files
Cachefolder=/tmp/Xephyrdocker_X$Newdisplaynumber
[ -e "$Cachefolder" ] && rm -R "$Cachefolder"
mkdir -p $Cachefolder
Xclientcookie=$Cachefolder/Xcookie.client
Xservercookie=$Cachefolder/Xcookie.server
Xinitrc=$Cachefolder/xinitrc
Etcpasswd=$Cachefolder/passwd

# command to run docker
# --rm                               created container will be discarded.
# -e DISPLAY=$Newdisplay             set environment variable to new display
# -e XAUTHORITY=/Xcookie             set environment variable XAUTHORITY to provided cookie
# -v $Xclientcookie:/Xcookie:ro      provide cookie file to container
# -v $NewXsocket:$NewXsocket:ro      Share new X socket of Xephyr
# --user $Useruid:$Usergid           Security: avoid root in container
# -v $Etcpasswd:/etc/passwd:ro       /etc/passwd file with user entry
# --group-add audio                  Allow access to /dev/snd if shared with '--device /dev/snd' 
# --cap-drop ALL                     Security: disable needless capabilities
# --security-opt no-new-privileges   Security: forbid new privileges
Dockercommand="docker run --rm \
  -e DISPLAY=:$Newdisplaynumber \
  -e XAUTHORITY=/Xcookie \
  -v $Xclientcookie:/Xcookie:ro \
  -v $Newxsocket:$Newxsocket:rw \
  --user $Useruid:$Usergid \
  -v $Etcpasswd:/etc/passwd:ro \
  --group-add audio \
  --env HOME=/tmp \
  --cap-drop ALL \
  --security-opt no-new-privileges \
  $(command -v docker-init >/dev/null && echo --init) \
  $Dockerimage"

echo "docker command: 
$Dockercommand
"

# command to run Xorg or Xephyr
# /usr/bin/Xephyr                an absolute path to X server executable must be given for xinit
# :$Newdisplaynumber             first argument has to be new display
# -auth $Xservercookie           path to cookie file for X server. Must be different from cookie file of client, not sure why
# -extension MIT-SHM             disable MIT-SHM to avoid rendering glitches and bad RAM access (+ instead of - enables it)
# -nolisten tcp                  disable tcp connections for security reasons
# -retro                         nice retro look
Xcommand="/usr/bin/Xephyr :$Newdisplaynumber \
  -auth $Xservercookie \
  -extension MIT-SHM \
  -nolisten tcp \
  -screen 1000x750x24 \
  -retro"

echo "X server command:
$Xcommand
"

# create /etc/passwd with unprivileged user
echo "root:x:0:0:root:/root:/bin/sh" >$Etcpasswd
echo "$Username:x:$Useruid:$Usergid:$Username,,,:/tmp:/bin/sh" >> $Etcpasswd

# create xinitrc
{ echo "#! /bin/bash"

  echo "# set environment variables to new display and new cookie"
  echo "export DISPLAY=:$Newdisplaynumber"
  echo "export XAUTHORITY=$Xclientcookie"

  echo "# same keyboard layout as on host"
  echo "echo '$(setxkbmap -display $DISPLAY -print)' | xkbcomp - :$Newdisplaynumber"

  echo "# create new XAUTHORITY cookie file" 
  echo ":> $Xclientcookie"
  echo "xauth add :$Newdisplaynumber . $(mcookie)"
  echo "# create prepared cookie with localhost identification disabled by ffff,"
  echo "# needed if X socket is shared instead connecting over tcp. ffff means 'familiy wild'"
  echo 'Cookie=$(xauth nlist '":$Newdisplaynumber | sed -e 's/^..../ffff/')" 
  echo 'echo $Cookie | xauth -f '$Xclientcookie' nmerge -'
  echo "cp $Xclientcookie $Xservercookie"
  echo "chmod 644 $Xclientcookie"

  echo "# run window manager in Xephyr"
  echo $Windowmanager' & Windowmanagerpid=$!'

  echo "# show docker log"
  echo 'tail --retry -n +1 -F '$Dockerlogfile' 2>/dev/null & Tailpid=$!'

  echo "# run docker"
  echo "$Dockercommand"
} > $Xinitrc

xinit  $Xinitrc -- $Xcommand
rm -Rf $Cachefolder

यह स्क्रिप्ट x11docker विकि पर बनी हुई है । एक अधिक उन्नत स्क्रिप्ट x11docker है जो GPU त्वरण, वेब कैमरा और प्रिंटर साझा करने जैसी सुविधाओं का समर्थन करती है।


18

यहां एक हल्का समाधान है जो कंटेनर पर किसी भी Xसर्वर, vncसर्वर या sshdडेमॉन को स्थापित करने से बचता है । यह सादगी में क्या हासिल करता है यह सुरक्षा और अलगाव में खो देता है।

यह मानता है कि आप अग्रेषण के sshसाथ होस्ट मशीन से जुड़ते हैं X11

sshdहोस्ट के कॉन्फ़िगरेशन में, पंक्ति जोड़ें

X11UseLocalhost no

ताकि होस्ट पर फॉरवर्ड किया गया एक्स सर्वर पोर्ट सभी इंटरफेस (सिर्फ नहीं lo) पर और विशेष रूप से डॉकर वर्चुअल इंटरफेस पर खोला जाए docker0

कंटेनर, जब चलाया जाता है, .Xauthorityतो फ़ाइल तक पहुंच की आवश्यकता होती है ताकि वह सर्वर से कनेक्ट हो सके। ऐसा करने के लिए, हम होस्ट पर होम डायरेक्टरी की ओर इशारा करते हुए केवल-पढ़ने के लिए वॉल्यूम को परिभाषित करते हैं (शायद एक बुद्धिमान विचार नहीं है!) और XAUTHORITYतदनुसार चर भी सेट करें ।

docker run -v $HOME:/hosthome:ro -e XAUTHORITY=/hosthome/.Xauthority

यह पर्याप्त नहीं है, हमें होस्ट से DISPLAY वैरिएबल भी पास करना है, लेकिन आईपी द्वारा होस्टनाम को प्रतिस्थापित करना है:

-e DISPLAY=$(echo $DISPLAY | sed "s/^.*:/$(hostname -i):/")

हम एक उपनाम को परिभाषित कर सकते हैं:

 alias dockerX11run='docker run -v $HOME:/hosthome:ro -e XAUTHORITY=/hosthome/.Xauthority -e DISPLAY=$(echo $DISPLAY | sed "s/^.*:/$(hostname -i):/")'

और इसे इस तरह से परखें:

dockerX11run centos xeyes

2
(यह विश्वसनीय ऐप्स के लिए बहुत अच्छा है। किसी भी तरह के सैंडबॉक्सिंग के लिए, हालांकि, आप एक्स-फ़ॉरवर्डिंग से बचना चाहते हैं।)
विल

1
यदि आप कंटेनर में पूरे होम डायरेक्टरी को माउंट नहीं करते हैं, तो आप केवल .Xauthorityफ़ाइल को ही माउंट कर सकते हैं -v $HOME/.Xauthority:/root/.Xauthority -e XAUTHORITY=/root/.Xauthority:।
रॉबर्ट हेनस

2
बदलने के बजाय X11UseLocalhost, आप कमांड के --net=hostलिए अतिरिक्त विकल्प का उपयोग भी कर सकते हैं docker run( यहां पाया गया )।
ingomueller.net

--net=hostएक बुरा विचार है जैसे कि यदि आप कंटेनर में एक बंदरगाह खोलते हैं तो यह मेजबान में भी
खुलेगा

16

जबकि जुरगेन वेइगर्ट का जवाब अनिवार्य रूप से इस समाधान को कवर करता है, यह मेरे लिए पहले से स्पष्ट नहीं था कि वहां क्या वर्णित किया जा रहा है। इसलिए मैं इस पर अपनी राय जोड़ूंगा, यदि किसी और को स्पष्टीकरण की आवश्यकता हो।

सबसे पहले, प्रासंगिक दस्तावेज X सुरक्षा मैनपेज है

कई ऑनलाइन स्रोत सिर्फ X11 यूनिक्स सॉकेट और ~/.Xauthorityकंटेनर में फ़ाइल बढ़ते का सुझाव देते हैं । ये समाधान अक्सर भाग्य द्वारा काम करते हैं, वास्तव में यह समझने के बिना कि, उदाहरण के लिए, कंटेनर उपयोगकर्ता उपयोगकर्ता के समान यूआईडी के साथ समाप्त होता है, इसलिए जादू कुंजी प्राधिकरण की कोई आवश्यकता नहीं है।

सबसे पहले, Xauthority फ़ाइल में 0600 मोड है, इसलिए कंटेनर उपयोगकर्ता इसे तब तक पढ़ने में सक्षम नहीं होगा जब तक कि इसमें समान यूआईडी न हो।

यहां तक ​​कि अगर आप फ़ाइल को कंटेनर में कॉपी करते हैं, और स्वामित्व बदलते हैं, तब भी एक और समस्या है। यदि आप xauth listएक ही Xauthorityफ़ाइल के साथ होस्ट और कंटेनर पर चलते हैं , तो आपको सूचीबद्ध विभिन्न प्रविष्टियाँ दिखाई देंगी। ऐसा इसलिए है क्योंकि xauthजहाँ यह चलता है उसके आधार पर प्रविष्टियों को फ़िल्टर करता है।

कंटेनर में X क्लाइंट (यानी GUI ऐप) के समान व्यवहार करेगा xauth। दूसरे शब्दों में, यह उपयोगकर्ता के डेस्कटॉप पर चल रहे एक्स सत्र के लिए मैजिक कुकी नहीं देखता है। इसके बजाय, यह आपके द्वारा पहले खोले गए सभी "दूरस्थ" एक्स सत्रों के लिए प्रविष्टियां देखता है (नीचे समझाया गया है)।

तो, आपको क्या करने की आवश्यकता है कंटेनर के होस्टनाम के साथ एक नई प्रविष्टि और होस्ट कुकी के रूप में एक ही हेक्स कुंजी (यानी आपके डेस्कटॉप पर चल रहे एक्स सत्र), जैसे:

containerhostname/unix:0   MIT-MAGIC-COOKIE-1   <shared hex key>

पकड़ यह है कि xauth addकंटेनर के अंदर कुकी को जोड़ा जाना है :

touch ~/.Xauthority
xauth add containerhostname/unix:0 . <shared hex key>

अन्यथा, xauthइसे इस तरह से टैग करता है कि यह केवल कंटेनर के बाहर देखा जाता है।

इस आदेश के लिए प्रारूप है:

xauth add hostname/$DISPLAY protocol hexkey

जहां प्रोटोकॉल का .प्रतिनिधित्व करता MIT-MAGIC-COOKIE-1है।

नोट:.Xauthority कंटेनर में कॉपी या बाइंड-माउंट करने की कोई आवश्यकता नहीं है । बस एक रिक्त फ़ाइल बनाएं, जैसा कि दिखाया गया है, और कुकी जोड़ें।

Jürgen Weigert का उत्तर FamilyWildकनेक्शन प्रकार का उपयोग करके मेजबान पर एक नई प्राधिकरण फ़ाइल बनाने और कंटेनर में कॉपी करने के लिए इसके चारों ओर मिलता है । ध्यान दें कि यह पहली बार ~/.Xauthorityउपयोग करने से वर्तमान X सत्र के लिए हेक्स कुंजी निकालता है xauth nlist

तो आवश्यक कदम हैं:

  • उपयोगकर्ता के वर्तमान X सत्र के लिए कुकी की हेक्स कुंजी निकालें।
  • कंटेनर में एक नई Xauthority फ़ाइल बनाएँ, जिसमें होस्ट होस्टनाम और साझा हेक्स कुंजी (या FamilyWildकनेक्शन प्रकार के साथ कुकी बनाएँ )।

मैं मानता हूं कि मैं अच्छी तरह से नहीं समझता कि कैसे FamilyWildकाम करता है, xauthया एक्स या क्लाइंट एक्सथोरिटी फ़ाइल से प्रविष्टियों को कैसे फ़िल्टर करते हैं, इस आधार पर कि वे कहाँ चलते हैं। इस पर अतिरिक्त जानकारी का स्वागत है।

यदि आप अपने डॉकर ऐप को वितरित करना चाहते हैं, तो आपको कंटेनर को चलाने के लिए एक स्टार्ट स्क्रिप्ट की आवश्यकता होगी जो उपयोगकर्ता के एक्स सत्र के लिए हेक्स कुंजी प्राप्त करता है, और इसे पहले बताए गए दो तरीकों में से एक में कंटेनर में आयात करता है।

यह प्राधिकरण प्रक्रिया के यांत्रिकी को समझने में भी मदद करता है:

  • कंटेनर में चलने वाला एक X क्लाइंट (यानी GUI एप्लिकेशन) कुकी प्रविष्टि के लिए Xauthority फ़ाइल में दिखता है जो कंटेनर के होस्टनाम और मूल्य से मेल खाता है $DISPLAY
  • यदि एक मिलान प्रविष्टि पाई जाती है, तो एक्स क्लाइंट इसे /tmp/.X11-unixकंटेनर में रखी निर्देशिका में उपयुक्त सॉकेट के माध्यम से, एक्स सर्वर के लिए अपने प्राधिकरण अनुरोध के साथ पास करता है ।

नोट: X11 यूनिक्स सॉकेट को अभी भी कंटेनर में रखा जाना चाहिए, या कंटेनर में एक्स सर्वर का कोई मार्ग नहीं होगा। अधिकांश वितरण सुरक्षा कारणों से डिफ़ॉल्ट रूप से एक्स सर्वर पर टीसीपी पहुंच को अक्षम करते हैं।

अतिरिक्त जानकारी के लिए, और बेहतर समझ के लिए कि X क्लाइंट / सर्वर संबंध कैसे काम करता है, यह SSH X के उदाहरण के मामले को देखने के लिए भी उपयोगी है:

  • दूरस्थ मशीन पर चलने वाला SSH सर्वर अपने स्वयं के X सर्वर का अनुकरण करता है।
  • यह $DISPLAYअपने स्वयं के एक्स सर्वर को इंगित करने के लिए एसएसएच सत्र में मूल्य निर्धारित करता है।
  • यह xauthदूरस्थ होस्ट के लिए एक नया कुकी बनाने के लिए उपयोग करता है, और इसे Xauthorityस्थानीय और दूरस्थ उपयोगकर्ताओं दोनों के लिए फ़ाइलों में जोड़ता है ।
  • जब GUI ऐप शुरू होते हैं, तो वे SSH के एमुलेटेड X सर्वर से बात करते हैं।
  • SSH सर्वर इस डेटा को आपके स्थानीय डेस्कटॉप पर SSH क्लाइंट को वापस भेज देता है।
  • स्थानीय SSH क्लाइंट आपके डेस्कटॉप पर चल रहे X सर्वर सत्र के लिए डेटा भेजता है, जैसे कि SSH क्लाइंट वास्तव में एक एक्स क्लाइंट (यानी GUI ऐप) है।
  • एक्स सर्वर आपके डेस्कटॉप पर जीयूआई को प्रस्तुत करने के लिए प्राप्त डेटा का उपयोग करता है।
  • इस एक्सचेंज की शुरुआत में, रिमोट एक्स क्लाइंट भी उस कुकी का उपयोग करके एक प्राधिकरण अनुरोध भेजता है, जो अभी बनाया गया था। स्थानीय X सर्वर इसकी स्थानीय प्रति से तुलना करता है।

12

यह हल्का नहीं है लेकिन एक अच्छा समाधान है जो पूर्ण डेस्कटॉप वर्चुअलाइजेशन के साथ डॉक फ़ीचर समानता देता है। Ubuntu और CentOS काम के लिए Xfce4 या IceWM दोनों, और noVNCविकल्प एक ब्राउज़र के माध्यम से आसान पहुंच के लिए बनाता है।

https://github.com/ConSol/docker-headless-vnc-container

यह noVNCअच्छी तरह से चलाता है tigerVNCvncserver। फिर यह startxदिए गए विंडो मैनेजर के लिए कॉल करता है । इसके अलावा, libnss_wrapper.soउपयोगकर्ताओं के लिए पासवर्ड प्रबंधन का अनुकरण करने के लिए उपयोग किया जाता है।


क्या किसी ने इसका परीक्षण किया है?
गिलहरमेक्स

3
@guilhermecgs हाँ, और ठीक काम करता है। तब से मैंने xpraडॉकटर में भी कोशिश की , जो रूट-कम एक्स है xpra। सबसे अच्छा अनुकूल आईएमओ था और वीएनसी की तुलना में अधिक कुशल है।
डैनिश

बस स्पष्ट होने के लिए ... क्या मुझे इस छवि के साथ पूर्ण डेस्कटॉप अनुभव (GNOME, KDE) हो सकता है?
गिलहरमेकस

मैंने केवल Xfce4 और IceWM (जो उस रेपो में है) की कोशिश की। बेशक अनुभव सीमित होगा, उदाहरण के लिए बढ़ते डिवाइस डेस्कटॉप (gvfs) में दिखाई नहीं देंगे जब तक कि आप डॉक करने वाले --device /dev/...को पास नहीं करते हैं और आवश्यक --capविशेषाधिकार सेट नहीं करते हैं । यह रोकथाम के उद्देश्य को हरा देता है, लेकिन आप उपकरणों से गुजर सकते हैं। कुछ ट्वीकिंग के साथ यह संभव होना चाहिए कि मुझे VNC के तहत GNOME / KDE चलाने का विश्वास है। मैं एनवीडिया कार्ड्स (कोई वीएनसी या एक्सपीआरए) के साथ डॉकटर में कई एक्स को चलाता था, इसलिए यह निश्चित रूप से उल्लेखनीय है।
द्वादशी

हमने अब तक इसकी कोशिश नहीं की। इस पर सबसे बड़ी चुनौती एक काम कर रहे डी-बस डेमॉन को लाना होगा। अधिकांश सूक्ति या केडीई डेस्कटॉप को उनकी आवश्यकता होगी। मई ubuntu-desktop-lxde-VNC परियोजना तुम वहाँ मदद करता है।
टॉन्चेक

11

Http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/ पर दिया गया समाधान कंटेनरों के अंदर से GUI एप्लिकेशन शुरू करने का एक आसान तरीका प्रतीत होता है (मैंने फ़ायरफ़ॉक्स के लिए प्रयास किया था। ubuntu 14.04 से अधिक) लेकिन मैंने पाया कि लेखक द्वारा पोस्ट किए गए समाधान के लिए एक छोटे से अतिरिक्त बदलाव की आवश्यकता है।

विशेष रूप से, कंटेनर को चलाने के लिए, लेखक ने उल्लेख किया है:

    docker run -ti --rm \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    firefox

लेकिन मैंने पाया कि (एक ही साइट पर एक विशेष टिप्पणी के आधार पर) दो अतिरिक्त विकल्प

    -v $HOME/.Xauthority:$HOME/.Xauthority

तथा

    -net=host 

ठीक से काम करने के लिए फ़ायरफ़ॉक्स के लिए कंटेनर चलाते समय निर्दिष्ट करने की आवश्यकता है:

    docker run -ti --rm \
    -e DISPLAY=$DISPLAY \
    -v /tmp/.X11-unix:/tmp/.X11-unix \
    -v $HOME/.Xauthority:$HOME/.Xauthority \
    -net=host \
    firefox

मैंने उस पृष्ठ और इन अतिरिक्त निष्कर्षों की जानकारी के साथ एक डॉक चित्र बनाया है: https://hub.docker.com/r/amanral/ubuntu-firefox/


3
मैंने पाया है कि आप /tmp/.X11-unixसॉकेट को बिलकुल भी पास नहीं करते हैं । यह सिर्फ बढ़ते .Xauthorityऔर के साथ काम करता है --net=host
CMCDragonkai

2
यह वास्तव में एकमात्र समाधान है जो इन दिनों काम करता है। /tmp/.X11-unixवॉल्यूम के रूप में उपयोग करना अब काम नहीं करता है, क्योंकि डॉक चुपचाप चिपचिपा निर्देशिका से वॉल्यूम माउंट को मना कर देता है।
ईसाई हुजेर

1
मुझे लगता है कि यह इस बात पर निर्भर करता है कि आप किस डिस्ट्रो का उपयोग कर रहे हैं। आप निश्चित रूप से XOS Unix सॉकेट को CentOS पर बांध सकते हैं। यह समझना भी महत्वपूर्ण है कि क्या --network=hostकरता है। यह आपके कंटेनर को होस्ट के नेटवर्क स्टैक तक पूर्ण पहुंच प्रदान करता है, जो अवांछनीय हो सकता है, यह इस बात पर निर्भर करता है कि आप क्या करने की कोशिश कर रहे हैं। यदि आप अपने डेस्कटॉप पर कंटेनरीकृत GUI चलाने के साथ छेड़छाड़ कर रहे हैं, तो यह कोई बात नहीं होनी चाहिए।
orodbhen

7

नहीं है एक और lord.garbage द्वारा समाधान VNC, SSH और X11 अग्रेषण का उपयोग किए बिना एक कंटेनर में रन जीयूआई क्षुधा करने के लिए। यहाँ भी इसका उल्लेख है।


1
यह बहुत अच्छा है अगर सुरक्षा चिंता का विषय नहीं है। यदि किसी चीज़ को डॉक करने के उद्देश्य इसे अलग करना है, तो कंटेनर से बाहर एक्स 11 से बचने के लिए इसका सबसे अच्छा है।
विल

7

यदि आप GUI एप्लिकेशन को बिना सिर के चलाना चाहते हैं, तो यहां पढ़ें । आपको जो करना है, वह है वर्चुअल मॉनिटर के साथ xvfbया अन्य समान सॉफ्टवेयर बनाना। यदि आप ब्राउज़रों के साथ उदाहरण के लिए सेलेनियम परीक्षण चलाना चाहते हैं तो यह बहुत उपयोगी है।

कहीं भी कुछ उल्लेख नहीं किया गया है कि कुछ सॉफ़्टवेयर वास्तव में लिनक्स कंटेनरों के साथ रेत-बॉक्सिंग का उपयोग करते हैं। उदाहरण के लिए यदि आप --privilegedकंटेनर चलाते समय उपयुक्त ध्वज का उपयोग नहीं करते हैं तो क्रोम सामान्य रूप से कभी नहीं चलेगा ।


6

मुझे पार्टी के लिए देर हो रही है, लेकिन मैक उपयोगकर्ताओं के लिए जो XQuartz पथ से नीचे नहीं जाना चाहते हैं, यहां एक कामकाजी उदाहरण है जो एक फेडोरा इमेज बनाता है, जिसमें डेस्कटॉप वातावरण (xfce) का उपयोग करके Xvfbऔर VNC। यह सरल है, और काम करता है:

एक मैक पर, आप स्क्रीन शेयरिंग (डिफ़ॉल्ट) एप्लिकेशन का उपयोग करके इसे एक्सेस कर सकते हैं , जिससे कनेक्ट हो रहा है localhost:5901

Dockerfile:

FROM fedora

USER root

# Set root password, so I know it for the future
RUN echo "root:password123" | chpasswd

# Install Java, Open SSL, etc.
RUN dnf update -y --setopt=deltarpm=false  \
 && dnf install -y --setopt=deltarpm=false \
                openssl.x86_64             \
                java-1.8.0-openjdk.x86_64  \
                xorg-x11-server-Xvfb       \
                x11vnc                     \
                firefox                    \
                @xfce-desktop-environment  \
 && dnf clean all

# Create developer user (password: password123, uid: 11111)
RUN useradd -u 11111 -g users -d /home/developer -s /bin/bash -p $(echo password123 | openssl passwd -1 -stdin) developer

# Copy startup script over to the developer home
COPY start-vnc.sh /home/developer/start-vnc.sh
RUN chmod 700 /home/developer/start-vnc.sh
RUN chown developer.users /home/developer/start-vnc.sh

# Expose VNC, SSH
EXPOSE 5901 22

# Set up VNC Password and DisplayEnvVar to point to Display1Screen0
USER developer
ENV  DISPLAY :1.0
RUN  mkdir ~/.x11vnc
RUN  x11vnc -storepasswd letmein ~/.x11vnc/passwd

WORKDIR /home/developer
CMD ["/home/developer/start-vnc.sh"]

start-vnc.sh

#!/bin/sh

Xvfb :1 -screen 0 1024x768x24 &
sleep 5
x11vnc -noxdamage -many -display :1 -rfbport 5901 -rfbauth ~/.x11vnc/passwd -bg
sleep 2
xfce4-session &

bash
# while true; do sleep 1000; done

यदि आप चाहते / चाहती हैं, तो बिल्ड और रन कमांड के लिए लिंक किए गए रीडमी की जांच करें ।


5

Jürgen Weigert के उत्तर के आधार पर , मुझे कुछ सुधार करना है:

docker build -t xeyes - << __EOF__
FROM debian
RUN apt-get update
RUN apt-get install -qqy x11-apps
ENV DISPLAY :0
CMD xeyes
__EOF__
XSOCK=/tmp/.X11-unix
XAUTH_DIR=/tmp/.docker.xauth
XAUTH=$XAUTH_DIR/.xauth
mkdir -p $XAUTH_DIR && touch $XAUTH
xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
docker run -ti -v $XSOCK:$XSOCK -v $XAUTH_DIR:$XAUTH_DIR -e XAUTHORITY=$XAUTH xeyes

अंतर केवल इतना है कि यह एक निर्देशिका $ XAUTH_DIR बनाता है, जिसका उपयोग $ XAUTH फ़ाइल रखने और $ XAUTH_DIR निर्देशिका को $ XAUTH फ़ाइल के बजाय docker कंटेनर में करने के लिए किया जाता है।

इस पद्धति का लाभ यह है कि आप /etc/rc.local में एक कमांड लिख सकते हैं जो $ XAUTH_DIR / tmp में एक खाली फ़ोल्डर बनाने के लिए है और इसके मोड को 777 में बदलना है।

tr '\n' '\000' < /etc/rc.local | sudo tee /etc/rc.local >/dev/null
sudo sed -i 's|\x00XAUTH_DIR=.*\x00\x00|\x00|' /etc/rc.local >/dev/null
tr '\000' '\n' < /etc/rc.local | sudo tee /etc/rc.local >/dev/null
sudo sed -i 's|^exit 0.*$|XAUTH_DIR=/tmp/.docker.xauth; rm -rf $XAUTH_DIR; install -m 777 -d $XAUTH_DIR\n\nexit 0|' /etc/rc.local

जब सिस्टम रीस्टार्ट होता है, उपयोगकर्ता लॉगिन से पहले, डॉकटर $ XAUTH_DIR निर्देशिका को स्वचालित रूप से माउंट करेगा यदि कंटेनर की पुनरारंभ नीति "हमेशा" है। उपयोगकर्ता लॉगिन के बाद, आप ~ / .profile में $ XAUTH फ़ाइल बनाने के लिए एक कमांड लिख सकते हैं, फिर कंटेनर स्वचालित रूप से इस $ XAUTH फ़ाइल का उपयोग करेगा।

tr '\n' '\000' < ~/.profile | sudo tee ~/.profile >/dev/null
sed -i 's|\x00XAUTH_DIR=.*-\x00|\x00|' ~/.profile
tr '\000' '\n' < ~/.profile | sudo tee ~/.profile >/dev/null
echo "XAUTH_DIR=/tmp/.docker.xauth; XAUTH=\$XAUTH_DIR/.xauth; touch \$XAUTH; xauth nlist \$DISPLAY | sed -e 's/^..../ffff/' | xauth -f \$XAUTH nmerge -" >> ~/.profile

बाद में, कंटेनर को सिस्टम के पुनरारंभ होने और उपयोगकर्ता लॉगिन पर हर बार Xauthority फ़ाइल मिल जाएगी।


4

अन्य समाधान काम करना चाहिए, लेकिन यहाँ एक समाधान है docker-compose

उस त्रुटि को ठीक करने के लिए, आपको docker में $ DISPLAY और .X11-unix पास करने की आवश्यकता है, साथ ही साथ उस उपयोगकर्ता को अनुदान दें जिसने xhost पर docker की पहुँच शुरू की है।

अंदर docker-compose.ymlफ़ाइल के :

version: '2'
services:
    node:
        build: .
        container_name: node
        environment:
            - DISPLAY
        volumes:
            - /tmp/.X11-unix:/tmp/.X11-unix

टर्मिनल या स्क्रिप्ट में:

  • xhost +si:localuser:$USER
  • xhost +local:docker
  • export DISPLAY=$DISPLAY
  • docker-compose up

3

Nvidia ड्राइवर के साथ OpenGL रेंडरिंग के लिए, निम्न छवि का उपयोग करें:

https://github.com/thewtex/docker-opengl-nvidia

अन्य ओपनजीएल कार्यान्वयनों के लिए, सुनिश्चित करें कि छवि का मेजबान के समान कार्यान्वयन है।


3

आप X11 डिस्प्ले तक पहुंचने के लिए डॉक उपयोगकर्ता (यहां: रूट) की अनुमति दे सकते हैं:

XSOCK=/tmp/.X11-unix
xhost +SI:localuser:root 
docker run -t -i --rm -v $XSOCK:$XSOCK:ro -e DISPLAY=unix$(DISPLAY) image 
xhost -SI:localuser:root

2

OSX (10.13.6, उच्च सिएरा)

@ निक के जवाब के समान है , लेकिन उसका समाधान मेरे काम नहीं आया।

पहले कर के brew install socatसोसाइट को स्थापित करें, और XQuartz ( https://www.xquartz.org/ ) स्थापित करें

इसके बाद इन चरणों का पालन करें ( http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/ ) टिप्पणी अनुभाग में:

1. in one mac terminal i started:

socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

2. and in another mac terminal I ran:

docker run -ti --rm \
-e DISPLAY=$(ipconfig getifaddr en0):0 \
-v /tmp/.X11-unix:/tmp/.X11-unix \
firefox

मैं अपने डेबियन डॉकटर कंटेनर से भी CLion लॉन्च करने में सक्षम था।


1

BRIDGE नेटवर्क के साथ डॉकर। Ubuntu 16.04 के लिए प्रदर्शन प्रबंधक lightdm के साथ:

cd /etc/lightdm/lightdm.conf.d
sudo nano user.conf

[Seat:*]
xserver-allow-tcp=true
xserver-command=X -listen tcp

आप अधिक निजी अनुमतियों का उपयोग कर सकते हैं

xhost +

docker run --volume="$HOME/.Xauthority:/root/.Xauthority:rw" --env="DISPLAY=$HOST_IP_IN_BRIDGE_NETWORK:0" --net=bridge $container_name

1

यदि आपने पहले ही चित्र बनाया है, तो एक और उत्तर:

  1. आह्वान docker w / o sudo ( docker को ठीक कैसे करें: अनुमति से इनकार किया गया मुद्दा )

  2. होस्ट और कंटेनर के बीच समान USER और घर और पासवार्ड साझा करें (टिप्स: उपयोगकर्ता नाम के बजाय उपयोगकर्ता आईडी का उपयोग करें)

  3. ड्राइवर पर निर्भर काम करने के लिए देव फ़ोल्डर अच्छी तरह से काम करने के लिए

  4. प्लस X11 आगे।

    docker run --name=CONTAINER_NAME --network=host --privileged \
      -v /dev:/dev \
      -v `echo ~`:/home/${USER} \
      -p 8080:80 \
      --user=`id -u ${USER}` \
      --env="DISPLAY" \
      --volume="/etc/group:/etc/group:ro" \
      --volume="/etc/passwd:/etc/passwd:ro" \
      --volume="/etc/shadow:/etc/shadow:ro" \
      --volume="/etc/sudoers.d:/etc/sudoers.d:ro" \
      --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
      -it REPO:TAG /bin/bash

आप पूछ सकते हैं कि अगर बहुत सी चीजें समान हैं, तो docker के उपयोग की क्या बात है? ठीक है, एक कारण जो मैं सोच सकता हूं वह है पैकेज डिप्रेशन नरक ( https://en.wikipedia.org/wiki/Dencyency.hell) को पार करना ) ।

इसलिए इस प्रकार का उपयोग डेवलपर मेरे विचार से अधिक उपयुक्त है।


यह केवल एक है जो मेरे लिए काम करेगा। अपने उद्देश्यों के लिए, मैं इसे इसे कम करने में सक्षम था: docker run --network = host --volume = echo ~: / home / $ {USER} --user = id -u ${USER}--env = "DISPLAY" --volume = "/ etc / passwd: / etc / passwd: ro "
-it REPO

1

मैं एक USB कैमरा का उपयोग करने से एक वीडियो स्ट्रीम चलाने में कामयाब opencvमें dockerइन चरणों का पालन करके:

  1. डॉकटर एक्स सर्वर तक पहुँचने दें

    xhost +local:docker
    
  2. X11 यूनिक्स सॉकेट और X प्रमाणीकरण फ़ाइल बनाएँ

    XSOCK=/tmp/.X11-unix
    XAUTH=/tmp/.docker.xauth
    
  3. उचित अनुमतियाँ जोड़ें

    xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
    
  4. Qt रेंडरिंग स्पीड को "नेटिव" पर सेट करें, इसलिए यह X11 रेंडरिंग इंजन को बाईपास नहीं करता है

    export QT_GRAPHICSSYSTEM=native
    
  5. Qt को MIT-SHM (साझा मेमोरी) का उपयोग नहीं करने के लिए कहें - इस तरह से इसे सुरक्षा-वार भी सुरक्षित होना चाहिए

    export QT_X11_NO_MITSHM=1
    
  6. Docker run कमांड को अपडेट करें

    docker run -it \
               -e DISPLAY=$DISPLAY \
               -e XAUTHORITY=$XAUTH \
               -v $XSOCK:$XSOCK \
               -v $XAUTH:$XAUTH \
               --runtime=nvidia \
               --device=/dev/video0:/dev/video0 \
               nvcr.io/nvidia/pytorch:19.10-py3
    

नोट: जब आप प्रोजेक्ट पूरा करते हैं, तो उनके डिफ़ॉल्ट मान पर पहुंच नियंत्रण लौटाएं - xhost -local:docker

अधिक जानकारी: डॉक के साथ GUI का उपयोग करना

क्रेडिट: वास्तविक समय और वीडियो प्रसंस्करण वस्तु का पता लगाने का उपयोग करके Tensorflow, OpenCV और Docker


"एक्स 11 यूनिक्स सॉकेट और एक्स ऑथेंटिकेशन फ़ाइल बनाएं" क्या कोई फाइल नहीं बनाता है, यह सिर्फ चर को परिभाषित करता है?
MrR
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.