远程配置服务器 ubuntu22.04 里的 docker 的x11

远程配置服务器 ubuntu22.04 里的 docker 的x11

前提:我在docker端配置了端口映射

一、ubuntuX11相关依赖库和工具

首先安装X11相关依赖库和工具,确保图形界面转发所需组件完整:

bash 复制代码
sudo apt update && sudo apt install libgl1-mesa-glx libglu1-mesa libqt5opengl5-dev
apt-get install -y mesa-utils

二、Windows端配置

Windows需通过X服务器工具(如Xming或VcXsrv)接收远程Ubuntu的图形界面,步骤如下:

  1. 安装并启动 XmingVcXsrv (若使用VcXsrv,建议安装时勾选DisableAC选项,后续连接更灵活)。

  2. 打开Windows的cmd命令提示符,执行以下命令配置DISPLAY环境变量(配置后需重新打开一个终端生效):

    cmd 复制代码
    setx DISPLAY "127.0.0.1:0.0"
  3. 远程连接Ubuntu服务器时,需携带X11转发参数:

    • 若安装VcXsrv时勾选了DisableAC:可使用 -X-Y(推荐 -Y,兼容性更强);
    • 未勾选DisableAC:建议使用 -Y
      连接命令示例:
    bash 复制代码
    ssh -Y 用户名@Ubuntu服务器IP

三、Ubuntu端配置

1. 修改SSH配置文件

确保SSH服务支持X11转发,编辑配置文件:

bash 复制代码
sudo vim /etc/ssh/sshd_config

