当前位置: 首页 > 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无论是在硬件电路还是在软件时序设计…...

云计算的安全需求

目录 一、概述 二、云安全服务基本能力要求 三、信息安全服务(云计算安全类)资质要求 3.1 概述 3.2 资质要求内容 3.2.1 组织与管理要求 3.2.2 技术能力要求 四、云安全主要合规要求 4.1 安全管理机构部门的建立 4.2 安全管理规范计划的编制 4…...

【C++】编程规范之表达式原则

表达式中变量的位置 在编写表达式时,将变量放置在右边,可以提高代码的可读性和可理解性。这种做法符合自然语言的阅读习惯,使得代码更易于理解。 // Good if (5 x) {// do something }// Avoid if (x 5) {// do something }不变量和资源申…...

Python人工智能基础知识:理解神经网络与机器学习的基本概念

人工智能(Artificial Intelligence,AI)是当今科技领域的热门话题之一,而神经网络和机器学习作为AI的两个重要分支,在解决各种问题中发挥着重要作用。本文将详细介绍神经网络和机器学习的基本概念,帮助读者更…...

10_MVC

文章目录 JSON常用的JSON解析Jackson的常规使用指定日期格式 MVC设计模式MVC介绍前后端分离案例(开发与Json相关接口) 三层架构三层架构介绍 JSON JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,是存…...

【Java多线程(4)】案例:设计模式

目录 一、什么是设计模式? 二、单例模式 1. 饿汉模式 2. 懒汉模式 懒汉模式-第一次改进 懒汉模式-第二次改进 懒汉模式-第三次改进 一、什么是设计模式? 设计模式是针对软件设计中常见问题的通用解决方案。它们提供了一种被广泛接受的方法来解决…...

时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测

时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测 目录 时序预测 | Matlab实现CPO-BiLSTM【24年新算法】冠豪猪优化双向长短期记忆神经网络时间序列预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-BiLST…...

java面试题(4)|Spring和Spring Boot之间有什么关联和区别

文章目录 Spring和Spring Boot的有什么关联?Spring和Spring Boot有什么区别?如何快速区分某个项目采用的是 Spring 还是 Spring Boot? Spring和Spring Boot的有什么关联? Spring Boot是建立在Spring框架之上的,因此它…...

Spring Boot中前端通过请求接口下载后端存放的Excel模板

导出工具类 package com.yutu.garden.utils;import com.baomidou.mybatisplus.core.toolkit.ObjectUtils; import org.apache.commons.io.IOUtils; import org.apache.poi.hssf.util.HSSFColor; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.slf4j.Logger;…...

构建企业级微服务平台:实现可扩展性、弹性和高效性

在软件开发的快速发展领域中,企业不断努力构建健壮、可扩展和高效的系统。随着微服务架构的出现,再加上云原生技术的应用,创建敏捷且具有弹性的平台的可能性是无限的。在本指南中,我们将深入探讨使用强大的工具和技术组合&#xf…...

存内计算技术在边缘计算、物联网设备中的应用及前景

存内计算技术简介 存内计算技术是一种新兴的计算范式,其核心理念是将存储和计算功能集成在同一硬件单元中。这种技术的优势在于能够在存储单元内部直接进行计算操作,从而减少数据在存储器和处理器之间的传输,提高计算效率。 以下是存内计算技…...

厦门高端模板建站/东莞整站优化排名

通过分析reduceByKey和groupByKey的源码,发现两个算子都使用了combineByKey这个算子,那么现在来分析一下combineByKey算子。 /*** Simplified version of combineByKey that hash-partitions the output RDD.*/def combineByKey[C](createCombiner: V &g…...

旅游社做的最好的网站/seo优化快速排名

如图,这道题,我轻而易举地说出了答案是3,2。原理的话我知道是封装成Promise,但要我翻译成Promise我还是很懵逼啊。不得不学下怎么翻译。不得不说,感谢这道题,让我进一步地深入了解async/await,感谢面试官as…...

滑县网站建设服务/电子商务与网络营销教案

面向对象 : 就是一种编程思想,是把构成问题事务分解成各个对象,建立对象的目的不是为了完成一个步骤,而是为了描叙某个事物在整个解决问题的步骤中的行为。 如我要造辆车: Step1. 设计画图>保时捷设计所 Step2. 原…...

h5响应式网站/长沙营销型网站建设

在5G的大势所趋之下,手机厂商也逐渐展露了各自在5G上的布局,其中华为与OPPO两大头部厂商也都推出了自家的5G手机:华为Mate30 Pro 5G和OPPO Reno3 Pro。这两部双模5G手机可以说都是“黑科技”于一身,旨在为消费者带去更好的体验&am…...

网页设计实训内容/seo营销推广公司

转载于:https://www.cnblogs.com/jasonlixuetao/p/5557845.html...

常州网站建设公司方案/怎样弄一个自己的平台

在开发中免不了和他人一起团队协作提交代码,为了防止大家每次提交代码时,git commit -m ’ 的提交信息不明所以,所以Angular 团队提出了 Git 约定式提交。这只是一种约定规范,并不是强制要求,具体可参考:An…...