简介
🐳 什么是 Docker?
Docker 是一个开源的 应用容器引擎 ,可以让开发者将应用和其所有依赖打包成一个“容器”,一次构建,到处运行。
“一次构建,到处运行”也就是说:
- 之前:
之前想跑ROS2+OpenCV+CUDA+CuDNN,我需要在一台电脑上一个一个环境的安装配置,如果我还要在另一台电脑上跑这个,也需要把第二台电脑也这样配置一遍。如果我的系统环境崩了,需要重装系统了,重装完后又双叒叕要再来一遍配置过程,很麻烦。
- 使用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 上有成千上万的现成镜像可用 |
- 在Linux上可以几乎实现无性能损失。
docker里的发行版和本机共用Linux内核。
CPU损耗不到1%。 内存接近原生没损耗。 硬盘损耗不到2%。 网络性能接近原生没有损耗。 显卡损耗小于1%。
- 可以快速部署在绝大多数Linux发行版
你想跑ROS2,之前是仅在Ubuntu上是比较好部署的,但是现在你可以使用任意发行版,比如Fedora,ArchLinux等发行版上也能通过docker跑ROS2。
- 配置环境简单
之前你需要在Ubuntu上按照教程安装ROS2,CUDA,CuDNN,OpenCV4等等,但是只要你用了Docker,可以直接用docker pull命令拉取别人配置好的开发环境,只需要一条命令直通罗马。
你仅仅只需要把一个发行版最基础的东西配置好,比如那些仓库换源,输入法,显卡驱动(只用让显卡工作起来,不用在本机配置CUDA和CuDNN)等。
- 生态丰富
生态及其丰富,有很多东西即便自己不构建,也能在dockerhub上找到别人构建好的镜像,自己连编译都省去了。
比如之前配置cuda和cudnn的话,需要在本机先安装英伟达驱动,再安装CUDA和CuDNN。而现在,我们只需要本机安装英伟达驱动,英伟达官方在DockerHub上提供了CUDA和CUDNN的镜像,他们已经编译好了,我们可以直接拿来用。
📁 常见 Docker 应用场景
- 本地开发:快速搭建各种开发环境(如 Python + Jupyter、ROS + Gazebo)
- 测试部署:CI/CD 中自动测试、构建、部署
- 微服务架构:每个服务一个容器,灵活组合
- 科研工具封装:复现别人论文环境,或封装自己的项目发给他人使用