找到以下两行,确保未被注释 (删除行首的#):

ini 复制代码
X11Forwarding yes
X11UseLocalhost no

2. 重启SSH服务

修改配置后需重启SSH服务生效:

bash 复制代码
service ssh restart

3. 测试X11配置是否成功

执行xeyes命令,若弹出"大眼睛"图形窗口,说明Ubuntu端X11配置正常:

bash 复制代码
xeyes

4. 记录关键信息(后续Docker配置需用)

  • 步骤1:查看Docker虚拟网桥IP

    执行ifconfig,找到docker0网卡对应的inet地址(通常为172.17.0.1),示例输出:

    bash 复制代码
    docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
            inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255

    记住此IP(如172.17.0.1)。

  • 步骤2:查看DISPLAY环境变量

    执行echo $DISPLAY,输出格式通常为[hostname]:[display_number].[screen_number],示例:

    bash 复制代码
    zhenjiuzhe:1.0

    记住[display_number].[screen_number]部分(如1.0)。

  • 步骤3:获取X11认证信息

    执行xauth list $DISPLAY,找到与上述DISPLAY对应的认证条目,示例:

    bash 复制代码
    zhenjiuzhe:1.0  MIT-MAGIC-COOKIE-x  6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

    记录完整认证信息(含主机名/IP、认证类型、Cookie值)。

四、Docker端配置

1. 远程连接Docker

连接Docker时同样需携带X11转发参数(同Ubuntu远程连接规则,-Y-X),示例:

bash 复制代码
ssh -Y 用户名@Docker容器IP

2. 查看Docker虚拟网桥IP

进入Docker后,执行ifconfig,找到Docker自身的虚拟网桥IP(通常为172.17.0.2)。

3. 配置DISPLAY环境变量

DISPLAY指向Docker虚拟网桥IP(步骤五.2记录的172.17.0.2),并拼接[display_number].[screen_number](步骤四记录的1.0),命令示例:

bash 复制代码
export DISPLAY=172.17.0.2:1.0

若上述配置无效,可尝试使用 Ubuntu 的 Docker 虚拟网桥 IP(步骤四记录的172.17.0.1),命令:

bash 复制代码
export DISPLAY=172.17.0.1:1.0

4. 补充:手动添加X11认证(可选)

若export DISPLAY=172.17.0.1:1.0后仍报认证错误,可手动将Ubuntu的X11认证信息添加到Docker中,命令格式:

bash 复制代码
xauth add [DISPLAY值] 认证类型 Cookie值

结合步骤四记录的认证信息,示例:

bash 复制代码
xauth add 172.17.0.1:1.0 MIT-MAGIC-COOKIE-x  6xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

5. 测试

执行xeyes,若弹出图形窗口,说明Docker端X11转发配置成功。

五、Vscode端配置(可选)

若需通过VS Code远程连接并使用X11图形转发,需完成插件安装、SSH配置修改、插件参数设置三步,具体如下:

1. 安装必要插件

打开VS Code,在左侧"插件市场"搜索并安装以下两个插件:

  • Remote X11 (插件ID:spadin.remote-x11
  • Remote X11 (SSH) (插件ID:spadin.remote-x11-ssh

会提示已经停止维护了,但是无所谓,还是可以用

2. 修改VS Code的SSH Config文件(关键:启用X11转发)

需在SSH配置中明确开启X11转发相关参数,操作步骤:

  1. 打开VS Code命令面板(快捷键:Ctrl+Shift+P);

  2. 在搜索框中输入 SSH: Open SSH Configuration File 并回车;

  3. 通常直接按两次回车(默认打开用户目录下的SSH config文件,路径一般为 C:\Users\你的用户名\.ssh\config);

  4. 在目标远程主机(如之前示例的a30-docker)的配置段中,添加以下三行参数:

    ini 复制代码
    ForwardX11 yes
    ForwardX11Trusted yes
    ForwardAgent yes

    完整配置示例(可参考修改):

    ini 复制代码
    Host a30-docker  # 自定义远程主机名(方便记忆)
      HostName xxxx   # 实际远程主机/容器的IP地址(如192.168.1.100)
      User root       # 远程登录用户名
      Port 2222       # 远程SSH端口(默认22,非默认需指定,比如我做了端口映射所以是映射的端口号)
      ForwardX11 yes          # 启用X11转发
      ForwardX11Trusted yes   # 信任X11转发(避免认证问题)
      ForwardAgent yes        # 转发SSH代理(可选,增强兼容性)
  5. 保存文件(快捷键:Ctrl+S)。

3. 配置Remote X11插件参数

插件和SSH配置完成后,需关联步骤四(Ubuntu端配置)记录的[display_number][screen_number](示例中分别为10),操作:

  1. 打开VS Code的"设置"(快捷键:Ctrl+,);
  2. 在设置搜索框中输入 @ext:spadin.remote-x11,筛选出该插件的专属配置项;
  3. 找到以下两个参数并修改:
    • Remote X11: Display :填写步骤四获取的[display_number](示例:1),对应"连接的显示编号";
    • Remote X11: Screen :填写步骤四获取的[screen_number](示例:0),对应"连接的屏幕编号"。

4. 重启VS Code并测试

  1. 关闭当前VS Code所有窗口,重新打开;
  2. 通过左侧"远程资源管理器"→选择目标SSH主机(如a30-docker)→点击"连接到主机";
  3. 连接成功后,打开VS Code终端,执行xeyes命令,若弹出图形窗口,说明VS Code端X11转发配置生效。显示图形界面。
相关推荐
怣5020 小时前
Linux创意命令组合:让终端变得有趣又高效
linux·运维·服务器
啟明起鸣20 小时前
【Nginx 网关开发】上手 Nginx,简简单单启动一个静态 html 页面
运维·c语言·前端·nginx·html
lisanmengmeng20 小时前
添加ceph节点
linux·服务器·ceph
Tinyundg21 小时前
Linux系统分区
linux·运维·服务器
要做一个小太阳21 小时前
华为Atlas 900 A3 SuperPoD 超节点网络架构
运维·服务器·网络·华为·架构
江畔何人初21 小时前
service发现
linux·运维·云原生
life码农21 小时前
Linux系统清空文件内容的几种方法
linux·运维·chrome
zbguolei21 小时前
虚拟机安装Ubuntu后无法登录
linux·运维·ubuntu
UP_Continue21 小时前
Linux--基础IO
linux·运维·服务器
驱动探索者21 小时前
linux hwspinlock 学习
linux·运维·学习