SSH 연결을 통해 X11을 컨테이너 호스트로 전달 하시겠습니까?


4

원격 컴퓨터에서 컨테이너화 된 GUI 응용 프로그램을 실행하고 싶습니다.

컨테이너에 ssh 호스트를 추가 하여이 문제를 해결하고 싶지 않습니다.

  • 이미 SSH를 통해 호스트 시스템에 액세스 할 수 있습니다
  • 불필요한 오버 헤드를 추가합니다
  • 그것은 원격과 로컬 사용 사이에서 컨테이너를 이식 할 수 없게 만듭니다.

이미 호스트에서 GUI 앱을 성공적으로 실행할 수 있지만 컨테이너 내에서는 불가능합니다. 다음은 지금까지 수행 한 단계입니다.

숙주

  • xauth + (장기간은 아니지만 가능한 문제를 제거하는 데 유용합니다)
  • docker-user호스트에서 uid 501000으로 == docker-user네임 스페이스 기능을 통해 컨테이너에서 uid 1000으로
  • .Xauthoritydocker-user홈 폴더로 복사 된 파일

도커 파일

  • 알파인 기반
  • xauth테스트 목적으로 설치 및xterm
  • docker-user적절한 UID / GID로 생성

도커 작성

  • DISPLAY전달 된 환경 변수
  • 볼륨 /home/docker-user/:/home/docker-user/:ro제공하기 위해 .Xauthority쿠키를
  • /tmp/.X11-unix:/tmp/.X11-unix:roX11 소켓 액세스를 제공하는 볼륨
  • 명령을 실행합니다 su - docker-user -c "export DISPLAY=$DISPLAY && xterm"
    • su 로 실행하는 데 사용 docker-user
    • DISPLAYsu맥락으로 전달

불행히도 아직 충분하지 않습니다. 호스트 OS의 xterm이 문제없이 로컬 X 서버에 연결되는 동안 컨테이너의 xterm은라고 말합니다 Xt error: Can't open display: localhost:10.0.

"localhost : 10.0"이 정확하고 localhost가 컨테이너에 /etc/hosts있고 쿠키와 소켓이 올바른 권한으로 통과하고 있음을 확인했습니다.

또 무엇이 잘못 될 수 있습니까?

답변:


5

컨테이너를 만들 때 .Xauthority를 ​​공유하는 것을 제외하고는 내가하고있는 것과 똑같은 일을하는 것처럼 보입니다. 즉, 컨테이너를 만든 후 컴퓨터에 -X를 ssh하면 .Xauthority는 더 이상 유효하지 않습니다. 다른 터미널에서 동일한 시스템으로 ssh -X를 ssh 할 수 없으며 .Xauthority를 ​​사용하여 돌아 가면 ssh -X는 최신 터미널에 대해 .Xauthority를 ​​매번 변경합니다. 내 컴퓨터에 -X를 ssh 할 때마다 .Xauthority를 ​​복사하고 화면을 컨테이너와 공유하려고 시도하면 작동합니다.

참고 : 웹캠 출력을 전달했기 때문에 장치와 컴퓨터 ID를 공유하고 있습니다.

1. 컨테이너를 만들고 xhost에게 컨테이너 ID에서의 전달을 허용하도록 지시하십시오.

sudo docker run -it -d \
    --net=host \
    --env="DISPLAY" \
    --env="QT_X11_NO_MITSHM=1" \
    --volume="/tmp/.X11-unix:/tmp/.X11-unix:rw" \
    --device="/dev/video0:/dev/video0" \
    --volume="/path/to/your/sharedDockerFiles:/root/sharedDockerFiles" \
    --volume="/etc/machine-id:/etc/machine-id" \
    yourdockerrepo/image:tag \
    bash
export containerId=$(docker ps -l -q)
sudo xhost +local:`sudo docker inspect --format='{{ .Config.Hostname }}' $containerId`
sudo docker start $containerId

2. .Xauthority를 ​​호스트 홈에서 sharedDockerFiles 디렉토리로 복사하십시오.

sudo cp ~/.Xauthority /path/to/your/sharedDockerFiles

3. 컨테이너를 시작하고 부착하십시오

4. 공유 폴더의 .Xauthority를 ​​컨테이너 홈에 복사하십시오.

sudo cp /root/sharedDockerFiles/.Xauthority ~/

5. (필요한 한 번) : Host * 아래에서 컨테이너의 / etc / ssh / ssh_config를 편집하여 다음을 포함합니다.

   ForwardX11 yes
   X11Forwarding yes

6. 컨테이너를 다시 시작하고 GUI 앱을 다시 연결하고 실행하십시오.

7. 그래도 문제가 지속되면 컨테이너의 $ DISPLAY 변수가 호스트의 변수와 동일한 지 확인하십시오

echo $DISPLAY #do this in the container
exit
echo $DISPLAY #do this in the host, should be the same as container's
#if they aren't equal, start container and:
export DISPLAY= #put the output of your host's $DISPLAY variable here

1

GUI를 사용하기 전에 ssh 세션 시작시 컨테이너에 .Xauthority를 ​​복사하십시오.

sudo docker exec -i container_name bash -c 'cat > ~/.Xauthority' < ~/.Xauthority

그런 다음 'docker exec'를 사용하는 경우 DISPLAY를 전달할 수 있습니다. 예를 들어 새 배쉬를 열려면 :

sudo docker exec -it --env="DISPLAY" container_name bash

오류에 대한 2 가지 가능한 원인 : (허용 된 답변 외에)

  • 기본 : 컨테이너에 ssh 서버 또는 xauth가 없습니다 (ubuntu의 경우 'apt install openssh-server xauth'를 실행하십시오)

  • 몰래 하나 : 컨테이너 호스트 이름호스트 와 다른 경우 (예 : 'docker run'에서 -h 배지를 통해 설정) 오류가 발생하고이를 처리해야합니다 (예 : 동일한 호스트 이름 설정 또는 쿠키 추가) xauth)


이 솔루션은 저에게 효과적이었습니다. 분명히 .Xauthority 파일을 다시 시작하지 않고도 docker 컨테이너에 복사하는 것으로 충분했습니다.
Nikolay Frick

0

--net = host 옵션으로 docker를 시작하겠습니다. 컨테이너가 호스트의 동일한 네트워크 스택을 볼 수있게합니다.

예를 들어

docker run --net = host --rm -ti -u myid -e DISPLAY = "$ DISPLAY"-v /tmp/.X11-unix:/tmp/.X11-unix image : tag BINARY

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.