আপনি কি ডকার পাত্রে জিইউআই অ্যাপ্লিকেশনগুলি চালনা করতে পারেন?


408

আপনি কীভাবে ডকার পাত্রে জিইউআই অ্যাপ্লিকেশনগুলি চালাতে পারেন ?

vncserverফায়ারফক্স বলতে চারপাশে একটি অতিরিক্ত স্পিডবাম্প স্যান্ডবক্স যুক্ত করুন - উদাহরণস্বরূপ - এমন কোনও চিত্র রয়েছে যা সেট আপ হয়েছে বা এমন কোনও কিছু রয়েছে যা আপনি করতে পারেন?


এই প্রশ্নটি কেবল লিনাক্সের সাথে সম্পর্কিত বলে মনে হয় (বয়স এবং উত্তরগুলির সামগ্রীর উপর ভিত্তি করে) এবং উইন্ডোজ নয়। যদি তা হয় তবে আমরা কি এটি পরিষ্কার করতে শিরোনাম সম্পাদনা করতে পারি? ধন্যবাদ
UuDdLrLrSs


উত্তর:


238

আপনি কেবল ফায়ারফক্সের সাথে একটি ভিএনসিভার সার্ভার ইনস্টল করতে পারেন :)

আমি একটি চিত্র, ভিএনসি / ফায়ারফক্স এখানে ঠেলেছি: 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'

এটি পাসওয়ার্ড সহ ভিএনসি চালিত একটি ডকার ধারক তৈরি করবে 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
এটিকে দূর থেকে দেখার জন্য আমি কীভাবে কোনও ভিএনসি ক্লায়েন্ট ব্যবহার করব? আইপি + পোর্টে টাইপ করা কাজ করছে বলে মনে হচ্ছে না।
ব্যবহারকারী94154

