[4]. GNU Radio 附加教程(四)-- 为什么高阶 GNU Radio 用户需要使用 docker? 视频 GitHub 码云 | 2026-03-13 11:06 | 阅读: 0 ### 前言 最近有一个同学说自己正在研究 gr-ieee802-11,但是环境总是弄不好;同时呢,我也在研究一个上古代码:gr-ale 发现也很难弄起来。 其实,gnu radio 是非常容易遇到版本问题的一个工具,主要原因就在于它是底层基于 `C++`,上层基于 python,OOT 模块版本依赖性极强,而 python 和 `c++` 在时间跨度上又变化很大。我们单纯采用 python 虚拟环境的方式根本无法覆盖 `C++` 问题,采用虚拟机换个对应版本的操作系统,有时候也可能遇到动态链接库不对应等一系列问题。为了彻底解决这些拦在面前的绊脚石,我准备了本期的教程:《为什么高阶 GNU Radio 用户需要使用 Docker》 本视频会分为三个部分:第一部分回答为什么要使用 docker,主要介绍 docker 的特性;第二部分介绍如何实施 Docker + Gnuradio;第三部分是基于我们实施的 D+G 来尝试编译安装 gr-ieee802-11 OOT 库。 ok,那我们开始! </br> ### 一、为什么 #### 1.1 为什么高阶 GNU Radio 用户需要使用 Docker Docker 是一个开源的应用容器引擎,高阶 GNU Radio 用户需要使用 Docker 主要有以下几个原因: **1)环境隔离与一致性** - **避免环境冲突**:GNU Radio 的开发和部署可能会涉及到复杂的依赖关系和特定的软件版本要求。使用 Docker 可以创建一个隔离的环境,确保 GNU Radio 及其相关组件在不同的主机上都能以相同的方式运行,避免与主机系统或其他应用程序的环境冲突。 - **跨平台部署**:高阶用户可能需要在不同的操作系统和硬件平台上运行 GNU Radio 应用。Docker 容器可以在多种主流操作系统上运行,如 Linux、Windows、Mac OS 等,使得 GNU Radio 项目能够轻松地在不同平台之间移植,提高了项目的可部署性和兼容性。 **2)便捷的依赖管理** - **简化安装过程**:GNU Radio 依赖于许多底层的库和工具,安装和配置这些依赖可能会非常繁琐且容易出错。通过使用 Docker,用户可以将所有的依赖项打包在一个容器镜像中,只需要安装 Docker 引擎,就可以快速启动包含完整 GNU Radio 环境的容器,大大简化了安装和配置过程。 - **版本控制与重现**:对于复杂的 GNU Radio 项目,可能会使用到特定版本的库和工具。Docker 允许用户精确地控制容器内的软件版本,通过定义 Dockerfile 可以记录和重现整个构建过程,确保项目在不同时间和环境下都能以相同的配置进行构建和运行,方便进行版本管理和维护。 **3)资源管理与优化** - **资源隔离与限制**:在处理一些对资源要求较高的 GNU Radio 任务时,Docker 可以对容器进行资源限制,如 CPU、内存等,确保 GNU Radio 应用不会过度占用主机资源,影响其他应用的运行,同时也能保证容器内的应用有稳定的资源可用,提高系统的整体稳定性和可靠性。 - **高效利用资源**:多个 GNU Radio 应用可以在不同的 Docker 容器中同时运行,它们可以共享主机的资源,但又相互隔离,从而实现了资源的高效利用,提高了服务器等硬件资源的利用率,降低了成本。 团队协作与项目管理 - **共享开发环境**:在团队开发中,使用 Docker 可以为团队成员提供统一的开发环境。大家都基于相同的容器镜像进行开发,避免了因环境差异导致的问题,提高了团队协作的效率,减少了开发和调试过程中的沟通成本。 - **快速部署与测试**:在项目的不同阶段,如开发、测试、部署等,Docker 可以快速创建和销毁容器,方便进行环境的搭建和清理。高阶用户可以轻松地在不同的环境中进行测试和验证,确保 GNU Radio 项目的质量和稳定性,加快项目的迭代速度。 **4)便于维护和更新** - **镜像管理**:Docker 镜像可以方便地进行创建、存储、共享和更新。高阶用户可以将自己定制的 GNU Radio 容器镜像上传到镜像仓库,方便在不同的项目或设备中重复使用。当需要更新 GNU Radio 或其依赖时,只需要更新镜像中的相关内容,然后重新构建和发布镜像即可,使得维护工作更加高效。 - **安全与漏洞管理**:Docker 提供了一定的安全机制和隔离性,降低了 GNU Radio 应用受到外部攻击的风险。同时,用户可以及时更新 Docker 镜像和容器内的软件,以修复安全漏洞,保障系统的安全性。 </br> ![][p2] </br> #### 1.2 和使用虚拟机比 与使用虚拟机相比,高阶 GNU Radio 用户选择使用 Docker 主要有以下优势,但也存在一些局限: **优势方面** 1)资源占用与性能 - **资源占用少**:虚拟机需要模拟完整的硬件环境,包括 CPU、内存、硬盘、网络等,会占用大量的系统资源。而 Docker 容器是基于宿主机的内核,共享操作系统资源,只需要为容器分配必要的进程和内存空间,因此资源占用显著减少。这对于运行多个 GNU Radio 实例或者在资源有限的设备上进行开发和测试非常重要。 - **启动速度快**:虚拟机启动时需要加载整个操作系统,包括内核、驱动程序、服务等,启动过程通常需要几十秒甚至几分钟。而 Docker 容器启动速度极快,通常在毫秒级别,因为它只是启动一个用户空间的进程,无需加载整个操作系统。这使得高阶用户可以快速部署和测试 GNU Radio 应用,提高开发效率。 - **性能损耗小**:由于虚拟机的硬件模拟层会引入一定的性能开销,导致虚拟机内的应用程序性能会有一定程度的下降。而 Docker 容器直接运行在宿主机的内核上,没有额外的硬件模拟层,因此性能损耗极小,几乎可以达到与原生应用相同的性能。这对于对实时性要求较高的 GNU Radio 信号处理任务尤为关键。 2)灵活性与可移植性 - **镜像体积小**:Docker 镜像只包含应用程序及其依赖项,不包含完整的操作系统,因此镜像体积通常比虚拟机镜像小很多。这使得 Docker 镜像更容易存储、传输和共享,高阶用户可以更方便地在不同的环境中部署 GNU Radio 应用。 - **易于定制和扩展**:Docker 容器可以根据用户的需求进行灵活定制,用户可以通过编写 Dockerfile 来定义容器的构建过程,添加或删除所需的软件包和配置。而且,Docker 容器之间可以通过网络进行通信,方便构建复杂的分布式系统。相比之下,虚拟机的定制和扩展相对复杂,需要对虚拟机的操作系统进行大量的配置和管理。 - **跨平台兼容性好**:Docker 可以在多种主流操作系统上运行,并且可以通过 Docker Hub 等镜像仓库方便地获取和共享镜像。这使得 GNU Radio 应用可以在不同的操作系统和硬件平台上快速部署和运行,提高了应用的可移植性。而虚拟机通常需要针对不同的操作系统和硬件平台进行专门的配置和优化,跨平台兼容性较差。 成本与效率 - **成本低**:由于 Docker 容器资源占用少,用户可以在一台主机上运行更多的容器,从而提高硬件资源的利用率,降低硬件成本。此外,Docker 的部署和管理相对简单,不需要专门的虚拟机管理软件和技术人员,也可以降低人力成本。 - **开发和部署效率高**:Docker 提供了一套标准化的开发、测试和部署流程,高阶用户可以通过 Dockerfile 和 Docker Compose 等工具快速构建和部署 GNU Radio 应用。同时,Docker 的版本控制和镜像管理功能使得应用的更新和回滚更加方便,提高了开发和部署的效率。而虚拟机的创建、配置和管理过程相对复杂,会增加开发和部署的时间和成本。 **局限性方面** 1)隔离性 - **隔离程度相对较低**:虚拟机通过硬件虚拟化技术提供了完全隔离的运行环境,不同虚拟机之间的操作系统和应用程序相互独立,一个虚拟机的故障不会影响其他虚拟机。而 Docker 容器共享宿主机的内核,虽然通过命名空间和控制组等技术实现了一定程度的隔离,但隔离程度相对较低。如果一个容器出现安全漏洞,可能会影响到其他容器或宿主机。 2)安全性 - **安全风险较高**:由于 Docker 容器共享宿主机的内核,容器内的应用程序可以访问宿主机的部分资源,因此存在一定的安全风险。如果容器内的应用程序被攻击,攻击者可能会利用漏洞突破容器的隔离,获取宿主机的控制权。而虚拟机由于具有完全独立的硬件环境和操作系统,安全性相对较高。 3)功能完整性 - **缺乏完整的操作系统功能**:Docker 容器只包含应用程序及其依赖项,不包含完整的操作系统,因此在某些情况下可能无法提供完整的操作系统功能。例如,一些需要底层硬件支持的功能可能无法在 Docker 容器中实现。而虚拟机可以运行完整的操作系统,提供更丰富的功能和服务。 </br> ![][p3] </br> ### 二、实施 秉着不重复造轮子的思想,发现已经有前人做了类似工作:https://github.com/git-artes/docker-gnuradio ![][p1] 参考其 readme.md: > 1. 按照Docker 的安装指南安装 docker (尽管我只在 Ubuntu 上测试过,因此为了方便起见,直接链接到Ubuntu 的相应指南)。 > 2. 克隆此 repo:git clone https://github.com/git-artes/docker-gnuradio.git > **ps**: 为了使用中国源,需要编辑对应的 `Dockerfile` 文件,在最上面的 `RUN apt-get update` 上增加一句命令: > `RUN sed -i -e 's@http://.*.ubuntu.com@http://mirrors.tuna.tsinghua.edu.cn@g' -e 's@https://.*.ubuntu.com@https://mirrors.tuna.tsinghua.edu.cn@g' /etc/apt/sources.list` > 3. 进入docker-gnuradio/gnuradio-releases文件夹并执行docker build -t ubuntu:gnuradio-releases .(此步骤只需一次,或者每次修改Dockerfile时都需要) > 4. 运行容器:docker run --net=host --env="DISPLAY" --volume="$HOME/.Xauthority:/root/.Xauthority:rw" --device /dev/snd -v persistent:/home/gnuradio/persistent --device /dev/dri -v /dev/bus/usb/:/dev/bus/usb/ --privileged --group-add=audio -it ubuntu:gnuradio-releases bash 最后运行容器只能运行命令行版本,如果想要运行 GUI 版本,需要将 `bash` 换为 `gnuradio-companion` 因为每次重新运行容器,除了指定的 `/home/gnuradio/persistent` 中的东西会保留,其他全部恢复到原点,因此如果想要一个窗口开 bash,另一个打开 gnuradio,就要使用: ``` docker ps --filter ancestor=ubuntu:gnuradio-releases -q 337d270b672d ``` 获取由上述 docker run 命令运行的 Docker 容器的 ID,然后用 `docker exec -it 337d270b672d bash` 或 `docker exec -it 337d270b672d gnuradio-companion` 来基于该容器运行一个 bash 会话或 gnuradio gui 会话(如果先 bash 中 cmake 安装一些 OOT 之后,也能直接 gnuradio-companion 启动 GUI)。 [p1]:https://tuchuang.beautifulzzzz.com:3000/?path=202503/docker_gnuradio_github.png [p2]:https://tuchuang.beautifulzzzz.com:3000/?path=202503/why_use_docker.jpeg [p3]:https://tuchuang.beautifulzzzz.com:3000/?path=202503/why_not_virsal_machine.jpeg