详解Docker容器运行GUI程序的方法

详解,docker,容器,运行,gui,程序,方法 · 浏览次数 : 154

小编点评

## 如何直接进入Docker容器运行或通过SSH连接Docker容器运行GUI程序的方法 这篇文章分享了两种方法来直接进入Docker容器运行GUI程序的方法: **方法一:使用xhost + SSH连接** 1. 在主机执行 `xhost +` 命令,添加远程容器的 IP 地址和端口。 2. 在容器中执行 `xauth list` 命令,检查设备名和 cookie 值。 3. 在主机上执行 `ssh -X -L 22:localhost:22` 命令,其中 `` 是容器的 IP 地址,`22` 是目标端口,`localhost:22` 是本地端口。 4. 在容器中运行 GUI 程序,例如 `firefox`。 **方法二:修改docker-compose.yml文件** 1. 修改 `docker-compose.yml` 文件中的 `ports`选项,允许容器使用自定义端口。 2. 使用 `docker-compose up -d` 命令启动容器,指定自定义端口。 3. 在主机上使用 `ssh -X -L 22:localhost:22` 命令连接到容器,并使用 `docker exec` 命令运行 GUI 程序。 **注意:** * 两种方法都需要先在主机执行 `xhost +` 命令,否则会报 `No protocol specified` 错误。 * 虽然将主机中的 Xauthority 文件使用绑定挂载共享到容器中,但容器中的该文件数据更新不及时,导致认证失败不断开ssh连接,重启容器并再次运行GUI程序,成功显示图形针对本地容器直接使用docker exec命令或通过下文ssh的方法进入容器例如 `container_name`。 * 通过 SSH 连接容器则不会出现这个问题。

正文

摘要:本文为大家详解如何直接进入Docker容器运行或通过SSH连接Docker容器运行GUI程序的方法。

本文分享自华为云社区《Docker容器运行GUI程序的方法(直接进入Docker容器运行或通过SSH连接Docker容器运行)》,作者:MAVER1CK 。

以下两种方法都需要先在主机执行 xhost + 命令,若无该命令,先apt安装 x11-xserver-utils 后再执行,否则会报 No protocol specified 这个错

sudo apt install x11-xserver-utils

 

xhost +

直接进入Docker容器运行

针对远程容器

docker-compose.yml中需要绑定挂载 /tmp/.X11-unix

  volumes:
      - "/tmp/.X11-unix:/tmp/.X11-unix:rw"
    environment:
      - DISPLAY=$DISPLAY
      - QT_X11_NO_MITSHM=1

若出现 X11 connection rejected because of wrong authentication. 这个错,则需要再挂载 ~/.Xauthority

 volumes:
      - "/tmp/.X11-unix:/tmp/.X11-unix:rw"
      - "~/.Xauthority:/root/.Xauthority:rw"
    environment:
      - DISPLAY=$DISPLAY
      - QT_X11_NO_MITSHM=1

这种方法有个问题:虽然将主机中的Xauthority文件使用绑定挂载共享到容器中,但容器中的该文件数据更新不及时(可以在主机和容器中分别使用 xauth list 命令查看详情,对比这两个文件的内容),导致即使挂载Xauthority,也会报 X11 connection rejected because of wrong authentication. 这个错,必须重启容器才可以继续显示图像。而通过SSH连接容器则不会出现这个问题。
举个例子:

  1. 一台NUC上运行了一个容器,已经使用docker compose up -d 部署了容器,在开机脚本里写了自启容器的命令,每次NUC开机都会自动启动容器
  2. 使用笔记本电脑ssh连接到了NUC,再在这个ssh连接中进入容器
  3. 在容器中运行GUI程序,成功显示了窗口
  4. 退出容器,并断开了与NUC的ssh连接
  5. 再次ssh连接NUC,重复步骤2. 3.,但未能显示图形,报错:X11 connection rejected because of wrong authentication.
  6. 在容器中执行 xauth list 命令,再在NUC中执行相同命令,可以看到设备名相同,但cookie值不同,导致认证失败
  7. 不断开ssh连接,重启容器并再次运行GUI程序,成功显示图形

针对本地容器

直接使用docker exec命令或通过下文ssh的方法进入容器

例如容器中使用的是bash

docker exec -it [容器名称] bash

然后在当前终端中输入命令执行GUI程序即可

通过SSH连接Docker容器运行

根据官方文档说明,在 host 网络模式下无法使用端口映射,为了使容器的ssh端口和主机的ssh端口不冲突(做到既可以连接主机,又可以连接容器),需要修改容器中默认的ssh端口,又因为容器中默认为root用户,且为随机生成密码,所以还要修改容器的ssh配置文件,允许以root身份ssh登陆,并修改容器root用户的密码,最后还要让容器每次启动的时候自动启动ssh服务(因为容器没有systemd,不会自启ssh服务)。注意不能挂载主机的Xauthority文件,但要挂载 /tmp/.X11-unix

volumes:
      - "/tmp/.X11-unix:/tmp/.X11-unix:rw"
environment:
      - DISPLAY=$DISPLAY
      - QT_X11_NO_MITSHM=1

1、修改容器ssh端口并允许root用户登陆

vim /etc/ssh/sshd_config
  • 将 Port 解注释,并把值从22改为其他值(不能使用主机正在使用的端口,因为容器在 host 模式下与主机共用端口),比如2222
  • 然后找到 PermitRootLogin ,解注释并把值改为 yes

2、修改docker-compose.yml,使容器启动时自启ssh服务:在 command 处增加命令

service ssh start

因为我的容器已经在启动时执行了 tail -f /dev/null 命令,因此需要下面这种写法以使容器执行多条命令

    command: bash -c "service ssh start && tail -f /dev/null"

3、最后通过ssh命令连接

ssh -p 2222 root@localhost -Y

 

点击关注,第一时间了解华为云新鲜技术~

与详解Docker容器运行GUI程序的方法相似的内容:

详解Docker容器运行GUI程序的方法

摘要:本文为大家详解如何直接进入Docker容器运行或通过SSH连接Docker容器运行GUI程序的方法。 本文分享自华为云社区《Docker容器运行GUI程序的方法(直接进入Docker容器运行或通过SSH连接Docker容器运行)》,作者:MAVER1CK 。 以下两种方法都需要先在主机执行 x

docker入门加实战—docker数据卷

本文介绍了docker数据卷是什么,以部署nginx容器和部署MySQL容器来详解数据卷的相关命令,达到学以致用的目的。

Docker通信全视角:原理、实践与技术洞察

本文全面深入地探讨了Docker容器通信技术,从基础概念、网络模型、核心组件到实战应用。详细介绍了不同网络模式及其实现,提供了容器通信的技术细节和实用案例,旨在为专业从业者提供深入的技术洞见和实际操作指南。 关注【TechLeadCloud】,分享互联网架构、云服务技术的全维度知识。作者拥有10+年

使用Docker buildx 为 .NET 构建多平台镜像

.NET 团队有一篇博客 改进多平台容器支持, 详细介绍了.NET 7 以上的平台可以轻松的使用Docker buildx 工具构建多平台的镜像。 buildx 是 Docker 官方提供的一个构建工具,它可以帮助用户快速、高效地构建 Docker 镜像,并支持多种平台的构建。使用 buildx,用

【转帖】Seccomp、BPF与容器安全

语音阅读2022-06-30 20:26 本文详细介绍了关于seccomp的相关概念,包括seccomp的发展历史、Seccomp BPF的实现原理已经与seccomp相关的一些工具等。此外,通过实例验证了如何使用seccomp bpf 来保护Docker的安全。 简介 seccomp(全称secu

docker swarm 使用详解

转载请注明出处: 1.docker swarm 的组成架构 一个基本的docker swarm 的架构如下: 它主要包含这几个核心组件: Manager节点(Manager Nodes): 管理节点是Swarm集群的控制中心,负责整个集群的管理和调度。Swarm可以有一个或多个Manager节点,其

[转帖]Docker配置文件/etc/docker/daemon.json详解

该文件作为Docker Engine的配置管理文件,几乎涵盖了所有docker命令行启动可以配置的参数。默认是没有的,需要手动创建 docker- daemon.json各配置详解 { "allow-nondistributable-artifacts": [], #不对外分发的产品提交的regis

安装docker并部署java项目

docker部署springboot项目(详细教程)_使用docker部署springboot项目_流星007的博客-CSDN博客 ps:以下是部署到linux 服务器中的 案例(与chatgpt的对话内容) 确保Dockerfile文件名正确: 您在命令中提到了创建名为"dockerfile"的文

Docker中部署单机Redis详细教程

1、拉取Redis镜像 # 拉取redis镜像,不指定版本则默认是最新版本 docker pull redis 2、查看镜像 # 列出本地镜像 docker images 3、准备配置文件路径 # 创建redis配置文件目录 # -p 确保每一级目录都存在,如果不存在则会自动创建 mkdir -p

[转帖]怎么使用Docker部署openGauss国产数据库

https://www.yisu.com/zixun/742193.html 这篇文章主要介绍了怎么使用Docker部署openGauss国产数据库的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇怎么使用Docker部署openGauss国产数据库文章都会有所收获,下面我