簡介
🐳 什麼是 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 中自動測試、構建、部署
- 微服務架構:每個服務一個容器,靈活組合
- 科研工具封裝:復現別人論文環境,或封裝自己的項目發給他人使用