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镜像构建的容器吗?
- 9.SOIL2库的问题
- 9.1.修改Dockerfile
- 9.2.库处理
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版本是多少。
9.SOIL2库的问题
9.1.修改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 \ # 这是原始SOIL库的安装项,SOIL2需要从源码编译freeglut3-dev \mesa-utils \git \wget \# 基本C++构建环境g++ \cmake \mesa-common-dev \# 文本编辑器vim# 下载并安装 premake
RUN wget https://github.com/premake/premake-core/releases/download/v5.0.0-alpha16/premake-5.0.0-alpha16-linux.tar.gz \&& tar -xzvf premake-5.0.0-alpha16-linux.tar.gz \&& mv premake5 /usr/local/bin \&& rm premake-5.0.0-alpha16-linux.tar.gz# 克隆SOIL2的源码并编译安装
RUN git clone https://github.com/SpartanJ/SOIL2.git \&& cd SOIL2 \&& premake5 gmake \&& cd make/linux \&& make -f soil2-static-lib.make \&& make -f soil2-shared-lib.make \&& cp ../../lib/linux/* /usr/local/lib/ \&& cp ../../src/SOIL2/SOIL2.h /usr/local/include/ \&& cp -r ../../src/common /usr/local/include/ \&& ldconfig# 清理缓存以减小镜像大小
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 -lsoil2# 设置一个默认的命令(可选)
# CMD ["./myapp"]
9.2.库处理
改动文件目录结构
mkdir -p /usr/local/include/SOIL2
mv /usr/local/include/SOIL2.h /usr/local/include/SOIL2/soil2.h
修改软链接
ln -s /usr/local/lib/libsoil2-debug.so /usr/local/lib/libsoil2.so
编译命令
g++ -o main *.cpp -lGLEW -lglfw -lGL -lsoil2 -I/usr/local/include -L/usr/local/lib