在通过无头 Ubuntu 服务器进行 SSH 隧道连接时,从 Docker 容器显示 Android Studio GUI

Display Android Studio GUI from Docker container while SSH tunneling through headless Ubuntu server

我有一个无头 Ubuntu 服务器 (19.04),我想 运行 一个 Docker 容器,其唯一目的是 运行ning Android 工作室。 Ubuntu 服务器没有任何 GUI;它只是严格的命令行。我目前在通过 SSH 隧道连接到 Ubuntu 服务器的 Ubuntu VM (18.04) 上,该隧道通过另一个 SSH 隧道连接到我的 Home_Router:

ssh admin@Home_Router -L 22222:10.0.0.2:22
ssh user@localhost -p 22222

隧道图基本上是这样的:

     Me
 (Ubuntu_VM)                    Home_Router         Ubuntu_SVR
--------------                --------------      --------------
|            |   {INTERNET}   |            |      |            |
|            ----------------->22          |      |            |
|       22222>==============================------>22          |
|            |                |            |      |            |
--------------                --------------      --------------
                                                     10.0.0.2

Docker 容器基于 Alpine Linux 并安装了 Android Studio,以及 coreutilsopenjdk8-jrexorg-server.当我 运行 容器时:

docker run -it -v "$HOME/.Xauthority:/root/.Xauthority:rw" --env DISPLAY="$DISPLAY" --net=host --rm android-studio

...我收到以下错误:

Startup Error: Unable to detect graphics environment

我需要做什么才能将 Android Studio GUI 从 Docker 容器转发到我的 Ubuntu 虚拟机?这可能通过 X11 转发吗?

我能够解决这个问题——希望它能帮助其他人:

第 1 步:在托管 Docker 容器的服务器上启用 X11 转发

  1. 确保 /etc/ssh/sshd_config 包含以下行:

    X11Forwarding yes
    
  2. SIGHUPsshd取零钱

    cat /var/run/sshd.pid | xargs kill -1
    
  3. 验证xauth 是否安装在服务器上

    which xauth
    

    如果不是,请使用您的包管理器安装它。

第 2 步:通过 SSH 连接到托管 Docker 容器的服务器

  • 从 Linux 开始,您的 ssh 命令需要包含 -X 选项。示例:

    ssh -X user@<IP_OF_DOCKER_SERVER>
    
  • 来自 Windows(通过 PuTTY):

    • Windows 需要安装 X 服务器;安装 XMing 并确保它是 运行.
    • 在 PuTTY 中,转到 'Connection' > 'SSH' > 'X11' 并选中 'Enable X11 Forwarding' 旁边的框,然后连接到服务器

步骤 3:运行 来自 SSH 终端的 docker run 命令

docker run -it --rm 
  --net=host 
  -v "$HOME/.Xauthority:/root/.Xauthority:rw" 
  -e DISPLAY="$DISPLAY"
  android-studio


注意xorg-server不需要安装在Docker容器上。