17
প্রথমে, আপনার বরাদ্দকৃত বন্দরটি পরীক্ষা করতে হবে ( docker inspect <container id>কেবল বা কেবলমাত্র docker ps, তারপরে আপনি সন্ধান পেয়েছেন এমন বন্দরের সাথেই আপনি আপনার হোস্টের
আইপ-

9
ক্রেইকফায়ারফক্স-ভিএনসি চিত্রটি ত্রুটির সাথে ব্যর্থ হয়েছে: ভিএনসি পাসওয়ার্ড প্রবেশ করান: স্টটি: স্ট্যান্ডার্ড ইনপুট: ডিভাইস ফিজেটগুলির জন্য অনুপযুক্ত আইওএসটিএল: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই: স্ট্যান্ডার্ড ইনপুট: ডিভাইস x11vnc -usepw এর জন্য অনুপযুক্ত ioctl: ব্যবহারের জন্য একটি পাসওয়ার্ড খুঁজে পেল না।
alfonsodev

6
ডকার ভাল ব্যবহার করুন> ডকার ফ্যাবিওরেহম.com
ডেনিস সি

7
কোনও ব্যবহারকারীর নাম নেই, পাসওয়ার্ডটি উত্তরে স্পষ্টভাবে নির্দেশিত এবং কোনও ভিএনসি ক্লায়েন্ট তা করবে। আমার ক্ষেত্রে, আমি নেটিভ অসক্সটি পছন্দ করি। (সন্ধানকারী থেকে, কমান্ড + কে টিপুন এবং
ভিএনসি

195

Xauthority নতুন সিস্টেমে একটি সমস্যা হয়ে ওঠে। আমি আমার ডকারের পাত্রে চালানোর আগে xhost + এর সাথে কোনও সুরক্ষা বাতিল করতে পারি, বা আমি একটি ভাল প্রস্তুত Xauthority ফাইলে পাস করতে পারি। সাধারণ Xauthority ফাইলগুলি হোস্টনাম নির্দিষ্ট। ডকারের সাথে, প্রতিটি ধারকের আলাদা আলাদা হোস্টের নাম থাকতে পারে (ডকার রান -h এর সাথে সেট করা), তবে এমনকি হোস্ট সিস্টেমের সাথে কনটেইনারটির হোস্টনামটি সেট করা আমার ক্ষেত্রে সহায়তা করতে পারেনি। xeyes (আমি এই উদাহরণটি পছন্দ করি) কেবল ম্যাজিক কুকিকে উপেক্ষা করে সার্ভারে কোনও শংসাপত্র সরবরাহ করবে না। সুতরাং আমরা একটি ত্রুটি বার্তা পেয়েছি 'কোনও প্রোটোকল নির্দিষ্ট করা যায় না প্রদর্শনটি খুলতে পারে না'

Xauthority ফাইলটি এমনভাবে লেখা যেতে পারে যাতে হোস্টনামের বিষয়টি বিবেচনা না করে। আমাদের প্রমাণীকরণ পরিবারকে 'ফ্যামিলিওয়াল্ড' এ সেট করতে হবে। আমি নিশ্চিত নই, যদি এর জন্য xauth এর একটি সঠিক কমান্ড লাইন থাকে, তবে এখানে একটি উদাহরণ যা জাওথ এবং সেডের সাথে এটি করার জন্য সংযুক্ত করে। আমাদের তালিকাভুক্ত ফলাফলের প্রথম 16 টি বিট পরিবর্তন করতে হবে। ফ্যামিলিওয়াল্ডের মান 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
পাইটর আলেকসান্দার চমিলোভস্কি

2
@ পাইওটরএলিক্সান্ডার চেমেলিওস্কি যা আমার পক্ষে কাজ করেনি, ডকার সংস্করণ 1.12.0, 8eab29e তৈরি করুন
tbc0

14
@Dirk: আপনি প্রতিস্থাপন করতে চান পারে :0সঙ্গে $DISPLAY। তার মানে xauth nlist $DISPLAY | ...এবং docker run -ti -e DISPLAY=$DISPLAY ...। সাধারণত এক্স ডিসপ্ল থাকে :0তবে সর্বদা হয় না (এবং বিশেষত আপনি যদি এসএসএক্স-এক্স এর মাধ্যমে সংযুক্ত হন তবে তা নয়)।
jhndodo

4
উবুন্টুতে 16.04 xauth অনুমতি /tmp/.docker.xauthনিয়ে ফাইলটি তৈরি করে 600। এর ফলে ডকার পাত্রে ফাইলটি পড়তে পারা যায় না inside আপনি xauth listডকারের ধারক মধ্যে চালিয়ে যাচাই করতে পারেন । আমি এটিকে সমাধান করার chmod 755 $XAUTHজন্য xauth nlist :0 | ...কমান্ডের পরে যুক্ত করেছি ।
আবাই

2
@ আবাই কেন ৪৫৪ বা 4৪৪ ব্যবহারের জন্য 755 ব্যবহার করা যথেষ্ট?
ড্যানিয়েল অ্যাল্ডার

68

আমি এই ব্লগের এন্ট্রিটি সবেমাত্র পেয়েছি এবং এটি এখানে আপনার সাথে ভাগ করতে চাই কারণ আমার মনে হয় এটি করা সবচেয়ে ভাল উপায় এবং এটি এত সহজ।

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

পেশাদাররা:
+ ডকার পাত্রে কোনও এক্স সার্ভার স্টাফ
নেই + কোনও ভিএনসি ক্লায়েন্ট / সার্ভারের প্রয়োজন নেই
+ এক্স ফরোয়ার্ডিংয়ের সাথে কোনও এসএসএস নেই
+ আরও ছোট ডকার পাত্রে

কনস:
- হোস্টে এক্স ব্যবহার করা (নিরাপদ-স্যান্ডবক্সিংয়ের জন্য নয়)

যদি লিঙ্কটি কোনও দিন ব্যর্থ হয় তবে আমি এখানে সবচেয়ে গুরুত্বপূর্ণ অংশটি
রেখেছি: ডকফায়াইল:

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"

ইঙ্গিত: অডিওর জন্য একবার দেখুন: https://stackoverflow.com/a/28985715/2835523


আমি কীভাবে উইন্ডোজ 7 এ এটি করতে পারি? আমার কি এক্স সার্ভার ইনস্টল করা দরকার?
ওয়াকসিসিসন

3
এখানে বেশিরভাগ উত্তর হিসাবে এটি কেবল আমার ইউনিক্সে প্রযোজ্য - যতক্ষণ না উইন্ডোজ এক্স সার্ভার উইন্ডো সিস্টেম সমর্থন করে।
এ। বিঞ্জজএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্সএক্স

আপনি কি মনে করেন যে আমি যদি উইন্ডোজে এক্স সার্ভার ইনস্টল করেছি বা এমনকি আমার ডকারের ধারকটিতে একটি এক্স সার্ভার বান্ডিল করেছি তবে এটি কাজ করতে পারে?
ওয়াকসিংসন

1
আমি মনে করি ফোল্ডারটি apt-get -y install sudoতৈরি করতে আপনাকে ডকফাইফায়লে ইনস্টল করতে হবে /etc/sudoers.d
mulg0r

1
এটি কোনও হোস্টের সাথে এক্স-এ সংযোগের অনুমতি দেওয়ার প্রয়োজন হতে পারে$ xhost +
ব্যান্ডুজগুলি

52

ডকার ডেটা ভলিউমের সাহায্যে ধারকটির ভিতরে xorg এর ইউনিক্স ডোমেন সকেটটি প্রকাশ করা খুব সহজ।

উদাহরণস্বরূপ, এর মতো একটি ডকফায়াইল সহ:

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 +জন্য হোস্টটিতে ব্যবহার করুন।
টুলি

3
@ কেবলমাত্র xhost +localপ্রয়োজনীয় ~/.Xauthorityফাইলটি ধারকটিতে উপলব্ধ করা আরও ভাল হবে , সুতরাং এটি নিজেই প্রমাণীকরণ করতে পারে।
আরেহ লাইব বৃষ

3
আপনি কি এটি ম্যাক (বুট 2 ডকার ব্যবহার করে) এ কাজ করতে সক্ষম হয়েছেন?
কার্ল ফোনার

4
এটি আমার আগে উবুন্টু ১৪.০৪ ল্যাপটপে ডকারের সাথে 1.5 দিয়ে ল্যাপটপে কাজ করার চেয়ে সুন্দরভাবে কাজ করছিল; তবে এখন আমার জন্য উবুন্টু 15.04, ডকার 1.6.2 এ ত্রুটি সহ ব্যর্থ হচ্ছে Can't open display: :0। কোন ধারনা?
cboettig

6
আমি xhost +si:localuser:$USERকেবল ব্যবহারকারীটিকে ধারকটি শুরু করার অনুমতি দিয়েছিলাম।
নিক ব্রেন

26

আপনি সাবউসারটি ব্যবহার করতে পারেন: https://github.com/timthelion/subuser

এটি আপনাকে অনেক গুই অ্যাপসকে ডকারে প্যাকেজ করতে দেয়। ফায়ারফক্স এবং ইমাকগুলি এখনও পর্যন্ত পরীক্ষা করা হয়েছে। ফায়ারফক্সের সাথে, ওয়েবজিএল যদিও কাজ করে না। ক্রোমিয়াম মোটেও কাজ করে না।

সম্পাদনা: শব্দ কাজ!

সম্পাদনা 2: যেহেতু আমি প্রথমবার এটি পোস্ট করেছি, তখন সাবউসারটি অনেক বেড়েছে। এক্সপিআরএ ব্রিজিংয়ের মাধ্যমে এক্স 11 এর সাথে সংযোগের জন্য আমার কাছে এখন একটি সাবউসার.আরগ আপ এবং একটি নতুন সুরক্ষা মডেল রয়েছে ।


3
দয়া করে নোট করুন যে সাবসারটি এখনও খুব নতুন এবং অপেক্ষাকৃত অনির্দিষ্ট। আপনি যদি কোনও সমস্যায় পড়ে থাকেন তবে দয়া করে বাগ রিপোর্ট জমা দিন!
টিমথেলিয়ন

আপনার যদি কোনও উপায় থাকে তবে আমি এক্স 11 এড়াতে চাই। আপনার হত্যাকারী অ্যাপ্লিকেশনটি টক প্রক্সটিকে ডকারে চালাচ্ছে এবং একটি শিশু ডকারে প্লাগইন সহ একটি সম্পূর্ণ ব্রাউজার চালাচ্ছে যেমন ফায়ারওয়ালিং ইত্যাদি টর ডকারের মাধ্যমে সমস্ত নেটওয়ার্ককে বাইরে বের করে দেয়। ওয়েব ব্যবহারযোগ্যতার জন্য এটি বর্তমান টর ব্রাউজারের বান্ডিলের চারপাশে চলবে কারণ আপনি ধনী সামগ্রীর মধ্য দিয়ে যেতে পারেন।
উইল

1
এক্স 11 সুরক্ষা নিয়ে আপনার কি সমস্যা? বা আপনি কি উইন্ডো দিয়ে এটি কাজ করতে চান? অথবা আপনি এটি দূরবর্তী থেকে কাজ করতে চান? উপরের সবগুলো? আমি মনে করি যে ভিএনসি দিয়ে এই কাজটি করা বেশ সম্ভব (যদিও আমি এটি ডিফল্ট পদ্ধতিতে করব না কারণ এটি ভিএনসি'র উপর নির্ভরতা যুক্ত করে)। দূরবর্তীভাবে subuser কাজ করা সত্যিই সম্ভব / অর্থপূর্ণ নয়। এছাড়াও এটি রয়েছে: github.com/rogaha/docker-desktop তবে বাগ রিপোর্ট থেকে মনে হয় xpra বাস্তব জীবনে অযোগ্য হতে পারে।
টিমথিলিও

24

ওএসএক্স

জর্জেন ওয়েগার্টের সবচেয়ে ভাল উত্তর রয়েছে যা উবুন্টুতে আমার পক্ষে কাজ করেছিল, তবে ওএসএক্স-এ, ডকার ভার্চুয়ালবক্সের অভ্যন্তরে চলে এবং তাই সমাধানটি আরও কিছু কাজ না করেই কাজ করে না।

আমি এই অতিরিক্ত উপাদান সঙ্গে এটি কাজ পেয়েছি:

  1. Xquartz (ওএসএক্স আর এক্স 11 সার্ভার সহ জাহাজ নেই)
  2. সকেটের সাথে সকেট ফরোয়ার্ডিং
  3. ধারক আরম্ভ করার জন্য বাশ স্ক্রিপ্ট

আমি ওএসএক্সের জন্য এই উত্তরটি উন্নত করতে ব্যবহারকারীর মন্তব্যের প্রশংসা করব, এক্স এর জন্য সকেট ফরোয়ার্ডিং নিরাপদ কিনা তা আমি নিশ্চিত নই, তবে আমার উদ্দেশ্যটি কেবল স্থানীয়ভাবে ডকারের ধারক চালানোর জন্য।

এছাড়াও, স্ক্রিপ্টটি কিছুটা নাজুক যাতে আমাদের স্থানীয় ওয়্যারলেস থাকা অবস্থায় মেশিনের আইপি ঠিকানা পাওয়া সহজ নয় তাই এটি সর্বদা কিছু এলোমেলো আইপি থাকে।

আমি ধারকটি চালু করতে 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

আমি এই পদ্ধতির সাথে কাজ করে জিজ এবং ম্যাটপ্ল্লিটিব পেতে সক্ষম।

উইন্ডোজ 7+

মোবাএক্সটারমের সাথে উইন্ডোজ 7+ এ এটি কিছুটা সহজ:

  1. উইন্ডোজের জন্য মোবাএক্সটার্ম ইনস্টল করুন
  2. মোবাএক্সটারম শুরু করুন
  3. কনফিগার এক্স সার্ভার: সেটিংস -> ব্যবহারে X11 (ট্যাব) -> সেট ব্যবহারে X11 রিমোট অ্যাক্সেস করার জন্য পূর্ণ
  4. ধারক আরম্ভ করতে এই বেস স্ক্রিপ্টটি ব্যবহার করুন

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

@ ডিলার আমি জিআইটি ব্যবহার করে উইন্ডোতে সফ্টওয়্যার বিকাশ করি, তাই আমার কাছে জিআইটি-ব্যাশ শেল উপলব্ধ available
নিক

আমি পদক্ষেপ অনুসরণ। তবে, আমি পেয়েছি error: XDG_RUNTIME_DIR not set in the environment.এবং Error: cannot open display: VAIO:0.0। আপনি কি এই জাতীয় কিছু মুখোমুখি?
ব্যবহারকারী 3275095

1
ব্যবহারকারীর সন্ধান পাওয়া যাচ্ছিল না বলে সম্পর্কিত একটি ত্রুটি পেয়েছি অর্থাৎ "পাসডাব্লুডিতে কোনও মিল নেই" কোনও লিডস?
ওয়াকসিংসন

19

হোস্ট ডিসপ্লে ভাগ করে নেওয়া: 0, অন্য কয়েকটি উত্তরে যেমন বলা হয়েছে, তার দুটি ত্রুটি রয়েছে:

  • কিছু এক্স সুরক্ষা ফাঁসের কারণে এটি ধারক বিচ্ছিন্নতা ভেঙে দেয়। উদাহরণস্বরূপ, কীলগিং সহ xevবা xinputসম্ভব, এবং এর সাথে হোস্ট অ্যাপ্লিকেশনগুলির রিমোট কন্ট্রোল xdotool
  • এক্স এক্সটেনশন এমআইটি-এসএমএম-এর জন্য ভাগ করা মেমরি হারিয়ে যাওয়ার কারণে অ্যাপ্লিকেশনগুলিতে রেন্ডারিং গ্লিটস এবং খারাপ র‍্যাম অ্যাক্সেস ত্রুটি থাকতে পারে। (বিচ্ছিন্নতা অবমাননার বিকল্পের সাথেও স্থির করা যেতে পারে --ipc=host)।

এই সমস্যাগুলিকে সম্বোধন করে জিফায়ারে ডকার চিত্র চালানোর জন্য উদাহরণ স্ক্রিপ্টের নীচে।

  • এটি ডক্সার অ্যাপ্লিকেশনগুলি নেস্টেড এক্স সার্ভারে চালিত হওয়ায় এটি X সুরক্ষা ফাঁসকে এড়িয়ে চলে।
  • এমআইটি-এসএইচএম র‌্যামের অ্যাক্সেস ব্যর্থতা এড়াতে অক্ষম করা হয়েছে।
  • কনটেইনার সুরক্ষা উন্নত করা হয় --cap-drop ALL --security-opt no-new-privileges। এছাড়াও ধারক ব্যবহারকারী মূল নয়
  • এক্সফির প্রদর্শনে অ্যাক্সেস সীমাবদ্ধ করতে একটি এক্স কুকি তৈরি করা হয়েছে।

স্ক্রিপ্টটি কিছু আর্গুমেন্টের প্রত্যাশা করে, প্রথমে একটি হোস্ট উইন্ডো ম্যানেজারটি এক্সেফায়ারে চালিত হবে, দ্বিতীয়টি একটি ডকার চিত্র, allyচ্ছিকভাবে একটি চিত্র কমান্ড কার্যকর করার জন্য তৃতীয়। ডকারে একটি ডেস্কটপ পরিবেশ চালাতে হোস্ট উইন্ডো ম্যানেজারের পরিবর্তে ":" ব্যবহার করুন।

জাফির উইন্ডোটি বন্ধ করে ডকারের ধারক অ্যাপ্লিকেশনগুলি সমাপ্ত করে। ডকরেড অ্যাপ্লিকেশনগুলি সমাপ্তি 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

এই স্ক্রিপ্টটি এক্স 11 ডকার উইকিতে রক্ষণাবেক্ষণ করা হয় । আরও উন্নত স্ক্রিপ্টটি এক্স 11 ডকার যা জিপিইউ ত্বরণ, ওয়েবক্যাম এবং প্রিন্টার ভাগ করে নেওয়ার মতো বৈশিষ্ট্যগুলিকে সমর্থন করে।


18

এখানে একটি হালকা ওজনের সমাধান যা ধারকটিতে কোনও Xসার্ভার, vncসার্ভার বা sshdডেমন ইনস্টল করা এড়ানো হবে । এটি সরলতায় কী লাভ করে তা সুরক্ষা এবং বিচ্ছিন্নতায় হারিয়ে যায়।

এটা তোলে ধরে নেয় যে আপনি ব্যবহার হোস্ট মেশিনে সংযোগ sshসঙ্গে X11ফরওয়ার্ডিং।

ইন sshdহোস্ট কনফিগারেশন, লাইন যোগ

X11UseLocalhost no

যাতে হোস্টের ফরোয়ার্ড এক্স সার্ভার পোর্টটি সমস্ত ইন্টারফেসে (কেবল নয় lo) এবং বিশেষত ডকার ভার্চুয়াল ইন্টারফেসে খোলা থাকে docker0

ধারকটি যখন চালানো হয় তখন .Xauthorityফাইলটিতে অ্যাক্সেসের প্রয়োজন হয় যাতে এটি সার্ভারের সাথে সংযোগ স্থাপন করতে পারে। এটি করার জন্য, আমরা হোস্টের হোম ডিরেক্টরিতে নির্দেশিত একটি পঠনযোগ্য কেবলমাত্র ভলিউম সংজ্ঞায়িত করি (সম্ভবত কোনও বুদ্ধিমান ধারণা নয়!) এবং সেই XAUTHORITYঅনুযায়ী চলকটি সেটও করি ।

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

এটি পর্যাপ্ত নয়, আমাদের হোস্টের কাছ থেকেও ডিসপ্লে ভেরিয়েবলটি পাস করতে হবে, তবে আইপি দ্বারা হোস্টের নামটি প্রতিস্থাপন করতে হবে:

-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
আপনি বরং ধারক মধ্যে পুরো home ডিরেক্টরিতে মাউন্ট করা চান তাহলে আপনি শুধু মাউন্ট করতে .Xauthorityফাইল নিজেই: -v $HOME/.Xauthority:/root/.Xauthority -e XAUTHORITY=/root/.Xauthority
রবার্ট হেইনেস

2
পরিবর্তনের পরিবর্তে X11UseLocalhost, আপনি কমান্ডের --net=hostজন্য অতিরিক্ত বিকল্পও ব্যবহার করতে পারেন docker run( এখানে পাওয়া যাবে )।
ingomueller.net

--net=hostএখনই খারাপ ধারণা, আপনি যদি পাত্রে কোনও পোর্ট খোলেন তবে এটি
হোস্টেও

16

জার্গেন ওয়েগার্টের উত্তর মূলত এই সমাধানটি জুড়ে দেওয়ার পরে , সেখানে কী বর্ণনা করা হচ্ছে তা প্রথমে আমার কাছে পরিষ্কার ছিল না। সুতরাং আমি এটি গ্রহণ করব, যদি অন্য কারও স্পষ্টতার প্রয়োজন হয়।

প্রথমে, সম্পর্কিত ডকুমেন্টেশনটি হ'ল এক্স সুরক্ষা ম্যানপেজ

অসংখ্য অনলাইন উত্স কেবল এক্স 11 ইউনিক্স সকেট এবং ~/.Xauthorityফাইলটি ধারকটিতে মাউন্ট করার পরামর্শ দেয় । এই সমাধানগুলি প্রায়শই ভাগ্যের ভিত্তিতে কাজ করে, কেন এটি বোঝা যায় না, যেমন ধারক ব্যবহারকারী ব্যবহারকারীর মতো একই ইউআইডি দিয়ে শেষ হয়, সুতরাং যাদু কী অনুমোদনের প্রয়োজন নেই।

প্রথমে, Xauthority ফাইলের 0600 মোড রয়েছে, সুতরাং ধারক ব্যবহারকারী এটির ইউআইডি না থাকলে এটি পড়তে সক্ষম হবে না।

এমনকি আপনি ধারকটিতে ফাইলটি অনুলিপি করে রেখেছেন, এবং মালিকানা পরিবর্তন করলেও আরও একটি সমস্যা আছে। আপনি যদি xauth listএকই Xauthorityফাইল সহ হোস্ট এবং ধারক চালনা করেন তবে আপনি তালিকাভুক্ত বিভিন্ন এন্ট্রি দেখতে পাবেন। এর কারণ xauthএটি চালিত হয় তার উপর নির্ভর করে এন্ট্রিগুলিকে ফিল্টার করে।

ধারকটির এক্স ক্লায়েন্ট (যেমন জিইউআই অ্যাপ্লিকেশন) এর মতো আচরণ করবে 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। যেমন দেখানো হয়েছে তেমন একটি ফাঁকা ফাইল তৈরি করুন এবং কুকি যুক্ত করুন।

জার্জেন ওয়েজার্টের উত্তরটি FamilyWildহোস্টে একটি নতুন কর্তৃপক্ষ ফাইল তৈরি করতে এবং কনটেইনারটিতে অনুলিপি করতে সংযোগের ধরণটি ব্যবহার করে এটি পেয়ে যায়। মনে রাখবেন এটি ~/.Xauthorityব্যবহার করা থেকে বর্তমান এক্স সেশনের জন্য হেক্স কীটি প্রথম বের করে xauth nlist

সুতরাং প্রয়োজনীয় পদক্ষেপগুলি হ'ল:

  • ব্যবহারকারীর বর্তমান এক্স সেশনের জন্য কুকির হেক্স কীটি বের করুন।
  • ধারক হোস্টনাম এবং ভাগ করা হেক্স কী (বা FamilyWildসংযোগের ধরণের সাথে একটি কুকি তৈরি করুন ) সহ ধারকটিতে একটি নতুন Xauthority ফাইল তৈরি করুন ।

আমি স্বীকার করি যে আমি কীভাবে FamilyWildকাজ করি তা খুব ভালভাবে বুঝতে পারি না xauthবা এক্স ক্লায়েন্টরা Xauthority ফাইল থেকে কোথায় চলে তা নির্ভর করে এন্ট্রি ফিল্টার করে। এটি সম্পর্কে অতিরিক্ত তথ্য স্বাগত।

আপনি যদি আপনার ডকার অ্যাপটি বিতরণ করতে চান তবে আপনার ধারকটি চালানোর জন্য একটি প্রারম্ভিক স্ক্রিপ্টের প্রয়োজন হবে যা ব্যবহারকারীর এক্স সেশনের জন্য হেক্স কী পেয়েছে এবং এটি আগে বর্ণিত দুটি উপায়ের মধ্যে একটিতে ধারকটিতে আমদানি করে।

অনুমোদন প্রক্রিয়াটির যান্ত্রিকতাগুলি বুঝতে এটি সহায়তা করে:

  • ধারকটিতে চলমান একটি এক্স ক্লায়েন্ট (অর্থাত্ জিইউআই অ্যাপ্লিকেশন) কুকি প্রবেশের জন্য Xauthority ফাইলে দেখেন যা ধারকটির হোস্টনাম এবং এর মানটির সাথে মেলে $DISPLAY
  • যদি কোনও মিলে যাওয়া এন্ট্রি পাওয়া যায়, তবে এক্স ক্লায়েন্টটি /tmp/.X11-unixকনটেইনারটিতে মাউন্ট করা ডিরেক্টরিতে উপযুক্ত সকেটের মাধ্যমে X সার্ভারের কাছে অনুমোদনের অনুরোধের সাথে এটি পাস করে ।

দ্রষ্টব্য: এক্স 11 ইউনিক্স সকেটটি এখনও পাত্রে মাউন্ট করা দরকার, অথবা ধারকটির এক্স সার্ভারে কোনও রুট থাকবে না। বেশিরভাগ বিতরণ সুরক্ষা কারণে ডিফল্টরূপে X সার্ভারে টিসিপি অ্যাক্সেস অক্ষম করে।

অতিরিক্ত তথ্যের জন্য এবং এক্স ক্লায়েন্ট / সার্ভার সম্পর্ক কীভাবে কাজ করে তা আরও ভালভাবে উপলব্ধি করতে, এসএসএইচ এক্স ফরোয়ার্ডিংয়ের উদাহরণটি দেখার পক্ষে এটি সহায়ক:

  • রিমোট মেশিনে চলমান এসএসএইচ সার্ভারটি তার নিজস্ব এক্স সার্ভারটি অনুকরণ করে।
  • এটি $DISPLAYএসএসএইচ সেশনে এর নিজস্ব এক্স সার্ভারের দিকে নির্দেশ করার জন্য মানটি সেট করে ।
  • এটি xauthরিমোট হোস্টের জন্য একটি নতুন কুকি তৈরি করতে ব্যবহার করে এবং এটি Xauthorityস্থানীয় এবং দূরবর্তী ব্যবহারকারীদের জন্য ফাইলগুলিতে যুক্ত করে adds
  • জিইউআই অ্যাপ্লিকেশনগুলি শুরু করা হলে তারা এসএসএইচের এমুলেটেড এক্স সার্ভারের সাথে কথা বলে।
  • এসএসএইচ সার্ভার আপনার স্থানীয় ডেস্কটপে এসএসএইচ ক্লায়েন্টের কাছে এই ডেটা ফরোয়ার্ড করে।
  • স্থানীয় এসএসএইচ ক্লায়েন্ট আপনার ডেস্কটপে চলমান এক্স সার্ভার সেশনে ডেটা প্রেরণ করে, যেন এসএসএইচ ক্লায়েন্টটি আসলে একটি এক্স ক্লায়েন্ট (অর্থাত্ জিইউআই অ্যাপ্লিকেশন)।
  • এক্স সার্ভারটি আপনার ডেস্কটপে জিইউআই রেন্ডার করতে প্রাপ্ত ডেটা ব্যবহার করে।
  • এই এক্সচেঞ্জের শুরুতে, রিমোট এক্স ক্লায়েন্ট সদ্য তৈরি হওয়া কুকিটি ব্যবহার করে একটি অনুমোদনের অনুরোধও প্রেরণ করে। স্থানীয় এক্স সার্ভার এটির স্থানীয় অনুলিপিটির সাথে তুলনা করে।

12

এটি হালকা ওজনের নয় তবে এটি একটি দুর্দান্ত সমাধান যা সম্পূর্ণ ডেস্কটপ ভার্চুয়ালাইজেশন সহ ডকার বৈশিষ্ট্য সমতা দেয়। এক্সফেস 4 বা উবুন্টু এবং সেন্টোস কাজের জন্য আইসডাব্লুএম উভয়ই কাজ করে এবং noVNCবিকল্পটি ব্রাউজারের মাধ্যমে সহজেই অ্যাক্সেসের ব্যবস্থা করে।

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

এটি এর vncserver noVNCপাশাপাশি চালিত হয় tigerVNC। তারপরে এটি startxপ্রদত্ত উইন্ডো ম্যানেজারের জন্য কল করে । এছাড়াও, libnss_wrapper.soব্যবহারকারীর জন্য পাসওয়ার্ড পরিচালনা অনুকরণ করতে ব্যবহৃত হয়।


কেউ কি এই পরীক্ষা করেছে?
guilhermecgs

3
@ guilhermecgs হ্যাঁ, এবং ভাল কাজ করে। এর পর থেকে আমি xpraডকারেও চেষ্টা করেছিলাম , যা রুট-কম এক্স xprathe সর্বোত্তম উপযুক্ত আইএমও এবং ভিএনসির চেয়ে দক্ষ more
ছদ্মবেশী

কেবল পরিষ্কার করার জন্য ... আমার এই চিত্রটি সহ একটি সম্পূর্ণ ডেস্কটপ অভিজ্ঞতা (জিনোম, কেডিএ) থাকতে পারে?
guilhermecgs

আমি কেবল এক্সফেস 4 এবং আইসডাব্লুএম চেষ্টা করেছি (যা সেই রেপোতে রয়েছে)। অবশ্যই অভিজ্ঞতাটি সীমাবদ্ধ থাকবে, উদাহরণস্বরূপ মাউন্টিং ডিভাইসগুলি ডেস্কটপে প্রদর্শিত হবে না (জিভিএফএস) আপনি ডকারে না --device /dev/...গিয়ে প্রয়োজনীয় --capসুযোগসুবিধা স্থাপন না করলেই । এটি ধারণার উদ্দেশ্যকে পরাস্ত করে, তবে আপনি ডিভাইসগুলির মধ্য দিয়ে যেতে পারেন। কিছু টুইট করার মাধ্যমে এটি সম্ভব হওয়া উচিত আমি ভিএনসির অধীনে জিনোম / কেডিএ চালানোর বিশ্বাস করি। আমি এনভিডিয়া কার্ডগুলির সাথে ডকারে একাধিক এক্স দৌড়েছি (কোনও ভিএনসি বা এক্সপ্রা নেই), তাই এটি অবশ্যই কার্যকর।
ছদ্মবেশী

আমরা এ পর্যন্ত চেষ্টা করে দেখিনি। এটির মধ্যে সবচেয়ে বড় চ্যালেঞ্জটি হ'ল একটি ওয়ার্কিং ডি-বাস ডিমন আনা। বেশিরভাগ জিনোম বা কে-ডি-ই ডেস্কটপগুলির প্রয়োজন হবে। মে উবুন্টু ডেস্কটপ-LXDE-VNC প্রকল্পের তুমি সেখানে সাহায্য করে।
toschneck

11

Http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/ এ দেওয়া সমাধানটি কনটেইনারগুলির ভিতরে থেকে জিইউআই অ্যাপ্লিকেশন শুরু করার একটি সহজ উপায় বলে মনে হচ্ছে না (আমি ফায়ারফক্সের জন্য চেষ্টা করেছি) ওবুন্টু ১৪.০৪ এর বেশি) তবে আমি দেখতে পেয়েছি যে লেখক পোস্ট করা সমাধানটিতে একটি অতিরিক্ত অতিরিক্ত পরিবর্তন প্রয়োজন।

বিশেষত, ধারক চালানোর জন্য, লেখক উল্লেখ করেছেন:

    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
সিএমসিডিগ্রাগনকাই

2
এটি আসলে একমাত্র সমাধান যা এই দিনগুলিতে কাজ করে। /tmp/.X11-unixভলিউম হিসাবে ব্যবহার করা আর কাজ করে না, কারণ ডকার চুপচাপ স্টিকি ডিরেক্টরিগুলি থেকে ভলিউম মাউন্টগুলি অস্বীকার করে।
ক্রিশ্চিয়ান হুজার

1
আমি মনে করি এটি আপনি কী ডিস্ট্রো ব্যবহার করছেন তার উপর নির্ভর করে। আপনি অবশ্যই সেন্টোস-এ এক্স 11 ইউনিক্স সকেটটি বাঁধতে পারবেন। এটি কী --network=hostকরে তা বোঝাও গুরুত্বপূর্ণ । এটি হোস্টের নেটওয়ার্ক স্ট্যাকটিতে আপনার ধারককে সম্পূর্ণ অ্যাক্সেস দেয় যা আপনি যা করার চেষ্টা করছেন তার উপর নির্ভর করে অনাকাঙ্ক্ষিত হতে পারে। আপনি যদি কেবল আপনার ডেস্কটপে কনটেইনারযুক্ত জিইউআই চালানোর সাথে ঝাঁকুনি দিচ্ছেন তবে তা বিবেচনা করা উচিত নয়।
orodbhen

7

নেই অন্য lord.garbage দ্বারা সমাধান VNC- র, ssh ও X11 ফরওয়ার্ডিং ব্যবহার না করেই একটি কন্টেইনারে রান গুই অ্যাপ্লিকেশানে। এটি এখানেও উল্লেখ করা হয়েছে


1
সুরক্ষা কোনও উদ্বেগ না থাকলে এটি দুর্দান্ত। যদি কোনও বিষয়কে ডকিং করার উদ্দেশ্যগুলি এটিকে আলাদা করা হয় তবে ধারকটির অভ্যন্তরে এক্স 11 এড়ানো ভাল।
উইল

7

আপনি যদি কোনও জিইআইআই অ্যাপ্লিকেশন শিরোনামহীন চালাতে চান তবে এখানে পড়ুন । আপনাকে যা করতে হবে তা হ'ল ভার্চুয়াল মনিটর xvfbবা অন্যান্য অনুরূপ সফ্টওয়্যার তৈরি করা। আপনি ব্রাউজারগুলির সাথে উদাহরণস্বরূপ সেলেনিয়াম পরীক্ষা চালাতে চাইলে এটি খুব সহায়ক।

কোথাও উল্লেখ করা হয়নি এমন কিছু হ'ল কিছু সফ্টওয়্যার আসলে লিনাক্সের ধারকগুলির সাথে বালি-বক্সিং ব্যবহার করে। সুতরাং উদাহরণস্বরূপ, আপনি যদি ধারকটি চালনার সময় উপযুক্ত পতাকা ব্যবহার না করেন তবে Chrome কখনই স্বাভাবিকভাবে চলবে না --privileged


6

আমি পার্টিতে দেরি করেছি, তবে ম্যাক ব্যবহারকারীরা যারা এক্সকিয়ার্টজ পাথ যেতে চান না তাদের জন্য এখানে একটি কার্যকরী উদাহরণ যা ডেস্কটপ এনভায়রনমেন্ট (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

জর্জেন ওয়েগার্টের উত্তরের ভিত্তিতে আমার কিছুটা উন্নতি হয়েছে:

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 যা place XAUTH ফাইল স্থাপন করতে ব্যবহৃত হয় এবং ock XAUTH_DIR ডিরেক্টরিটি ock XAUTH ফাইলের পরিবর্তে ডকার পাত্রে রাখে।

এই পদ্ধতির সুবিধাটি হ'ল আপনি /etc/rc.local এ একটি কমান্ড লিখতে পারেন যা / tmp এ $ XAUTH_DIR নামে একটি ফাঁকা ফোল্ডার তৈরি করতে হবে এবং এর মোডটি 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

সিস্টেমটি পুনরায় চালু হওয়ার সাথে সাথে, ব্যবহারকারী লগইন করার আগে ডকারটি container XAUTH_DIR ডিরেক্টরিটি স্বয়ংক্রিয়ভাবে মাউন্ট করবে যদি কনটেইনারটির পুনঃসূচনা নীতিটি "সর্বদা" থাকে। ব্যবহারকারীর লগইন করার পরে, আপনি ~ /। প্রোফাইলে একটি কমান্ড লিখতে পারেন যা $ 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

এই ত্রুটিটি ঠিক করতে, আপনাকে ডকারে to DISPLAY এবং .X11-unix পাস করতে হবে, পাশাপাশি xhost এ ডকার অ্যাক্সেস শুরু করা ব্যবহারকারীকে মঞ্জুরি দিতে হবে।

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

এনভিডিয়া ড্রাইভারের সাথে ওপেনজিএল রেন্ডারিংয়ের জন্য, নিম্নলিখিত চিত্রটি ব্যবহার করুন:

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

অন্যান্য ওপেনজিএল বাস্তবায়নের জন্য, নিশ্চিত করুন যে চিত্রটির হোস্টের মতোই বাস্তবায়ন রয়েছে।


3

আপনি ডকার ব্যবহারকারীকে (এখানে: মূল) এক্স 11 ডিসপ্লে অ্যাক্সেসের অনুমতি দিতে পারবেন:

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

ওএসএক্স (10.13.6, উচ্চ সিয়েরা)

অনুরূপ @Nick আমার জন্য এর উত্তর, কিন্তু তার সমাধান কাজ করে নি।

প্রথমে কাজ করে সোকাট ইনস্টল করুন এবং এক্সকোয়ার্টজ brew install socatইনস্টল করুন ( 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

আমি আমার ডিবিয়ান ডকার কনটেইনার থেকেও ক্লিওন চালু করতে সক্ষম হয়েছি।


1

ব্রিজ নেটওয়ার্ক সহ ডকার ডিসপ্লে ম্যানেজার লাইটডিএম সহ উবুন্টু 16.04 এর জন্য:

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. ডকার ডাব্লু / ও সুডো ( ডকার ঠিক করতে কিভাবে: অনুমতি পাওয়ার বিষয়টি অস্বীকার করা হয়েছে )

  2. হোস্ট এবং ধারক ভাগের মধ্যে একই ব্যবহারকারী এবং বাড়ি এবং পাসডব্লু শেয়ার করুন (টিপস: ব্যবহারকারীর নামের পরিবর্তে ব্যবহারকারীর আইডি ব্যবহার করুন)

  3. ড্রাইভার নির্ভর libs ভাল কাজ করার জন্য ডেভ ফোল্ডার

  4. প্লাস এক্স 11 এগিয়ে।

    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

আপনি জিজ্ঞাসা করতে পারেন, এত কিছু যদি একই রকম হয় তবে ডকার ব্যবহার করার কী দরকার? ভাল, আমি যে কারণটি ভাবতে পারি তা হ'ল প্যাকেজ হ্রাসকারী জাহান্নামকে কাটিয়ে উঠা ( https://en.wikedia.org/wiki/D dependency_hell )।

সুতরাং এই ধরণের ব্যবহার বিকাশকারীদের পক্ষে আমার পক্ষে বেশি উপযুক্ত।


এটিই কেবল আমার জন্য কাজ করবে। আমার উদ্দেশ্যগুলির জন্য, আমি এটি এটিকে হ্রাস করতে সক্ষম হয়েছি: ডকার রান - নেট ওয়ার্ক = হোস্ট --ভলিউম = echo ~: / হোম / $} id -u ${USER}ইউজার } - ব্যবহারকারী = --env = "DISPLAY" --volume = "/ ইত্যাদি / পাসডাব্লুড: / ইত্যাদি / পাসডব্লিউড: রো "
-ইটিআরপিও

1

আমি একজন ইউএসবি ক্যামেরা ব্যবহার থেকে একটি ভিডিও স্ট্রিম চালানোর জন্য পরিচালিত opencvমধ্যে dockerএই পদক্ষেপগুলি অনুসরণ করে:

  1. ডকারকে এক্স সার্ভারটি অ্যাক্সেস করতে দিন

    xhost +local:docker
    
  2. এক্স 11 ইউনিক্স সকেট এবং এক্স প্রমাণীকরণ ফাইল তৈরি করুন

    XSOCK=/tmp/.X11-unix
    XAUTH=/tmp/.docker.xauth
    
  3. যথাযথ অনুমতি যুক্ত করুন

    xauth nlist $DISPLAY | sed -e 's/^..../ffff/' | xauth -f $XAUTH nmerge -
    
  4. Qt রেন্ডারিং গতি "নেটিভ" তে সেট করুন, সুতরাং এটি এক্স 11 রেন্ডারিং ইঞ্জিনটিকে বাইপাস করবে না

    export QT_GRAPHICSSYSTEM=native
    
  5. কিউটি কে এমআইটি-এসএইচএম (ভাগ করা মেমরি) ব্যবহার না করতে বলুন - সেভাবে এটি সুরক্ষা-ভিত্তিকও হওয়া উচিত

    export QT_X11_NO_MITSHM=1
    
  6. ডকার রান কমান্ড আপডেট করুন

    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

আরও বিশদ: ডকের সাথে জিইউআই ব্যবহার করা

ক্রেডিট: টেনসরফ্লো, ওপেনসিভি এবং ডকার ব্যবহার করে রিয়েল-টাইম এবং ভিডিও প্রসেসিং অবজেক্ট সনাক্তকরণ


"এক্স 11 ইউনিক্স সকেট এবং এক্স প্রমাণীকরণ ফাইল তৈরি করুন" ডোজি কোনও ফাইল তৈরি করে না, এটি কেবল ভেরিয়েবল সংজ্ঞা দেয়?
মিঃআর
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.