저는 몇 가지 Java 데스크톱 애플리케이션을 작성했고 Docker를 사용하여 컨테이너를 실행하면 컨테이너에 대해 배울 수 있다고 생각했습니다.
우분투 이미지가 있는 Docker 컨테이너에 Java 애플리케이션을 넣었습니다. 그때 GUI가 내 컴퓨터의 I/O를 작동/액세스하려면 Docker에 내 DISPLAY 변수에 대한 액세스 권한을 부여해야 한다는 것을 깨달았습니다. 연결되면 Docker 컨테이너를 실행하고 컴퓨터 화면에 GUI 팝업이 나타나는 것을 볼 수 있습니다.
이것이 내가 혼란스러워지기 시작하는 곳입니다. VirtualBox에서 데스크톱 GUI를 실행하면 가상 머신에 있는 GUI를 볼 수 있습니다. 그런 다음 가상 머신 I/O를 로컬 컴퓨터의 I/O에 연결하는 스마트 장치가 있습니다. 이것은 나에게 의미가 있습니다.
하지만 Docker는 어떻게 GUI를 실제 컴퓨터로 다시 가져오나요? 컨테이너를 실행하면 (virtualbox와 같은 가상 머신이 아닌) 실제 컴퓨터에서 GUI를 볼 수 있습니다. 그러나 GUI 자체는 호스트에서 어떻게 렌더링됩니까? 호스트와 I/O를 공유할 때 Docker에는 GUI 파일을 호스트로 다시 보내 GUI를 표시할 수 있는 권한이 있습니까? 아니면 우분투 이미지를 사용하여 컨테이너를 생성할 때 기본적으로 가상 머신을 생성하는 것인가요?
답변1
Linux를 사용하는 경우 docker에 /tmp/.X11-unix를 마운트하면(시작 명령의 옵션: -v /tmp/.X11-unix:/tmp/.X11-unix) 모든 GUI 유형을 표시할 수 있습니다. , 다른 옵션은 없습니다. 이 파일을 docker와 공유하면 모든 종류의 GUI가 허용됩니다.
이 작업을 수행하지 않으려면 일반 Linux 사용자로 xhost+ 명령을 입력한 다음 Docker에서 내보내기 DISPLAY=IP:0.0을 사용할 수 있습니다(또는 필요한 모든 것이 있지만 로컬에서도 IP는 127.0.0.1이 될 수 없음). .
xhost+에서는 모든 호스트를 허용하고 DISPLAY를 내보내 "원격" 시스템에서 디스플레이를 공유할 수 있습니다.
Windows 로컬 호스트에서 docker를 실행하면 기본적으로 모든 포트가 열려 있지만 Windows 바탕 화면에 Ubuntu를 표시하려면 특정 Xserver가 필요합니다(VcXsrv는 Visual C++ 2012로 컴파일된 특정 X Server이므로 친구입니다). 내보내기는 GUI를 시작하기 전에 DISPLAY=IP:0.0을 발행해야 합니다.