認識 Docker
Docker 是一個把程式裝進「容器」(container)裡執行的工具。容器就像一個打包好的盒子,裡面放著程式和它需要的一切:程式語言、套件、設定檔。不管這個盒子拿到誰的電腦、哪台伺服器,打開來都能用一模一樣的方式執行。本頁說明 Docker 解決了什麼問題、幾個一定要懂的名詞,以及怎麼安裝並跑起第一個容器。
Docker 解決了什麼問題?
寫程式的人常遇到這種狀況:程式在自己電腦上跑得好好的,交給同事或放到伺服器上卻出錯。原因通常是兩邊環境不一樣,例如 Python 版本不同、少裝了某個套件、設定檔路徑不同。
Docker 的做法是:把程式和它的執行環境一起打包。別人拿到的不只是程式碼,而是一個「已經裝好所有東西」的環境,所以不會因為環境差異而出錯。
這個名字來自貨櫃(container)。海運貨櫃有統一的尺寸,不管裡面裝什麼,港口都能用同樣的方式搬運。Docker 容器也一樣:不管裡面是 Python、Node.js 還是資料庫,都能用同樣的指令啟動和管理。
容器和虛擬機有什麼不同?
虛擬機(Virtual Machine, VM)也能提供隔離的環境,但做法不同:
- 虛擬機是模擬一整台電腦,每台都要裝一套完整的作業系統。
- 容器則共用你電腦的作業系統核心,只裝程式需要的部分。
| 比較 | 虛擬機 | Docker 容器 |
|---|---|---|
| 啟動時間 | 數十秒到數分鐘 | 通常 1~2 秒 |
| 檔案大小 | 好幾 GB | 幾 MB 到幾百 MB |
| 同一台電腦能跑幾個 | 幾台 | 幾十個甚至上百個 |
| 適合用來 | 需要不同作業系統的情況 | 打包、執行應用程式 |
Windows 和 macOS 也能用嗎?
可以。容器需要 Linux 核心,所以 Docker Desktop 會在背景自動開一台很小的 Linux 虛擬機來跑容器。你不需要自己設定,使用起來和在 Linux 上一樣。
四個一定要懂的名詞
| 名詞 | 白話解釋 | 比喻 |
|---|---|---|
| Image(映像檔) | 一個唯讀的範本,裡面包含程式與執行環境 | 做蛋糕的模具 |
| Container(容器) | 用 Image 啟動、正在執行的程式 | 用模具做出來的蛋糕 |
| Registry(倉庫) | 存放與分享 Image 的地方,最常用的是 Docker Hub | 放模具的倉庫 |
| Volume(資料卷) | 容器外的儲存空間,用來保存資料 | 蛋糕店的冷藏庫 |
用一個 Image 可以啟動很多個容器,就像一個模具可以做出很多個蛋糕。容器被刪除時,裡面的資料也會跟著消失,所以需要保存的資料(例如資料庫)要放在 Volume 裡。
如何安裝 Docker?
Windows 和 macOS
下載並安裝 Docker Desktop。它包含了 Docker 引擎、指令工具、Docker Compose 和圖形介面。安裝完成後打開 Docker Desktop,等左下角顯示引擎已啟動即可。
Linux
Linux 安裝的是 Docker Engine。想快速在測試機上安裝,可以用官方提供的安裝腳本:
安裝後每次執行 docker 都要加 sudo。如果想省略,可以把自己加進 docker 群組,重新登入後生效:
注意
加入 docker 群組的帳號,等於擁有這台電腦的最高權限,只把信任的帳號加進去。正式伺服器建議依照 官方安裝文件 的步驟安裝。
跑起第一個容器
確認安裝成功
這一行指令做了三件事:
- 在你的電腦上找
hello-world這個 Image。 - 找不到,就自動從 Docker Hub 下載。
- 用它啟動一個容器,印出
Hello from Docker!後結束。
--rm 的意思是「容器結束後自動刪除」,適合這種只跑一次的測試。
進入一個容器裡看看
這會啟動一個 Alpine Linux(很小的 Linux 版本)容器,並讓你進到它的終端機裡。-it 讓你可以在容器裡打字操作。試著輸入:
你會發現容器裡是一個獨立的 Linux 環境,和你的電腦互不影響。
跑一個網站
打開瀏覽器連到 http://localhost:8080,會看到 Nginx 的歡迎頁面。
-d:在背景執行,終端機可以繼續用。--name web:幫容器取名叫web,之後用名字操作它。-p 8080:80:把你電腦的 8080 埠接到容器的 80 埠。
用完後停止並刪除:
更多操作方式請看下一篇 Docker 基本操作。
推薦影音
What is a container?
簡述:Docker 官方短片,說明容器如何與其他程式隔離,並示範執行第一個容器,對應本頁「四個一定要懂的名詞」。(Docker 官方)
What is an image?
簡述:Docker 官方短片,說明 Image 是容器的藍圖,以及如何從 Docker Hub 取得 Image。(Docker 官方)
you need to learn Docker RIGHT NOW!! // Docker Containers 101
簡述:先講虛擬機、再講 Docker,用生動的比喻說明兩者差異,並實際啟動容器,對應本頁「容器和虛擬機有什麼不同?」。(NetworkChuck)
更多影片請見 影音教學。