National Taiwan University
Uedu Main Site
Explore Uedu
Student Console
Register as Member/Login
Research Informed Consent Center
Survey Center
Educational Big Data Challenge
Claim or create a course
Try a Scenario Task
Support & Messages
Uptime Data

UeduGPTs

--

Jupyters

1

Local AI

--

Uedu Code

--

台灣大學 AQI 70 24°C PM2.5 17
AI Reply Desktop Notifications

Show a desktop notification when the AI TA finishes replying

Chat Message Notifications

Notify me when classmates post messages in the forum

Sound notification

Play an alert sound whenever there is a new notification

Unit 02

安裝 Docker 與第一次執行

Docker 的組成與版本、docker version、hello-world
Interaction導覽 20 minute(s)

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 的狀態:目前有幾個容器、幾個執行中、有幾個映像檔、用哪一種儲存驅動程式等。

互動練習:第一次執行 Docker

這是一個 Docker 模擬器,按按鈕就會在終端機送出對應的指令。依右下角的任務操作:先用 docker version 確認 Docker 有在執行(也可以按 docker info 看看);再執行 hello-world 容器,注意它先說本機找不到映像檔、自動下載;接著用 docker container ls 與 ls -a 比較,找到已經結束的 hello-world 容器;最後用 docker image ls 看到下載下來的映像檔。

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. 1

    更新套件清單並安裝必要工具

    ca-certificates 與 curl 讓 apt 可以透過 HTTPS 下載官方套件庫的金鑰與套件。

  2. 2

    加入 Docker 官方套件庫的 GPG 金鑰

    金鑰用來驗證下載的套件確實來自 Docker 官方。投影片用的 apt-key add 已被 Ubuntu 淘汰,現在的做法是把金鑰放在 /etc/apt/keyrings/。

  3. 3

    加入 Docker 的 apt 套件庫

    告訴 apt 到 download.docker.com 找 Docker 的套件;$(. /etc/os-release && echo "$VERSION_CODENAME") 會自動填入你的 Ubuntu 版本代號(24.04 是 noble)。

  4. 4

    安裝 Docker Engine

    docker-ce 是 daemon,docker-ce-cli 是命令列工具(client),containerd.io 是底層實際管理容器的元件;另外兩個外掛提供 docker buildx 與 docker compose。裝好之後 daemon 會自動啟動。

  5. 5

    確認版本並跑 hello-world

    docker version 同時列出 Client 與 Server(daemon)的版本,兩段都有出現才代表 client 連得上 daemon。這時還沒有設定權限,所以先加 sudo。

  6. 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. 1

    Windows:先準備 WSL 2

    Windows 版的 Docker Desktop 建議使用 WSL 2(Windows Subsystem for Linux)當後端。以系統管理員身分開啟 PowerShell,執行 wsl --install,完成後依提示重新開機。已經裝過 WSL 的電腦可以用 wsl --status 確認預設版本是 2。

  2. 2

    安裝並啟動 Docker Desktop

    執行下載的安裝程式(Windows 安裝時保留「Use WSL 2」選項;macOS 依晶片選 Apple silicon 或 Intel 版本,拖進「應用程式」資料夾)。安裝完成後開啟 Docker Desktop,等左下角顯示 Engine running。每次要用 docker 指令前,Docker Desktop 都要是開著的,因為 daemon 在它裡面。

  3. 3

    在終端機確認版本

    開一個新的終端機(Windows 用 PowerShell,macOS 用「終端機」),輸入 docker version。注意 Client 的 OS/Arch 是 windows/amd64,Server 卻是 linux/amd64:你在 Windows 下指令,容器其實跑在背後的 Linux 環境裡。

  4. 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 的架構

1.

在終端機輸入 docker container run … 之後,真正負責下載映像檔並建立容器的是誰?

2.

docker version 只顯示 Client 的資訊,Server 那段出現連線錯誤,最可能的原因是?

3.

在 Windows 上用 Docker Desktop,docker version 的 Server OS/Arch 顯示 linux/amd64,這代表?

第 1 次作答

想一想:hello-world

1.

第一次執行 docker container run hello-world 看到 Unable to find image 'hello-world:latest' locally,接下來會發生什麼事?

2.

跑完 hello-world 之後,docker container ls 沒有任何容器,為什麼?

第 1 次作答

重點精華回顧

  • 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,但這等同給予系統管理員權限。
這一課完成了!
Next lesson:容器的生命週期
你目前沒有登入,學習進度只存在這個瀏覽器。 Login 後,進度會跟著帳號,換電腦也看得到。