X11 über eine SSH-Verbindung an den Host des Containers weiterleiten?

4318
M-Pixel

Ich möchte eine containerisierte GUI-Anwendung von einem Remote-Computer aus ausführen.

Ich möchte dieses Problem nicht lösen, indem ich dem Container einen ssh-Host hinzufüge

  • Ich habe bereits über SSH Zugriff auf die Hostmaschine
  • Dies führt zu unnötigem Aufwand
  • Dadurch ist der Container zwischen Remote- und lokaler Verwendung nicht portierbar

Ich kann GUI-Apps bereits erfolgreich auf dem Host ausführen, jedoch nicht innerhalb des Containers. Dies sind die Schritte, die ich bisher gemacht habe:

Wirt

  • xauth + (nicht für längere Zeit, aber nützlich, um mögliche Probleme zu beseitigen)
  • docker-usermit UID 501000 auf Host == docker-usermit UID 1000 in Container über Namespace-Funktion
  • .XauthorityDatei in den docker-userHome-Ordner kopiert

Dockerfile

  • Basierend auf Alpin
  • Installiert xauthund zu Testzweckenxterm
  • Erstellt docker-usermit der richtigen UID / GID

Docker komponieren

  • Umgebungsvariable DISPLAYweitergeleitet in
  • Volumen /home/docker-user/:/home/docker-user/:rozum Bereitstellen eines .XauthorityCookies
  • Volume /tmp/.X11-unix:/tmp/.X11-unix:rofür den Zugriff auf X11-Sockets
  • Führt den Befehl aus su - docker-user -c "export DISPLAY=$DISPLAY && xterm"
    • su verwendet, um als zu laufen docker-user
    • DISPLAYin den suKontext weitergeleitet

Leider reicht das noch nicht. Während sich xterm auf dem Host-Betriebssystem ohne Probleme mit meinem lokalen X-Server verbindet, sagt xterm im Container Xt error: Can't open display: localhost:10.0.

Ich habe bestätigt, dass "localhost: 10.0" korrekt ist, localhost im Container vorhanden ist /etc/hostsund der Cookie und der Socket es mit den richtigen Berechtigungen durchsetzen.

Was könnte sonst noch schief gehen?

4

3 Antworten auf die Frage

3
pale bone

Es sieht so aus, als würden Sie alles tun, was ich auch mache, außer Sie teilen die .Xauthority zum Zeitpunkt der Containererstellung. Das heißt, wenn Sie nach dem Erstellen des Containers einmal ssh -X auf Ihrem Computer installiert haben, ist die .Xauthority nicht mehr gültig. Sie können ssh -X nicht von einem anderen Terminal in den gleichen Computer einbinden und die .Xauthority verwenden. Ssh -X ändert die .Xauthority jedes Mal für das neueste Terminal. Ich habe es nur zum Laufen gebracht, indem ich die .Xauthority jedes Mal kopiere, wenn ich ssh -X auf meinen Computer stelle und den Bildschirm mit meinem Container teilen möchte.

Hinweis: Ich teile ein Gerät und eine Rechner-ID, weil ich eine Webcam-Ausgabe weitergeleitet habe

1.Erstellen Sie den Container und weisen Sie xhost an, die Weiterleitung von der Container-ID zuzulassen:

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. Kopieren Sie .Xauthority vom Host-Verzeichnis in das sharedDockerFiles-Verzeichnis:

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

3. Starten Sie Ihren Container und befestigen Sie ihn

4. Kopieren Sie die .Xauthority in Ihrem freigegebenen Ordner in die Startseite Ihres Containers

sudo cp /root/sharedDockerFiles/.Xauthority ~/ 

5. (einmalig erforderlich): Bearbeiten Sie / etc / ssh / ssh_config des Containers unter Host *, um Folgendes aufzunehmen:

 ForwardX11 yes X11Forwarding yes 

6. Starten Sie den Container neu und fügen Sie die GUI-App erneut hinzu

7. Wenn Sie immer noch Probleme haben, stellen Sie sicher, dass die Variable $ DISPLAY im Container mit der des Hosts identisch ist

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
Jure S

Kopieren Sie .Xauthority zu Beginn der SSH-Sitzung in den Container, bevor Sie die GUI verwenden:

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

Dann können Sie DISPLAY übergeben, wenn Sie 'docker exec' verwenden. ZB um neue Bash zu öffnen:

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

2 weitere mögliche Fehlerursachen: (zusätzlich zur akzeptierten Antwort)

  • grundlegend: Sie haben keinen SSH-Server oder Xauth im Container (für Ubuntu-Run 'apt install openssh-server xauth')

  • sneaky one: Wenn sich der Hostname des Containers von dem des Hosts unterscheidet (z. B. über -h-Badge in 'docker run'), wird der Fehler angezeigt, und Sie müssen damit umgehen (z. B. denselben Hostnamen setzen oder Cookie hinzufügen.) xauth)

Diese Lösung hat für mich funktioniert. Anscheinend genügte es, die .Xauthority-Datei einfach in den Docker-Container zu kopieren, ohne sie neu starten zu müssen. Nikolay Frick vor 5 Jahren 0
0
psh

Beginnen wir mit dem Docker mit der Option --net = host. Dadurch wird für den Container derselbe Netzwerkstapel des Hosts angezeigt.

Zum Beispiel,

Docker-Run --net = Host --rm -ti -u myid -e DISPLAY = "$ DISPLAY" -v /tmp/.X11-unix:/tmp/.X11-unix image: tag BINARY