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

news2024/10/10 5:22:40

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版本是多少。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1567958.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c++前言

目录 1. 什么是 C 2. C 发展史 3. C 的重要性 4. 如何学习 C 5. 关于本门课程 1. 什么是C C语言是结构化和模块化的语言,适合处理较小规模的程序。对于复杂的问题,规模较大的 程序,需要高度的抽象和建模时, C 语言则不合适…

ShardingJdbc+Mybatis实现多数据源

Mybatis多数据源 这个是对shardingjdbc应用的一个升级,如果对于shardingjdbc的整合还没看过之前的文章的,可以先看看文章https://blog.csdn.net/Think_and_work/article/details/137174049?spm1001.2014.3001.5501 整合步骤 1、依赖 和全新项目的单…

【异常错误】 Expected to have finished reduction in the prior iteration before star、find_unused_parameters

运行代码时出现了错误: RuntimeError: Expected to have finished reduction in the prior iteration before starting a new one. This error indicates that your module has parameters that were not used in producing loss. You can enable unused parameter …

VSCODE使用VSIX安装扩展

VSCode安装扩展特别慢,使用命令行安装告别龟速: code --install-extension当然,我这个是在WSL 的linux上安装的,Windows一样的。 VSCode扩展商店网页链接:https://marketplace.visualstudio.com/vscode

Ceph分布式存储系统以及高可用原理

Ceph分布式存储系统以及高可用原理 1. Ceph原理和架构1.1 分布式存储系统抽象1.2 Ceph基本组件 2 Ceph中的策略层2.1 CRUSH进行数据分发和定位2.2 PG(Placement Group): 集群管理的基本单元2.3 PG的代理primary OSD2.4 轻量级的集群元数据ClusterMap2.5 对PG的罗辑分组&#xf…

面试总结------2024/04/04

1.面试官提问:你说你在项目中使用springsecurity jwt 实现了登录功能,能简单讲一下怎么实现的吗? 2.使用RabbitMQ实现订单超时取消功能 订单状态定义 首先,我们需要定义订单的不同状态。在这个示例中,我们可以定义以下…

分享three.js实现乐高小汽车

前言 Web脚本语言JavaScript入门容易,但是想要熟练掌握却需要几年的学习与实践,还要在弱类型开发语言中习惯于使用模块来构建你的代码,就像小时候玩的乐高积木一样。 应用程序的模块化理念,通过将实现隐藏在一个简单的接口后面&a…

shell的编写

文章目录 1.框架2.命令行3.获取用户命令字符串4.命令行字符串分割5.执行命令和内建命令6.完整代码: 1.框架 我们知道shell是一直存在的,所以首先我们第一步就是要搭建一个框架,使其一直存在。 那么也很简单,一个while循环就可以完…

(科研实践篇)大模型相关知识

1.embedding 1.介绍: embedding就是用一个低纬的向量表示一个物品。而这个embedding向量的实质就是使距离相似的向量所对应的物品具有相似的含义(参考皮尔逊算法和cos余弦式子:计算相似度)简单来说,就是用空间去表示…

1.Docker简介和安装

1 Docker 简介 1.1 Docker 是什么? docker是一个开源的应用容器引擎。 1.2 容器是什么? 容器是一种轻量级的虚拟化技术 ,它是一个由应用运行环境、容器基础镜像组成的集合。 以 Web 服务 Nginx 为例,如下图所示:Ngin…

【并发编程】CountDownLatch

📝个人主页:五敷有你 🔥系列专栏:并发编程 ⛺️稳中求进,晒太阳 CountDownLatch 概念 CountDownLatch可以使一个获多个线程等待其他线程各自执行完毕后再执行。 CountDownLatch 定义了一个计数器,…

贝锐蒲公英企业路由器双机热备,保障异地组网可靠、不中断

对于关键业务,比如:在线支付系统、远程医疗监控系统、重要数据中心等,一旦网络发生故障,可能导致巨大的损失或影响,因此需确保网络拥有极高的可靠性、稳定性和容错能力。 面对此类场景和需求,贝锐蒲公英异…

优秀网站收藏——持续更新

1、Uiverse.io 官网:Open-Source UI elements for any project Uiverse.io是一个开源免费的UI组件库,直接使用HTML和CSS组成,可以方便的使用在任何前端框架上。它包含了丰富的UI组件类型,如按钮、复选框、开关、卡片、加载动画、…

在s390x架构机器上构建frps/frpc镜像 —— 筑梦之路

源码:GitHub - fatedier/frp: A fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet. # 克隆代码git clone https://github.com/fatedier/frp.git# 切换目录cd frp# 构建frps服务端docker build -t frps:s390x -f …

ALPHA开发板上的PHY芯片驱动:LAN8720驱动

一. 简介 前面文章了解到,Linux内核是有提供 PHY通用驱动的。 本文来简单了解一下ALPHA开发板上的 PHY网络芯片LAN8720的驱动。是 LAN8720芯片的公司提供的 PHY驱动。 二. ALPHA开发板上的PHY芯片驱动:LAN8720驱动 我 们 来 看 一 下 LAN8720A 的 …

【算法每日一练]-数论(保姆级教程 篇1 埃氏筛,欧拉筛)

目录 保证给你讲透讲懂 第一种:埃氏筛法 第二种:欧拉筛法 题目:质数率 题目:不喜欢的数 思路: 问题:1~n 中筛选出所有素数(质数) 有两种经典的时间复杂度较低的筛法&#xff0…

LeetCode-98. 验证二叉搜索树【树 深度优先搜索 二叉搜索树 二叉树】

LeetCode-98. 验证二叉搜索树【树 深度优先搜索 二叉搜索树 二叉树】 题目描述:解题思路一:中序遍历解题思路二:0解题思路三:0 题目描述: 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树…

Exchanger 怎么用J.U.C

Exchanger简介 Exchanger通常用来解决以下类似场景的问题,如下:两个线程间需要交换数据的问题,在多线程编程中,经常会有这样的场景:两个线程各自持有一些数据,并且需要在某个点上交换这些数据,…

不借助三方工具,修改Windows的CapsLock键为其他功能键

0. 背景交代 在我的Deepin上实现了CapsLock键切换输入法后,再用Windows会有点别扭,于是在一番查找资料和自行摸索后,找到了不借助第三方工具来实现修改CapsLock键的方法。 1. 修改CapsLock键为F15 1.1 Win R呼出运行窗口 1.2 输入Regedi…

Spring Boot 学习(2)——HelloWorld

HelloWorld!全宇宙码农的第一个(行)程序(代码)。 1、创建项目 打开idea,新建一个maven项目。 1)选择项目sdk(本例是1.8) 2)输入GroupId(co…