Linux mint 18 서버(X11 실행)에 ssh를 연결하고 docker 컨테이너에 로그인한 후 iPython matplotlib 플롯을 로컬 클라이언트(또한 mint)에 전달하고 싶습니다. 모두 로컬 네트워크에 있습니다.
내가 찾은 가장 가까운 질문은 다음과 같습니다.https://stackoverflow.com/questions/25281992/alternatives-to-ssh-x11-forwarding-for-docker-containers
-e DISPLAY=$DISPLAY
다음으로 명령에 전달된 옵션을 통해 docker에서 로컬 컴퓨터의 모니터(ei, mint 서버)로 플로팅 GUI를 출력할 수 있습니다 docker run
. 또한 -X
SSH를 통해 서버에 연결하여 xeyes
클라이언트 창을 가져올 수도 있습니다.
그러나 옵션을 사용하여 서버에 SSH로 연결 -X
하고 실행 중인 컨테이너에 로그인 하면 -DISPLAY=localhost or client IP
여전히 클라이언트 시스템에서 플롯을 가져올 수 없습니다.
이 문제를 해결하기 위해 VNC를 사용할 수 있다는 것을 알고 있습니다. 하지만 X11 전달을 올바르게 사용하는 방법은 무엇입니까?
답변1
작동하려면 다음 문제를 해결해야 합니다.
- X 응용 프로그램은 X 서버를 찾을 수 있습니다
- SSH의 경우 터널이 필요합니다(/etc/ssh/sshd_config의 "ssh -X" 및 "X11Forwarding yes").
- 주소는 $DISPLAY에 있어야 합니다(-e 사용). Docker 컨테이너 내에서 볼 수 있듯이 "localhost"를 Docker 호스트의 실제 IP 주소로 바꿔야 합니다.
- X 응용 프로그램은 X 서버와 통신할 수 있는 권한이 있습니다.
- xauth 매직 쿠키를 Docker 컨테이너에 전파
- Docker 호스트에서 X11 포트용 Docker 컨테이너까지 모든 방화벽 포트를 엽니다.
- SSH 서버가 원격 IP에서 X11 TCP 연결을 허용하도록 구성되었는지 확인하십시오.
이를 수행하는 방법에 대한 자세한 내용은 StackOverflow에 대한 내 질문(및 답변)을 참조하세요.https://stackoverflow.com/questions/48235040/run-x11-application-in-a-docker-container-reliously-on-a-server-connected-via-ssh
답변2
원격 Docker 컨테이너에서 GUI 애플리케이션을 실행하려면 서버에서 X11 전달이 필요하지 않습니다. X11 서버가 TCP:6000을 수신하도록 하고 -e DISPLAY=$IP:0
$IP가 X11 서버를 실행하는 컴퓨터의 IP 주소인 경우 원격 도커 컨테이너를 실행할 수 있습니다.
원격 우분투에 원격 도커 컨테이너를 표시하기 위해 Macbook에서 작동하는 XQuarz를 사용했습니다.
Macbook에서 socat을 사용하여 X11 서버가 다음과 같이 TCP를 수신하도록 합니다.Docker를 사용하여 Mac OS X에서 GUI 실행.
원격 우분투에서
docker run -it --rm -e DISPLAY=$macbook_ip:0 fr3nd/xeyes
그러면 Macbook에 xeyes가 표시됩니다.
답변3
Python 모듈도커x이 문제를 해결하는 것을 목표로 합니다.
이를 설치하고 실행할 수 있습니다.
python3 -m pip install dockerx --user
X11 지원 컨테이너를 실행하려면 다음 안내를 따르세요.
$ python3 -m dockerx.run --image ubuntu --command 'sleep infinity'
To get a container terminal run: docker exec -it b05bd722477e /bin/bash
To kill the container run: docker kill b05bd722477e
To remove the container run: docker rm b05bd722477e
$ docker exec -it b05bd722477e /bin/bash
root@b05bd722477e:/# apt update && apt install -y x11-apps
root@b05bd722477e:/# xclock
그러면 xclock
화면에 해당 내용이 표시됩니다.
CUDA 지원이 필요한 경우(시스템에 Docker NVIDIA Runtime을 설치해야 함) 다음 명령을 사용하여 컨테이너를 시작합니다.
$ python3 -m dockerx.run --image nvidia/cuda:11.0-base --nvidia 1 --command 'sleep infinity'
도커xX11UseLocalhost no
에 옵션을 설정 하려면 원격 시스템에서 실행 중인 SSH 서버가 필요합니다 /etc/ssh/sshd_config
.
자세한 내용은 다음을 확인하세요.dockerx Python 모듈용 GitHub.
답변4
컨테이너:
cp /etc/ssh/sshd_config /etc/ssh/sshd_config_bak
sed -i "s/^.*X11Forwarding.*$/X11Forwarding yes/" /etc/ssh/sshd_config
sed -i "s/^.*X11UseLocalhost.*$/X11UseLocalhost no/" /etc/ssh/sshd_config
grep "^X11UseLocalhost" /etc/ssh/sshd_config || echo "X11UseLocalhost no" >> /etc/ssh/sshd_config
고객:
ssh -X user@ip
인용하다: