如何在 Docker 容器中启动 X11 图形界面程序
如何在 Docker 容器中启动 X11 图形界面程序
在使用 Docker 时,我们通常会发现,容器中的图形应用没法直接显示到宿主机的界面上。不过,我们可以通过共享 X11 的 Unix 套接字,让容器把显示数据传递给宿主机的 X11 服务器,从而在宿主机上显示容器应用的界面。本文将带你一步步实现这一操作,并提供一个便捷的脚本,帮助你快速启动带有图形界面的 Docker 容器。
懒人脚本
如果你希望一步到位启动 Docker 容器中的 X11 图形应用,可以使用下面的脚本。这段脚本将自动完成容器的创建、X11 权限设置、图形应用的安装和启动,并在使用结束后恢复 X Server 权限。
懒人脚本:启动 X11 Docker 容器并运行图形界面应用
#!/bin/bash# 开放宿主机的 X Server 权限
xhost +# 创建并启动容器,并运行 xclock 图形化程序
docker run -it \-v /tmp/.X11-unix:/tmp/.X11-unix \-e DISPLAY=$DISPLAY \--name x11-docker \ubuntu bash -c " \apt update && \apt install -y x11-apps && \xclock "# 恢复 X Server 权限
xhost -
脚本说明
- xhost +:首先临时开放宿主机的 X Server 访问权限,允许 Docker 容器连接到宿主机的 X11 服务器。
- docker run -it:创建并启动名为
x11-docker的容器,挂载 X11 套接字,设置DISPLAY环境变量,并在容器中执行一系列命令。 - apt install -y x11-apps && xclock:在容器内安装
x11-apps包,并运行xclock应用,显示一个图形化的时钟。 - xhost -:操作完成后关闭宿主机的 X Server 访问权限,确保系统安全。
运行这个脚本后,你应该会在宿主机的屏幕上看到容器中的 xclock 时钟界面。
操作步骤详解
以下是脚本的各个步骤背后的原理和设置的详细说明:
1. 临时开放宿主机的 X Server 权限
为了让容器能够访问宿主机的图形界面,我们需要用 xhost + 命令来开放 X Server 的访问权限:
xhost +
注意:开放 X Server 权限可能带来安全风险。完成操作后务必关闭权限,使用
xhost -命令来恢复设置。
2. 创建容器并挂载 X11 套接字
接下来,我们使用 docker run 命令来创建一个新的 Docker 容器,并挂载 X11 套接字,这样容器就可以与宿主机共享显示数据。
docker run -it \-v /tmp/.X11-unix:/tmp/.X11-unix \-e DISPLAY=$DISPLAY \--name x11-docker \ubuntu bash -c "apt update && apt install -y x11-apps && xclock"
这里的关键参数包括:
-v /tmp/.X11-unix:/tmp/.X11-unix:将宿主机的/tmp/.X11-unix目录挂载到容器,让容器能够访问宿主机的 X11 套接字文件。- X11 套接字文件是什么?
在 Linux 系统中,X11 是一种标准化的图形显示协议。宿主机上运行的 X Server 通常会在 /tmp/.X11-unix 目录下创建套接字文件(通常为 X0 文件),用于监听来自客户端的连接请求。这个套接字文件充当“中介”,负责将客户端应用的图形请求传递给 X Server,从而让客户端应用能够在图形界面中显示。 - 通过将宿主机的 /tmp/.X11-unix 目录挂载到容器,容器中的应用可以直接与宿主机的 X Server 进行通信,从而实现在宿主机上显示容器的图形界面。
- X11 套接字文件是什么?
-e DISPLAY=$DISPLAY:传递宿主机的 DISPLAY 变量,使容器知道应将ubuntu bash -c "... && xclock":在容器中运行一系列命令,包括更新包管理器、安装x11-apps包,并启动xclock应用程序。
3. 运行图形化应用
在容器中,我们通过以下命令启动了图形化的时钟应用 xclock:
apt update
apt install -y x11-apps
xclock
xclock 是一个简单的图形化应用,方便测试 X11 转发的设置是否正确。运行该命令后,你应该会在宿主机的屏幕上看到一个实时更新的时钟。
4. 关闭 X Server 权限
操作完成后,我们用 xhost - 命令关闭宿主机的 X Server 访问权限:
xhost -
这样可以防止其他不可信的程序访问宿主机的显示系统,确保系统的安全性。
注意事项
-
安全性:临时开放 X Server 权限会带来一定的安全风险,所以建议在操作完成后关闭权限。可以通过在脚本末尾加入
xhost -命令自动恢复权限设置。 -
DISPLAY 变量:在部分系统中,
DISPLAY变量可能需要手动设置成:0或其他值。可以通过echo $DISPLAY命令查看当前系统的DISPLAY配置,确保正确传递给容器。 -
权限问题:确保 Docker 守护进程和容器用户对
/tmp/.X11-unix目录有访问权限。如果遇到权限问题,可以尝试用sudo启动容器,或者手动调整/tmp/.X11-unix目录的权限。 -
MacOS 用户提示:如果你使用的是 MacOS,直接使用上述方法可能无法实现图形界面的转发。因为 MacOS 不支持 X11 套接字文件共享,建议使用
XQuartz等第三方工具实现类似功能。
相关文章:
如何在 Docker 容器中启动 X11 图形界面程序
如何在 Docker 容器中启动 X11 图形界面程序 在使用 Docker 时,我们通常会发现,容器中的图形应用没法直接显示到宿主机的界面上。不过,我们可以通过共享 X11 的 Unix 套接字,让容器把显示数据传递给宿主机的 X11 服务器ÿ…...
pycharm保存是自动格式化
在PyCharm中设置保存时自动格式化代码,可以按照以下步骤进行: 1. 打开设置 在Windows和Linux系统中,可以通过File(文件)->Settings(设置)打开设置窗口;在Mac系统中,…...
.netCore WebAPI中字符串加密与解密
In today’s digital landscape, securing sensitive information is more critical than ever. If you’re using ASP.NET Core, you might store configuration settings in appsettings.json. However, hardcoding sensitive data like connection strings or API keys in p…...
Next.js + Move 石头剪刀布
rock-paper-scissors 写在前面 本地 源码:https://github.com/zcy1024/SuiStudy/tree/main/rock-paper-scissors # 或其它等价的命令来安装依赖并将项目跑起来 pnpm install pnpm run dev # http://localhost:3000/在线(如果没过期的话) …...
[面试]关于Redis 的持久化你了解吗
Redis的持久化是指Redis服务器在关闭或重启时,将内存中的数据保存到磁盘上的一种机制。Redis支持多种持久化方式。 一、RDB(Redis Database)持久化 RDB持久化是Redis默认采用的持久化方式,它将Redis在某个时间点的数据保存到磁盘上…...
Systemd:tmpfiles
Systemd提供了一个结构化的可配置方法来管理临时文件和目录,即systemd-tmpfiles,可以创建、删除和管理临时文件的服务。 $ systemctl list-units --all | grep systemd-tmpfilessystemd-tmpfiles-clean.service load…...
【Flutter 内嵌 android 原生 View以及相互跳转】
Flutter 内嵌 android 原生 View以及相互跳转 一. 内嵌android 原生View二、android 与 flutter 相互跳转 一. 内嵌android 原生View 在android 工程的包名下,也可在MainActivity创建 android 原生view ,继承PlatformView // 1.自定义textview public st…...
python externally-managed-environment 外部管理环境
https://realpython.com/python-virtual-environments-a-primer/?refyaolong.net#why-do-you-need-virtual-environments 简而言之, pip 默认会将您安装的所有外部包放置在 Python 安装路径/site-packages/ 的文件夹中一些Linux 和 macOS操作系统 预装了内部的 P…...
前端 | MYTED单篇TED词汇学习功能优化
文章目录 📚实现效果🐇before🐇after 📚模块实现解析🐇html🐇css🐇javascript 📚实现效果 🐇before 点击TED单篇词汇表按钮,选择对应TED打卡号,…...
64 mysql 的 表锁
前言 我们这里来说的就是 我们在 mysql 这边常见的 几种锁 行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁, 表共享锁, 表排他锁 我们前面了解了行共享锁, 行排他锁, 表意向共享锁, 表意向排他锁 等等相关 我们这里 来看一下 表共享锁, 表排他锁 的获取, 以及 和 其他表级…...
【计网不挂科】计算机网络期末考试——【选择题&填空题&判断题&简述题】题库(1)
前言 大家好吖,欢迎来到 YY 滴计算机网络 系列 ,热烈欢迎! 本章主要内容面向接触过C的老铁 本博客主要内容,收纳了一部门基本的计算机网络题目,供yy应对期中考试复习。大家可以参考 欢迎订阅 YY滴其他专栏!…...
ajax关于axios库的运用小案例
AJAX案例 图书管理 四大功能: 展示图书删除图书编辑图书信息新增图书 步骤 1.bootstrap弹窗来实现新增和编辑图书时出现的弹窗 有两种方案: a.可以用自带的属性来进行弹窗的显示和隐藏 b.可以通过JS进行控制,此操作可以进行自定义&am…...
微搭低代码入门01变量
目录 1 变量的定义2 变量的赋值3 变量的类型4 算术运算符5 字符串的连接6 模板字符串7 检查变量的类型8 解构赋值8.1 数组的解构赋值8.2 对象的解构赋值 9 类型转换9.1 转换为字符串9.2 转换为数字9.3 转换为布尔值 总结 好些零基础的同学,在使用低代码的时候&#…...
盘点2024年10款视频剪辑,哪款值得pick!!
在这个短视频盛行的时代,如何让我们的故事更生动有趣呢?那就要对短视频进行修饰了。这就需要借助视频剪辑工具:而一款好的工具不仅仅是视频的“美颜”,更是创意的灵魂所在!想象一下,运用一款功能齐全的剪辑…...
苹果手机照片批量删除:一键清理,释放空间
在数字化时代,iPhone不仅是我们沟通的桥梁,也是记录生活的重要工具。然而,随着时间的积累,手机中的照片数量不断增加,不仅占用大量存储空间,也让设备变得缓慢。苹果手机照片批量删除成为了一个普遍的需求。…...
《AI 大模型:重塑软件开发新生态》
《AI 大模型:重塑软件开发新生态》 一、AI 大模型引领软件开发新潮流二、AI 大模型在软件开发中的优势(一)提高开发效率(二)减少错误与提升质量(三)激发创新与拓展功能 三、AI 大模型在软件开发…...
uniapp(API-Promise 化)
一、异步的方法,如果不传入 success、fail、complete 等 callback 参数,将以 Promise 返回数据异步的方法,且有返回对象,如果希望获取返回对象,必须至少传入一项 success、fail、complete 等 callback 参数,…...
【考研数学 - 数二题型】考研数学必吃榜(数二)
数学二 suhan, 2024.10 文章目录 数学二一、函数❗1.极限1.1求常见极限1.2求数列极限1.2.1 n项和数列极限1.2.2 n项连乘数列极限1.2.3 递推关系定义的数列极限 1.3确定极限式中的参数1.4无穷小量阶的比较 2.连续2.1判断是否连续,不连续则判断间断点类型2.2证明题 二…...
Redis生产问题(缓存穿透、击穿、雪崩)——针对实习面试
目录 Redis生产问题什么是缓存穿透?如何解决缓存穿透?什么是缓存击穿?如何解决缓存击穿?缓存穿透和缓存击穿有什么区别?什么是缓存雪崩?如何解决缓存雪崩? Redis生产问题 什么是缓存穿透&#x…...
android openGL中模板测试、深度测试功能的先后顺序
目录 一、顺序 二、模板测试 1、概念 2、工作原理 3、关键函数 三、深度测试 1、概念 2、工作原理 3、关键函数 三、模板测试和深度测试的先后顺序 一、顺序 在Android OpenGL中,模板测试(Stencil Testing)是在深度测试࿰…...
深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
[ICLR 2022]How Much Can CLIP Benefit Vision-and-Language Tasks?
论文网址:pdf 英文是纯手打的!论文原文的summarizing and paraphrasing。可能会出现难以避免的拼写错误和语法错误,若有发现欢迎评论指正!文章偏向于笔记,谨慎食用 目录 1. 心得 2. 论文逐段精读 2.1. Abstract 2…...
第 86 场周赛:矩阵中的幻方、钥匙和房间、将数组拆分成斐波那契序列、猜猜这个单词
Q1、[中等] 矩阵中的幻方 1、题目描述 3 x 3 的幻方是一个填充有 从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。 给定一个由整数组成的row x col 的 grid,其中有多少个 3 3 的 “幻方” 子矩阵&am…...
pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)
目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关࿰…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)
漏洞概览 漏洞名称:Apache Flink REST API 任意文件读取漏洞CVE编号:CVE-2020-17519CVSS评分:7.5影响版本:Apache Flink 1.11.0、1.11.1、1.11.2修复版本:≥ 1.11.3 或 ≥ 1.12.0漏洞类型:路径遍历&#x…...
2025年渗透测试面试题总结-腾讯[实习]科恩实验室-安全工程师(题目+回答)
安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 腾讯[实习]科恩实验室-安全工程师 一、网络与协议 1. TCP三次握手 2. SYN扫描原理 3. HTTPS证书机制 二…...
数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...
CppCon 2015 学习:REFLECTION TECHNIQUES IN C++
关于 Reflection(反射) 这个概念,总结一下: Reflection(反射)是什么? 反射是对类型的自我检查能力(Introspection) 可以查看类的成员变量、成员函数等信息。反射允许枚…...
