Wiki
簡介
本文由簡體中文內容確定性轉換,並受版本化術語表保護。
1.🐳 什麼是 Docker?
Docker 是一個開源的 應用容器引擎 ,可以讓開發者將應用和其所有依賴打包成一個“容器”,一次構建,到處執行。
“一次構建,到處執行”也就是說:
- 之前:
之前想跑ROS2+OpenCV+CUDA+CuDNN,我需要在一臺電腦上一個一個環境的安裝配置,如果我還要在另一臺電腦上跑這個,也需要把第二臺電腦也這樣配置一遍。如果我的系統環境崩了,需要重灌系統了,重灌完後又雙叒叕要再來一遍配置過程,很麻煩。
- 使用docker後:
(docker映象和docker容器的概念在下下下面,下面這段話裡看到映象和容器的概念先接受就行。)
我只需要在電腦上用docker配置一遍這個ROS2+OpenCV+CUDA+CuDNN環境,然後用docker生成一個映象,把這個映象打包好。以後在任何一臺電腦上,我都可以直接用這個映象生成一個容器,而這個容器內就包含了我所需要的ROS2+OpenCV+CUDA+CuDNN環境,如果我的容器環境崩了,我只需要把壞掉的容器刪掉,重新由映象再生成一個新的容器即可。只需要配置一次,以後都可以一鍵安裝這個環境。
2.📦 它是怎麼工作的?
-
傳統方式:軟體執行需要在不同系統上安裝各種庫、配置環境,很麻煩。
-
Docker方式:打包成“容器”,環境和應用一起封裝, 無論在哪執行都一樣穩定 。
3.🔧 Docker 的幾個基本概念
| 概念 | 解釋 |
|---|---|
| 映象 | Image,執行容器的模板,像是一個應用快照 |
| 容器 | Container,執行中的映象例項,有自己的檔案系統、網路等 |
| Dockerfile | 構建映象的指令碼,寫明安裝哪些包、設定哪些環境變數等 |
| 倉庫 | Registry,存放映象的地方,比如 Docker Hub |
抽象化理解:
Docker映象≈C++類
Docker容器≈C++類例項(即物件)
形象化理解: 映象可以類似於給電腦裝系統的iso映象檔案。 容器可以類似於已經被裝到電腦上的可以執行的系統。
把映象變為容器時,需要用docker run命令新增很多引數,這個可以理解你這個電腦到底有啥硬體配置。
4.🔍 類比理解
| 傳統部署 | Docker部署 |
|---|---|
| 手動安裝依賴、除錯版本不一致問題 | 一次打包環境和程式碼 |
| 程式“裸奔”跑在系統上 | 程式“穿著容器”隔離執行 |
| 容易“在我電腦上能跑” | 保證“無論在哪都能跑” |
就像快遞包裹: 你不再關心內容怎麼運送,因為包裝已經幫你做好了一切隔離。
5.✅ 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的映象,他們已經編譯好了,我們可以直接拿來用。
6.📁 常見 Docker 應用場景
-
本地開發:快速搭建各種開發環境(如 Python + Jupyter、ROS + Gazebo)
-
測試部署:CI/CD 中自動測試、構建、部署
-
微服務架構:每個服務一個容器,靈活組合
-
科研工具封裝:復現別人論文環境,或封裝自己的專案發給他人使用