自学内容网 自学内容网

docker中图形化界面的转发


在Docker中默认情况下是没有图形化界面的,因为Docker主要是为无头(headless)环境设计的。如果想在Docker容器中运行图形化程序,并且希望这些程序的窗口显示在宿主机上,可以通过以下几种方式实现。

一、 使用X11转发(适用于Linux系统)

Linux系统中通常使用X11作为显示服务器,可以通过X11转发来将容器内的图形化程序窗口显示到宿主机上

  • 1.允许宿主机的X11连接
    • 在宿主机上执行以下命令,允许X11接受来自Docker容器的连接
xhost +
  • 注意:xhost + 会允许任何客户端访问宿主机的X服务器,可能存在安全风险。为了更安全的操作,可以指定特定的主机,例如:
xhost +local:docker
  • 2.运行Docker容器并设置DISPLAY变量
    • 在运行容器时,需要将宿主机的X11 socket目录映射到容器内,并设置DISPLAY变量,指定宿主机的X显示服务
docker run -it --rm \   -e DISPLAY=$DISPLAY \   -v /tmp/.X11-unix:/tmp/.X11-unix \   my_ros_image
  • 参数说明:
    • -e DISPLAY=$DISPLAY:将宿主机的DISPLAY环境变量传递给Docker容器,使容器内程序知道应该将窗口显示在哪个屏幕上。
    • -v /tmp/.X11-unix:/tmp/.X11-unix:将宿主机的X11 socket目录映射到容器内,以便容器能够与宿主机的X服务器通信。
  • 3. 启动图形化程序
    • 进入容器后,启动图形化程序(如rvizgazebo等),它的窗口将显示在宿主机的桌面上。
注意事项:
  • 容器和宿主机的X服务器之间需要权限匹配,否则可能出现“拒绝连接”的错误。
  • xhost +允许所有客户端访问X服务器,可能有安全隐患。如果在多用户系统中使用,建议启用xhost +local:这种更安全的方式。

二、使用VNC(适用于所有平台)

如果你使用的是Windows、macOS或你不想依赖X11转发,可以通过VNC(虚拟网络计算)在容器中运行图形化界面,并通过VNC客户端在宿主机上访问图形化界面。

  • 1.在Docker镜像中安装VNC服务
    • 首先需要在Docker镜像中安装VNC服务器和一个桌面环境,例如XFCE4。可以在Dockerfile中进行如下配置:
FROM ubuntu:18.04
RUN apt-get update && apt-get install -y \
  xfce4 \
  xfce4-goodies \
  tightvncserver \
  && apt-get clean

# 配置VNC启动脚本
RUN mkdir ~/.vnc && \
    echo "xfce4-session &" > ~/.vnc/xstartup && \
    chmod +x ~/.vnc/xstartup

CMD ["vncserver", ":1", "-geometry", "1280x1024", "-depth", "24"]

  • 2.启动Docker容器
    • 构建镜像并运行容器:
docker build -t my_vnc_ros_image .
docker run -p 5901:5901 my_vnc_ros_image
  • 这样会将容器中的VNC服务映射到宿主机的5901端口。
  • 3.在宿主机上使用VNC客户端连接
    • 使用VNC客户端(如RealVNCTigerVNC),连接到宿主机的localhost:5901,你就可以看到容器内的图形化界面。
优点:
  • 这种方式跨平台(Windows、macOS、Linux)都可用,不依赖宿主机的显示系统(如X11)。
  • VNC可以提供一个完整的虚拟桌面环境。

三、使用Xpra(无缝模式,适用于Linux和macOS)

Xpra是一种“无缝”远程桌面工具,它允许将容器内的图形化应用显示为宿主机上的独立窗口,而不需要整个桌面环境。相比VNC,Xpra更轻量,且在Linux和macOS上使用较为方便。

  • 1.在Docker镜像中安装Xpra
    • 在Dockerfile中添加安装Xpra的指令:
RUN apt-get update && apt-get install -y xpra
  • 2.启动Xpra服务器
    • 运行容器时,启动Xpra服务器并映射端口:
docker run -it --rm \
  -e DISPLAY=:14 \
  -p 14500:14500 \
  my_xpra_ros_image xpra start :14 --bind-tcp=0.0.0.0:14500 --no-daemon

  • 3.在宿主机上安装Xpra客户端
    • 安装Xpra客户端后,运行以下命令连接到容器:
xpra attach tcp:localhost:14500
  • 此时可以在宿主机上以窗口形式看到容器中的图形化程序。
优点:
  • Xpra是无缝的,不像VNC那样需要虚拟桌面,它可以在宿主机上显示为独立的窗口。
  • 支持Linux和macOS,适合图形化应用的开发和调试。

四、使用X11转发到Windows(适用于Windows系统)

如果你使用的是Windows,可以安装X11服务器(如Xming或VcXsrv)来接收Docker容器的图形化输出。

  • 1.安装Xming或VcXsrv
    • 下载并安装Xming或VcXsrv,确保其在运行并且监听X11连接。
  • 2.配置环境变量
    • 在Windows的CMDPowerShell中,找到Xming/VcXsrv的IP地址,通常是localhost或者172.17.0.1
    • 将环境变量DISPLAY设置为该IP地址加上:0(例如DISPLAY=172.17.0.1:0)。
  • 3.运行Docker容器并设置DISPLAY
    • 使用类似于Linux的X11转发方法,将DISPLAY和X11 socket传递给容器:```
docker run -it --rm \
  -e DISPLAY=172.17.0.1:0 \
  -v /tmp/.X11-unix:/tmp/.X11-unix \
  my_ros_image
  • 4.运行图形化程序
    • 图形化程序的窗口应该会显示在Windows的桌面上。

总结

  • X11转发:适合Linux和macOS系统,依赖宿主机的X11服务器。
  • VNC:跨平台,适合需要完整桌面环境的场景。
  • Xpra:轻量且无缝显示,适合Linux和macOS,独立窗口显示。
  • Windows X11转发:需要Xming或VcXsrv等工具。

原文地址:https://blog.csdn.net/m0_55127902/article/details/142370039

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!