当前位置: 首页 > news >正文

Linux笔记之制作基于ubuntu20.4的最小OpenGL C++开发docker镜像

Linux笔记之制作基于ubuntu20.4的最小OpenGL C++开发docker镜像

—— 2024-04-03 夜

code review!

文章目录

  • Linux笔记之制作基于ubuntu20.4的最小OpenGL C++开发docker镜像
    • 1.这里把这本书的例程代码放在了Dockerfile所在的文件夹内以使镜像预装例程代码
    • 2.创建Dockerfile
    • 3.构建Docker镜像
    • 4.运行Docker容器
    • 5.随便找个书中例程编译运行,发现没有反应
    • 6.原因是宿主机的OpenGL不对,查看OpenGL版本
    • 7.修改例程main.cpp重新编译运行
    • 8.可以在ubuntu 18.04中运行ubuntu20.04的docker镜像构建的容器吗?

1.这里把这本书的例程代码放在了Dockerfile所在的文件夹内以使镜像预装例程代码

在这里插入图片描述

在这里插入图片描述

2.创建Dockerfile

# 使用官方Ubuntu基础镜像
FROM ubuntu:20.04# 避免在安装过程中由于时区设置导致的停滞
ENV DEBIAN_FRONTEND=noninteractive# 安装基本工具
RUN apt-get update && apt-get install -y \build-essential \xorg-dev \libglu1-mesa-dev \libglew-dev \libsdl2-dev \libsdl2-image-dev \libglm-dev \libfreetype6-dev \libglfw3 \libglfw3-dev \libsoil-dev \freeglut3-dev \mesa-utils \git \wget \# 基本C++构建环境g++ \cmake \mesa-common-dev \# 文本编辑器vim# 清理缓存以减小镜像大小
RUN apt-get clean && rm -rf /var/lib/apt/lists/*# 设置工作目录
WORKDIR /app# 可以选择复制本地代码到容器中
COPY ./book_demo /app# 设置环境变量,例如GLFW库的路径等
# ENV LIBRARY_PATH=/path/to/library# 编译你的OpenGL程序
# RUN g++ -o myapp main.cpp -lGL -lGLU -lglfw -lGLEW# 设置一个默认的命令(可选)
# CMD ["./myapp"]

3.构建Docker镜像

在包含Dockerfile的文件夹内打开一个终端,执行以下命令来构建Docker镜像:

docker build -t opengl-cpp-env .

这里的opengl-cpp-env是给这个镜像起的名字,可以根据喜好命名。
在这里插入图片描述

4.运行Docker容器

确保X服务器允许来自本地所有用户的连接。在宿主机的终端中执行以下命令:

xhost +

这将允许所有用户连接到X服务器。出于安全考虑,在完成容器的使用后,应通过运行xhost -来撤销此权限。

当镜像构建完成后,可以使用以下命令运行容器:

docker run -it --rm \-v /tmp/.X11-unix:/tmp/.X11-unix \-e DISPLAY=$DISPLAY \opengl-cpp-env

在这里插入图片描述

如果需要与容器共享文件系统,可以使用-v参数挂载本地目录到容器中:

docker run -it --rm -v $(pwd):/app opengl-cpp-env

5.随便找个书中例程编译运行,发现没有反应

在这里插入图片描述

6.原因是宿主机的OpenGL不对,查看OpenGL版本

使用glxinfo命令

glxinfo是一个显示有关OpenGL和GLX的信息的程序。首先,确保安装了mesa-utils包:

sudo apt update
sudo apt install mesa-utils

然后运行glxinfo命令来查找OpenGL版本:

glxinfo | grep "OpenGL version"

这应该会输出你的OpenGL版本,例如:

OpenGL version string: 4.6.0 NVIDIA 390.77

运行,发现是3.3版本
在这里插入图片描述

注意:

  • 在虚拟机中,显示的OpenGL版本可能是虚拟化软件模拟的版本,而不是宿主机硬件实际支持的版本。
  • 如果在虚拟机中,确保安装了虚拟机的增强工具(比如VMware Tools或VirtualBox Guest Additions),这样可以获得更好的图形性能和更准确的OpenGL版本信息。

如果发现OpenGL版本较低,可能需要更新显卡驱动或在物理硬件上测试OpenGL程序。

7.修改例程main.cpp重新编译运行

在这里插入图片描述

编译:

g++ main.cpp -o main -lGLEW -lglfw -lGL

运行:
在这里插入图片描述

8.可以在ubuntu 18.04中运行ubuntu20.04的docker镜像构建的容器吗?

是的,可以在Ubuntu 18.04中运行为Ubuntu 20.04构建的Docker容器。Docker的设计目的之一就是提供隔离,这意味着运行容器的宿主机操作系统与容器内的操作系统版本可以不同。

容器内的应用程序与其依赖项都被封装在镜像中,该镜像包含了运行该应用程序所需的一切。因此,只要宿主机安装的Docker引擎版本是兼容的,并且宿主机的内核支持容器所需的所有功能,就可以在Ubuntu 18.04上运行为Ubuntu 20.04构建的容器。

请确保宿主机上安装了最新版本的Docker。可以通过执行以下命令来安装或更新Docker:

sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io

安装或更新Docker后,在宿主机上运行容器的命令与在任何其他支持的Linux发行版上运行容器的命令相同。例如:

docker run -it ubuntu:20.04

这将启动一个基于ubuntu:20.04镜像的容器,您可以在其中运行命令。只要Docker守护程序正在运行,就应该能够无差别地执行此操作,不管宿主机的Ubuntu版本是多少。

相关文章:

Linux笔记之制作基于ubuntu20.4的最小OpenGL C++开发docker镜像

Linux笔记之制作基于ubuntu20.4的最小OpenGL C开发docker镜像 —— 2024-04-03 夜 code review! 文章目录 Linux笔记之制作基于ubuntu20.4的最小OpenGL C开发docker镜像1.这里把这本书的例程代码放在了Dockerfile所在的文件夹内以使镜像预装例程代码2.创建Dockerfile3.构建Do…...

企业为什么选择高防服务器?

高防服务器顾名思义就是一种具有高度安全性的服务器,有着很高的防御能力,可以提供更加安全可靠的服务,能够有效地避免分布式拒绝服务攻击和其它的网络安全威胁,以下就是企业选择高防服务器的原因。 高防服务器在硬件安全方面有着很…...

OpenHarmony实战:轻量级系统之配置其他子系统

除上述子系统之外,还有一些必要但是无需进行移植的子系统。如:分布式任务调度子系统、DFX子系统。 这些子系统添加方式比较简单,在“vendor/MyVendorCompany/MyProduct/config.json”文件中进行如下配置即可: {"subsystem&…...

关于VueCli项目中如何加载调试Worker和SharedWorker

安装Webpack插件 VueCli 项目中默认是没有加载 worker 的配置,需要额外安装 webpack 插件来实现,让我们开始安装 worker-loader 插件 # npm npm install worker-loader # pnpm pnpm install worker-loader # yarn yarn add worker-loader配置Webpack插…...

Centos7安装单机版Kafka

下载 链接:https://pan.baidu.com/s/1W8lVEF6Y-xlg6zr3l9QAbg?pwdhbkt 提取码:hbkt 上传到服务器/opt目录 安装 # kafka安装目录为 /opt/kafka cd /opt; mkdir kafka; mv kafka_2.13-2.7.0.tgz ./kafka;cd kafka; #解压 tar -zxvf kafka_2.13-2.7.0…...

基于深度学习的钢材表面缺陷检测系统(网页版+YOLOv8/v7/v6/v5代码+训练数据集)

摘要:本文深入研究了基于YOLOv8/v7/v6/v5的钢材表面缺陷检测系统,核心采用YOLOv8并整合了YOLOv7、YOLOv6、YOLOv5算法,进行性能指标对比;详述了国内外研究现状、数据集处理、算法原理、模型构建与训练代码,及基于Strea…...

计算机网络:数据链路层 - 点对点协议PPP

计算机网络:数据链路层 - 点对点协议PPP PPP协议的帧格式透明传输字节填充法零比特填充法 差错检测循环冗余校验 对于点对点链路,PPP协议是目前使用最广泛的数据链路层协议。比如说,当用户想要接入互联网,就需要通过因特网服务提供…...

Springboot集成token认证

一、引出session问题以及token、鉴权 session都是保存在内存中,认证用户增多,服务端开销明显增大。若是认证的记录保存在某台服务器内存中时,意味着用户的下次请求只能够在该服务器内存中进行认证。CSRF跨站攻击 token的鉴权机制&#xff1…...

计算机网络_工具

从你的电脑到指定ip网站,用时3ms ttl TTL Time To Live 数据包存活时间 指一个数据包在经过一个路由器时,可传递的最长距离(跃点数)。每当数据包经过一个路由器时,其存活次数就会被减一 256 - 249 7&…...

如何实现一个Java的@注解?

先看一段代码: ControllerAdvice public class GlobalExceptionHandler {ExceptionHandler(value Exception.class)public ResponseEntity defaultErrorHandler(Exception e) {// 将错误信息转成字符串String errorMessage ExceptionUtils.getStackTrace(e);// 创…...

嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记12:DAC数模转换

系列文章目录 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记01:赛事介绍与硬件平台 嵌入式|蓝桥杯STM32G431(HAL库开发)——CT117E学习笔记02:开发环境安装 嵌入式|蓝桥杯STM32G431(…...

迅饶科技 X2Modbus 网关 GetUser 信息泄露漏洞复现

0x01 产品简介 X2Modbus是上海迅饶自动化科技有限公司Q开发的一款功能很强大的协议转换网关, 这里的X代表各家不同的通信协议, 2是T0的谐音表示转换, Modbus就是最终支持的标准协议是Modbus协议。用户可以根据现场设备的通信协议进行配置,转成标准的Modbus协议。在PC端仿真…...

修改亚马逊云科技账户的密码和MFA

要使用AWS CLI删除当前账户的多因素认证(MFA)设备并修改密码,你需要先确保已安装并配置了AWS CLI,并且你的账户有足够的权限执行这些操作。下面是如何分步进行的指导: 1. 删除MFA设备 首先,你需要找出MFA设备的序列号或ARN。可以…...

提升性能与精准追踪:SkyWalking自定义跟踪忽略插件

前言 当使用分布式追踪系统时,有时需要排除某些端点或路径,以减轻追踪系统的负载或减少不必要的数据收集。为了满足这种需求,SkyWalking 提供了一个可选的插件,即 apm-trace-ignore-plugin,它允许自定义需要跳过的路径…...

第十三届蓝桥杯大赛软件赛省赛CC++大学B组

第十三届蓝桥杯大赛软件赛省赛CC 大学 B 组 文章目录 第十三届蓝桥杯大赛软件赛省赛CC 大学 B 组1、九进制转十进制2、顺子日期3、刷题统计4、修建灌木5、x进制减法6、统计子矩阵7、积木画8、扫雷9、李白打酒加强版10、砍竹子 1、九进制转十进制 计算器计算即可。2999292。 2、…...

zookeeper监听集群节点的实现zkclient组件实现方案(Java版)

ZooKeeper Watcher 机制 client 向zookeeper 注册监听client注册的同时会存储一个WatchManager对象向zookeeper发生改变则notification client 并发送一个WatchManager对象,然后client再更新该对象 package com.jacky.zk.demo;import org.I0Itec.zkclient.IZkChildListener;…...

【ArduinoQuartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能

【Arduino&Quartus】在小脚丫STEP CYC10上安装PulseRain Reindeer并在软核上运行基础功能 一、将Reindeer软核下载到STEP CYC10(一)下载PulseRain Reindeer软核(二)配置Reindeer软核到开发板1.将sof文件转换为jic文件2.将jic文…...

【电路笔记】-逻辑与门

逻辑与门 文章目录 逻辑与门1、概述2、2 输入晶体管与门3、数字与门类型4、7408 四路 2 输入与门逻辑与门是一种数字逻辑电路,仅当其所有输入均为高电平时,其输出才会变为高电平至逻辑电平 1。 1、概述 数字逻辑与门的输出状态仅在其任何输入处于逻辑电平“0”时再次返回“低…...

蓝桥杯练习——拼出一个未来

选中 index.html 右键启动 Web Server 服务(Open with Live Server),让项目运行起来。接着,打开环境右侧的【Web 服务】,就可以在浏览器中看到如下效果: 目标 完善 js/index.js 的 TODO 部分,实…...

stm32f103c8t6学习笔记(学习B站up江科大自化协)-SPI

SPI通信 SPI,(serial peripheral interface),字面翻译是串行外设接口,是一种通用的数据总线,适用于主控和外挂芯片之间的通信,与IIC应用领域非常相似。 IIC无论是在硬件电路还是在软件时序设计…...

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…...

从WWDC看苹果产品发展的规律

WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

Vue3 + Element Plus + TypeScript中el-transfer穿梭框组件使用详解及示例

使用详解 Element Plus 的 el-transfer 组件是一个强大的穿梭框组件,常用于在两个集合之间进行数据转移,如权限分配、数据选择等场景。下面我将详细介绍其用法并提供一个完整示例。 核心特性与用法 基本属性 v-model:绑定右侧列表的值&…...

C++ 求圆面积的程序(Program to find area of a circle)

给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...

如何更改默认 Crontab 编辑器 ?

在 Linux 领域中,crontab 是您可能经常遇到的一个术语。这个实用程序在类 unix 操作系统上可用,用于调度在预定义时间和间隔自动执行的任务。这对管理员和高级用户非常有益,允许他们自动执行各种系统任务。 编辑 Crontab 文件通常使用文本编…...

Kubernetes 网络模型深度解析:Pod IP 与 Service 的负载均衡机制,Service到底是什么?

Pod IP 的本质与特性 Pod IP 的定位 纯端点地址:Pod IP 是分配给 Pod 网络命名空间的真实 IP 地址(如 10.244.1.2)无特殊名称:在 Kubernetes 中,它通常被称为 “Pod IP” 或 “容器 IP”生命周期:与 Pod …...

离线语音识别方案分析

随着人工智能技术的不断发展,语音识别技术也得到了广泛的应用,从智能家居到车载系统,语音识别正在改变我们与设备的交互方式。尤其是离线语音识别,由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力,广…...

前端调试HTTP状态码

1xx(信息类状态码) 这类状态码表示临时响应,需要客户端继续处理请求。 100 Continue 服务器已收到请求的初始部分,客户端应继续发送剩余部分。 2xx(成功类状态码) 表示请求已成功被服务器接收、理解并处…...

【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战

🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...

break 语句和 continue 语句

break语句和continue语句都具有跳转作用&#xff0c;可以让代码不按既有的顺序执行 break break语句用于跳出代码块或循环 1 2 3 4 5 6 for (var i 0; i < 5; i) { if (i 3){ break; } console.log(i); } continue continue语句用于立即终…...