Learning Objectives
- 認識 Docker 的產品:Linux 上的 Docker Engine 與 Windows/macOS 上的 Docker Desktop
- 說明 Docker 的架構:client、daemon、映像檔、容器、registry 各自負責什麼
- 在 Ubuntu 或 Windows/macOS 安裝 Docker,用 docker version、docker info 確認安裝
- 執行 hello-world,看懂它印出的四個步驟
Docker 有哪些版本
上一課知道 Docker 能把程式和環境一起裝箱。這一課先把 Docker 裝起來,再跑第一個容器。
你在網路上會看到好幾個名字,先整理清楚:
| 名稱 | 給誰用 | 說明 |
|---|---|---|
| Docker Engine | Linux 伺服器、Linux 桌機 | 開放原始碼的核心元件(daemon+命令列工具),在 Linux 上直接安裝;這就是投影片說的社群版(Community) |
| Docker Desktop | Windows、macOS(也有 Linux 版) | 圖形介面的桌面應用程式,裡面包含 Docker Engine,並在背後準備一個小型 Linux 環境來跑容器 |
| Docker Toolbox | 舊版 Windows/macOS | 已淘汰:舊系統用 VirtualBox 跑 Docker 的過渡方案,官方建議改裝 Docker Desktop |
| Enterprise Edition | 企業 | 投影片提到的企業版,2019 年已轉給 Mirantis 公司經營,課程不會用到 |
Docker Desktop 對個人、教育用途與小型企業免費;較大型企業的商業使用需要付費訂閱。授權條款會變動,請以 Docker 官方網站為準。
版本號碼:早期用「年.月」編號(例如 17.03 代表 2017 年 3 月);後來改成主版號(課文用 27.x 代表)。
Docker Engine 提供穩定版(stable)與測試版(test)等更新通道,一般使用請裝穩定版。
課文和模擬器裡的版本號都只是示意,你看到的數字可能不同,不影響學習。
Docker 的架構:誰在做事
Docker 採用用戶端/伺服器(client/server)架構:
| 元件 | 角色 | 說明 |
|---|---|---|
| Docker client | 你下指令的地方 | 就是終端機裡的 docker 指令;它本身不跑容器,只把要求送給 daemon |
Docker daemon(dockerd) |
真正做事的伺服器程式 | 在背景常駐,負責下載映像檔、建立與執行容器、管理網路與資料 |
| 映像檔(image) | 唯讀範本 | 由好幾個唯讀的層疊起來,可以放到 registry 給別人下載 |
| 容器(container) | 執行中的實例 | daemon 依映像檔建立;在任何 64 位元 Linux 核心上都能跑,主機上能跑的程式,容器裡大多也能跑 |
| Registry | 映像檔的倉庫 | 預設是 Docker Hub(hub.docker.com),也可以自己架 |
一個指令的旅程:
你輸入 docker container run …
│ (client 透過 API 送出要求)
▼
Docker daemon ──本機沒有這個映像檔──▶ Registry(Docker Hub)下載
│
▼
依映像檔建立容器並執行,輸出再傳回你的終端機
client 和 daemon 可以在不同台機器上,所以 docker version 會分成 Client 與 Server 兩段:
如果只看到 Client,Server 那段出現錯誤,通常代表 daemon 沒有啟動(或你沒有權限連到它)。
docker info 則列出 daemon 的狀態:目前有幾個容器、幾個執行中、有幾個映像檔、用哪一種儲存驅動程式等。
hello-world 做了哪些事
docker container run hello-world 是驗證安裝最快的方法。成功時會印出:
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
這四步剛好把上面的架構走一遍:
| 步驟 | 意思 | 對應的元件 |
|---|---|---|
| 1 | 你的 docker 指令聯絡上 daemon |
client → daemon |
| 2 | 本機沒有 hello-world 映像檔,daemon 到 Docker Hub 下載 |
daemon → registry |
| 3 | daemon 用這個映像檔建立一個新容器,執行裡面的程式 | 映像檔 → 容器 |
| 4 | 程式的輸出經由 daemon 傳回 client,顯示在你的終端機 | 容器 → daemon → client |
在第 1 行之前,你會先看到 Unable to find image 'hello-world:latest' locally:這不是錯誤,
只是說本機還沒有,接著就自動下載。第二次執行時已經有映像檔,就不會再下載。
hello-world 的程式印完訊息就結束,所以容器也跟著停止:docker container ls 看不到它,
要用 docker container ls -a 才看得到(STATUS 是 Exited (0))。
| 新式寫法 | 舊寫法 | 作用 |
|---|---|---|
docker image ls |
docker images |
列出本機的映像檔 |
docker container ls -a |
docker ps -a |
列出所有容器(含已停止) |
在 Ubuntu 安裝 Docker Engine
以下是 Ubuntu 24.04 的安裝流程摘要:加入 Docker 官方的 apt 套件庫,再用 apt 安裝。實際指令以 Docker 官方文件(docs.docker.com 的 Install Docker Engine on Ubuntu)為準,官方偶爾會調整金鑰與套件庫的設定方式。版本號碼是示意。
-
1
更新套件清單並安裝必要工具
ca-certificates與curl讓 apt 可以透過 HTTPS 下載官方套件庫的金鑰與套件。 -
2
加入 Docker 官方套件庫的 GPG 金鑰
金鑰用來驗證下載的套件確實來自 Docker 官方。投影片用的
apt-key add已被 Ubuntu 淘汰,現在的做法是把金鑰放在/etc/apt/keyrings/。 -
3
加入 Docker 的 apt 套件庫
告訴 apt 到 download.docker.com 找 Docker 的套件;
$(. /etc/os-release && echo "$VERSION_CODENAME")會自動填入你的 Ubuntu 版本代號(24.04 是noble)。 -
4
安裝 Docker Engine
docker-ce是 daemon,docker-ce-cli是命令列工具(client),containerd.io是底層實際管理容器的元件;另外兩個外掛提供docker buildx與docker compose。裝好之後 daemon 會自動啟動。 -
5
確認版本並跑 hello-world
docker version同時列出 Client 與 Server(daemon)的版本,兩段都有出現才代表 client 連得上 daemon。這時還沒有設定權限,所以先加sudo。 -
6
(選用)不打 sudo 也能用 docker
不加 sudo 執行會出現
permission denied,因為一般使用者沒有權限連到 daemon。把自己加進docker群組、登出再登入之後就可以直接用。注意:docker群組的成員等同擁有這台機器的系統管理員權限,只在自己的開發機或課程用的虛擬機這樣設定。
在 Windows 或 macOS 安裝 Docker Desktop
Windows 與 macOS 的核心不是 Linux,Docker Desktop 會在背後準備一個輕量的 Linux 環境來跑容器。下載點在 Docker 官方網站(docker.com 的 Docker Desktop 頁面),安裝需求以官方文件為準。
-
1
Windows:先準備 WSL 2
Windows 版的 Docker Desktop 建議使用 WSL 2(Windows Subsystem for Linux)當後端。以系統管理員身分開啟 PowerShell,執行
wsl --install,完成後依提示重新開機。已經裝過 WSL 的電腦可以用wsl --status確認預設版本是 2。 -
2
安裝並啟動 Docker Desktop
執行下載的安裝程式(Windows 安裝時保留「Use WSL 2」選項;macOS 依晶片選 Apple silicon 或 Intel 版本,拖進「應用程式」資料夾)。安裝完成後開啟 Docker Desktop,等左下角顯示 Engine running。每次要用 docker 指令前,Docker Desktop 都要是開著的,因為 daemon 在它裡面。
-
3
在終端機確認版本
開一個新的終端機(Windows 用 PowerShell,macOS 用「終端機」),輸入
docker version。注意 Client 的 OS/Arch 是windows/amd64,Server 卻是linux/amd64:你在 Windows 下指令,容器其實跑在背後的 Linux 環境裡。 -
4
跑 hello-world,並查看映像檔與容器
和 Linux 上的結果一樣。跑完之後用
image ls看映像檔、用container ls -a看已結束的容器;Docker Desktop 的 Images 與 Containers 頁面也會出現同樣的項目。如果出現error during connect或Cannot connect to the Docker daemon,多半是 Docker Desktop 還沒啟動完成。
Docker 的生命週期預告
投影片用「生老病死」來形容容器與映像檔的一生,下一課會逐一操作:
| 階段 | 意思 | 指令(下一課起使用) |
|---|---|---|
| Birth(誕生) | 建立並啟動容器 | docker container run |
| Sleep(休眠) | 停止容器 | docker container stop |
| Wake(喚醒) | 再次啟動容器 | docker container start |
| Death(結束) | 移除已停止的容器 | docker container rm |
| Extinction(消失) | 刪除映像檔 | docker image rm |
整體的運作模式:用 Dockerfile 配合 docker image build 建立映像檔 → 用 docker container run 把映像檔跑成容器 →
在 Docker Hub 建立帳號、上傳映像檔分享給別人。
想一想:Docker 的架構
在終端機輸入 docker container run … 之後,真正負責下載映像檔並建立容器的是誰?
docker version 只顯示 Client 的資訊,Server 那段出現連線錯誤,最可能的原因是?
在 Windows 上用 Docker Desktop,docker version 的 Server OS/Arch 顯示 linux/amd64,這代表?
想一想:hello-world
第一次執行 docker container run hello-world 看到 Unable to find image 'hello-world:latest' locally,接下來會發生什麼事?
跑完 hello-world 之後,docker container ls 沒有任何容器,為什麼?
重點精華回顧
- Linux 上安裝開放原始碼的 Docker Engine;Windows/macOS 安裝 Docker Desktop(Windows 建議搭配 WSL 2)。Docker Toolbox 已淘汰。
- Docker 是 client/server 架構:
docker指令(client)把要求送給 daemon(dockerd),daemon 負責映像檔與容器;映像檔預設從 Docker Hub 下載。 docker version要同時看到 Client 與 Server;docker info列出容器、映像檔數量與 daemon 設定。- hello-world 的四步:client 聯絡 daemon → daemon 從 Docker Hub 下載映像檔 → 建立容器執行 → 輸出傳回終端機。
- hello-world 執行完容器就停止,
docker container ls -a才看得到;docker image ls看得到下載的映像檔。 - Ubuntu 上一般使用者要加入
docker群組才能不打 sudo,但這等同給予系統管理員權限。