第 1 节

简介

🐳 什么是 Docker?

Docker 是一个开源的 应用容器引擎 ,可以让开发者将应用和其所有依赖打包成一个“容器”,一次构建,到处运行。

一次构建,到处运行”也就是说:

  1. 之前:

之前想跑ROS2+OpenCV+CUDA+CuDNN,我需要在一台电脑上一个一个环境的安装配置,如果我还要在另一台电脑上跑这个,也需要把第二台电脑也这样配置一遍。如果我的系统环境崩了,需要重装系统了,重装完后又双叒叕要再来一遍配置过程,很麻烦。

  1. 使用docker后:

(docker镜像和docker容器的概念在下下下面,下面这段话里看到镜像和容器的概念先接受就行。)

我只需要在电脑上用docker配置一遍这个ROS2+OpenCV+CUDA+CuDNN环境,然后用docker生成一个镜像,把这个镜像打包好。以后在任何一台电脑上,我都可以直接用这个镜像生成一个容器,而这个容器内就包含了我所需要的ROS2+OpenCV+CUDA+CuDNN环境,如果我的容器环境崩了,我只需要把坏掉的容器删掉,重新由镜像再生成一个新的容器即可。只需要配置一次,以后都可以一键安装这个环境。

📦 它是怎么工作的?

  • 传统方式:软件运行需要在不同系统上安装各种库、配置环境,很麻烦。
  • Docker方式:打包成“容器”,环境和应用一起封装, 无论在哪运行都一样稳定

🔧 Docker 的几个基本概念

概念解释
镜像Image,运行容器的模板,像是一个应用快照
容器Container,运行中的镜像实例,有自己的文件系统、网络等
Dockerfile构建镜像的脚本,写明安装哪些包、设置哪些环境变量等
仓库Registry,存放镜像的地方,比如 Docker Hub

抽象化理解:

Docker镜像≈C++类

Docker容器≈C++类实例(即对象)

形象化理解: 镜像可以类似于给电脑装系统的iso镜像文件。 容器可以类似于已经被装到电脑上的可以运行的系统。

把镜像变为容器时,需要用docker run命令添加很多参数,这个可以理解你这个电脑到底有啥硬件配置。

🔍 类比理解

传统部署Docker部署
手动安装依赖、调试版本不一致问题一次打包环境和代码
程序“裸奔”跑在系统上程序“穿着容器”隔离运行
容易“在我电脑上能跑”保证“无论在哪都能跑”

就像快递包裹: 你不再关心内容怎么运送,因为包装已经帮你做好了一切隔离。

✅ Docker 的核心优势

优势说明
轻量级基于系统内核共享,启动速度快,占资源少
跨平台一次构建,到处运行(Windows、Linux、macOS 上都一致)
易于迁移部署应用和环境一起封装,不怕依赖不一致
易于版本控制镜像版本可控,支持回滚
生态丰富Docker Hub 上有成千上万的现成镜像可用
  1. 在Linux上可以几乎实现无性能损失。

docker里的发行版和本机共用Linux内核。

CPU损耗不到1%。 内存接近原生没损耗。 硬盘损耗不到2%。 网络性能接近原生没有损耗。 显卡损耗小于1%。

  1. 可以快速部署在绝大多数Linux发行版

你想跑ROS2,之前是仅在Ubuntu上是比较好部署的,但是现在你可以使用任意发行版,比如Fedora,ArchLinux等发行版上也能通过docker跑ROS2。

  1. 配置环境简单

之前你需要在Ubuntu上按照教程安装ROS2,CUDA,CuDNN,OpenCV4等等,但是只要你用了Docker,可以直接用docker pull命令拉取别人配置好的开发环境,只需要一条命令直通罗马。

你仅仅只需要把一个发行版最基础的东西配置好,比如那些仓库换源,输入法,显卡驱动(只用让显卡工作起来,不用在本机配置CUDA和CuDNN)等。

  1. 生态丰富

生态及其丰富,有很多东西即便自己不构建,也能在dockerhub上找到别人构建好的镜像,自己连编译都省去了。

比如之前配置cuda和cudnn的话,需要在本机先安装英伟达驱动,再安装CUDA和CuDNN。而现在,我们只需要本机安装英伟达驱动,英伟达官方在DockerHub上提供了CUDA和CUDNN的镜像,他们已经编译好了,我们可以直接拿来用。

📁 常见 Docker 应用场景

  • 本地开发:快速搭建各种开发环境(如 Python + Jupyter、ROS + Gazebo)
  • 测试部署:CI/CD 中自动测试、构建、部署
  • 微服务架构:每个服务一个容器,灵活组合
  • 科研工具封装:复现别人论文环境,或封装自己的项目发给他人使用