Docker 컨테이너 내부에서 Java GUI 애플리케이션을 실행하는 데 문제가 있어서 xeyes처럼 데스크탑에 표시되지 않습니다.
제가 취하고 있는 단계는 다음과 같습니다.
Unity 세션에서 실제 머신에 로그인하고 터미널을 열고 다음 명령을 실행했습니다.
root@prod:~# echo $DISPLAY
:0
root@prod:~# ls /tmp/.X11-unix/
X0 X1024
그런 다음 VPN으로 이동하여 SSH를 통해 호스트(이름:호스트-A).
내부에서 xeyes를 실행할 수 있습니다.호스트-A그런 다음 눈이 Unity에 나타나서 X 전달이 작동할 수 있도록 마우스를 따라갔습니다.
a@host-a$ echo $DISPLAY
localhost:10.0
a@host-a$ sudo netstat -anutp | grep 60
tcp 0 0 127.0.0.1:6010 0.0.0.0:* LISTEN 21988/6
tcp 0 0 127.0.0.1:6011 0.0.0.0:* LISTEN 22182/14
tcp6 0 0 ::1:6010 :::* LISTEN 21988/6
tcp6 0 0 ::1:6011 :::* LISTEN 22182/14
이내에호스트-A, 그런 다음 docker를 사용하여 Java 애플리케이션이 포함된 이미지를 실행합니다.
a@host-a$ sudo docker run --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -ti repo/image bash`
출력은 다음과 같습니다
root@7722f3167495:/# echo $DISPLAY
localhost:11.0
그런 다음 Java 애플리케이션을 실행하려고 하면 다음이 제공됩니다.
java.awt.AWTError: Can't connect to X11 window server using 'localhost:11.0' as the value of the DISPLAY variable.
저도 동일 DISPLAY
하게 설정해 보았습니다. 로컬 컴퓨터만 있는 것으로 나타났습니다.10.0
제품소켓을 포함합니다 /tmp/.x11-unix
. 컨테이너와호스트-A원하지 않는다.
X 세션이 설정되지 않는 이유에 대한 제안을 주시면 감사하겠습니다.
답변1
이 접근법은 가능성이 낮습니다.
X11 소켓 파일은 로컬 연결에만 사용되며 워크스테이션에서만 액세스할 수 있습니다. 거기에서 TCP입니다.
SSH 및 X11Forwarding을 사용하여 SSH를 서버 호스트-A로 사용했기 때문에 워크스테이션과 서버 간에 TCP 연결이 생성되었습니다. TCP X11인 서버에 있으면 "localhost:10"이 표시됩니다. 워크스테이션의 SSH 클라이언트는 그곳에서 .X11 unix 소켓 파일로 트래픽을 전달합니다. localhost:11 디스플레이가 어디서 왔는지는 잘 모르겠지만 SSH 전달과도 관련이 있습니다. SSH 홉을 한 개만 만들었나요, 아니면 두 개만 만들었나요?
워크스테이션에서 직접 TCP 수신을 활성화하면 더 많은 성공을 거둘 수 있습니다.
docker run .... -e DISPLAY=<workstation-ip-address>:0
그러나 "xauth" 오류가 발생할 수도 있습니다.
xauth 명령을 사용하여 인증 토큰을 서버의 홈 디렉터리로 내보낸 다음 이를 docker 볼륨으로 마운트하여 컨테이너가 토큰에 액세스할 수 있도록 할 수 있습니다. 또한 다음의 docker 명령에서 XAUTHORITY 환경 변수를 설정할 수도 있습니다. xauth 파일을 내보냈습니다. 또는 컨테이너 내에서 xauth를 사용하여 토큰을 가져옵니다.
gitbub에서 Azureus를 실행하는 오래된 샘플 Docker 컨테이너가 있습니다. 링크를 찾을 수 있는지 알아보겠습니다.
컨테이너에 VNC 서버를 추가하고 컨테이너의 vnc 세션에서 Java 애플리케이션을 시작한 다음 vnc를 사용하여 워크스테이션에서 연결하는 것이 훨씬 쉬운 경우도 있습니다.
또는 도커 호스트에서 vnc 서버를 실행하고 도커 '-net 호스트'를 사용하여 호스트 네트워크 스택을 공유하고 컨테이너에서 DISPLAY=:5900을 사용하고 VNC 디스플레이 호스트 -a:0에서 워크스테이션에 연결할 수 있습니다. 이렇게 하면 컨테이너에 VNC 패키지를 추가할 필요가 없습니다.