跳轉到

任務二:安裝 Docker 並執行第一個容器

開始之前

任務目標

在這個任務中,你將學習:

  • 在自己的作業系統上安裝 Docker
  • 理解 Docker CLI 的基本命令結構
  • 學會映像檔的基本操作(pull、images、inspect、tag、rmi)
  • 掌握容器的生命週期管理(run、start、stop、restart、rm)
  • 使用常用的容器執行參數(-d、-it、--name、--rm)
  • 透過實作練習執行第一個容器

安裝 Docker

在開始使用 Docker 之前,我們需要先在自己的電腦上安裝 Docker。Docker 支援 Linux、Windows 和 macOS 三種主流作業系統,但安裝方式略有不同。請根據你的作業系統選擇對應的安裝步驟。

使用 Docker Desktop

Windows 使用者建議安裝 Docker Desktop for Windows,這是 Docker 官方提供的圖形化工具。

系統需求:

  • Windows 10/11 64-bit(Pro、Enterprise 或 Education 版本)
  • 必須啟用 WSL 2(Windows Subsystem for Linux 2)
  • 至少 4GB RAM

安裝步驟:

  1. 前往 Docker Desktop 下載頁面
  2. 下載 Windows 版本的安裝檔
  3. 執行安裝檔,按照指示完成安裝
  4. 安裝過程中會要求啟用 WSL 2,請按照提示操作
  5. 安裝完成後重新啟動電腦

啟動 Docker Desktop 後,你會在系統匣看到 Docker 圖示,表示 Docker 已經在背景執行。

使用 Docker Desktop for Mac

macOS 使用者建議安裝 Docker Desktop for Mac

系統需求:

  • macOS 11(Big Sur)或更新版本
  • Apple Silicon(M1/M2)或 Intel 晶片的 Mac
  • 至少 4GB RAM

安裝步驟:

  1. 前往 Docker Desktop 下載頁面
  2. 根據你的晶片類型選擇對應版本:
    • Apple Silicon(M1/M2):下載 Apple Silicon 版本
    • Intel:下載 Intel 版本
  3. 下載 .dmg 檔案後,將 Docker 圖示拖曳到「應用程式」資料夾
  4. 開啟「應用程式」資料夾,雙擊 Docker 圖示啟動
  5. 第一次啟動時會要求授予權限,請按照提示操作

啟動成功後,你會在選單列看到 Docker 圖示。

使用套件管理器安裝

以 Ubuntu/Debian 為例,最快的安裝方式是使用官方提供的便利腳本:

curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh

安裝完成後,將你的使用者加入 docker 群組,這樣就不需要每次都使用 sudo

sudo usermod -aG docker $USER

登出後重新登入,讓群組設定生效。

其他發行版:

  • CentOS/RHEL:使用 yumdnf 安裝
  • Arch Linux:使用 pacman -S docker
  • Fedora:使用 dnf install docker-ce

詳細步驟請參考 Docker 官方文件 - Linux 安裝指南

驗證安裝

無論使用哪種作業系統,安裝完成後都應該驗證 Docker 是否正常運作。開啟終端機(Linux/macOS)或命令提示字元(Windows),執行以下指令:

docker version

如果安裝成功,你會看到類似以下的輸出,顯示 Docker 的客戶端和伺服器版本資訊:

Client: Docker Engine - Community
 Version:           24.0.7
 API version:       1.43
 ...

Server: Docker Engine - Community
 Engine:
  Version:          24.0.7
  API version:      1.43 (minimum version 1.12)
  ...

你也可以使用 docker info 來查看更詳細的系統資訊:

docker info

這個指令會顯示 Docker 的執行狀態、儲存驅動程式、已安裝的映像檔和容器數量等資訊。

Docker CLI 基礎

Docker 的所有操作都是透過命令列介面(CLI)完成的。理解 Docker CLI 的命令結構,能幫助你更快上手各種操作。

命令結構

Docker CLI 的基本結構非常一致:

docker <command> [options] [arguments]

說明:

  • docker:Docker CLI 的執行檔名稱
  • <command>:要執行的指令,例如 pullrunstop
  • [options]:可選的參數,通常以 --- 開頭
  • [arguments]:指令需要的參數,例如映像檔名稱、容器 ID 等

範例:

# 拉取 nginx 映像檔
docker pull nginx

# 以背景模式執行 nginx 容器,並命名為 web-server
docker run -d --name web-server nginx

# 停止名為 web-server 的容器
docker stop web-server

使用幫助指令

Docker 提供了完善的說明文件,你隨時可以透過 --help 參數查詢指令用法。

查看所有可用指令:

docker --help

這會列出所有 Docker 指令的簡短說明,例如:

Usage:  docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Commands:
  pull        Pull an image or a repository from a registry
  run         Run a command in a new container
  ps          List containers
  images      List images
  ...

查看特定指令的詳細說明:

如果你想了解某個指令的詳細用法,可以在指令後加上 --help

docker run --help

這會顯示 docker run 的所有可用參數和使用範例。養成使用 --help 的習慣,能讓你快速找到需要的資訊,而不需要每次都查閱線上文件。

映像檔操作

在任務一中我們學到,映像檔(Image)是容器的模板。在啟動容器之前,我們需要先取得映像檔。Docker 提供了一系列指令來管理本地的映像檔。

拉取映像檔:docker pull

docker pull 用於從 Docker Hub 或其他映像檔倉庫下載映像檔到本地。

基本用法:

docker pull [OPTIONS] NAME[:TAG]

範例:

# 拉取最新版本的 nginx 映像檔(預設 tag 為 latest)
docker pull nginx

# 拉取特定版本的 nginx 映像檔
docker pull nginx:1.25

# 拉取特定平台的映像檔
docker pull --platform linux/amd64 nginx

當你執行 docker pull 時,Docker 會顯示下載進度。映像檔通常由多個層(layer)組成,Docker 會平行下載這些層以加快速度。

列出映像檔:docker images

docker images 列出本地已下載的所有映像檔。

基本用法:

docker images [OPTIONS] [REPOSITORY[:TAG]]

範例:

# 列出所有映像檔
docker images

# 只列出 nginx 相關的映像檔
docker images nginx

輸出欄位說明:

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
nginx         latest    a6bd71f48f68   2 weeks ago    187MB
  • REPOSITORY:映像檔名稱
  • TAG:映像檔標籤,通常用於標記版本
  • IMAGE ID:映像檔的唯一識別碼
  • CREATED:映像檔建立時間
  • SIZE:映像檔大小

檢視映像檔詳情:docker inspect

docker inspect 顯示映像檔的詳細資訊,包含設定、環境變數、建立時間等,輸出為 JSON 格式。

基本用法:

docker inspect [OPTIONS] IMAGE [IMAGE...]

範例:

# 檢視 nginx 映像檔的詳細資訊
docker inspect nginx

# 使用 --format 提取特定欄位(例如:建立時間)
docker inspect --format='{{.Created}}' nginx

這個指令在除錯或了解映像檔內部設定時非常有用。

標籤映像檔:docker tag

docker tag 為映像檔建立一個新的標籤(別名)。這在為映像檔標記版本或準備推送到不同的映像檔倉庫時很有用。

基本用法:

docker tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]

範例:

# 為 nginx 映像檔建立一個標籤
docker tag nginx nginx:my-version

# 為推送到私有倉庫準備標籤
docker tag nginx my-registry.com/nginx:1.0

標籤不會複製映像檔,只是建立一個新的引用(reference)指向同一個映像檔,因此不會佔用額外的硬碟空間。

刪除映像檔:docker rmi

docker rmi 刪除本地的映像檔。

基本用法:

docker rmi [OPTIONS] IMAGE [IMAGE...]

範例:

# 刪除單一映像檔(使用名稱或 ID)
docker rmi nginx

# 刪除多個映像檔
docker rmi nginx redis

# 強制刪除(即使有容器正在使用)
docker rmi -f nginx

注意: 如果有容器正在使用該映像檔,Docker 會拒絕刪除。你需要先停止並刪除使用該映像檔的容器,或使用 -f 參數強制刪除(不建議)。

容器生命週期

容器從建立到刪除會經歷不同的狀態。理解容器的生命週期,能幫助你更有效地管理容器。

執行容器:docker run

docker run 是最常用的指令,它會根據指定的映像檔建立並啟動一個新容器。

基本用法:

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

範例:

# 執行一個 nginx 容器
docker run nginx

# 以背景模式執行,並映射連接埠
docker run -d -p 8080:80 nginx

# 執行後進入容器的 shell
docker run -it ubuntu bash

docker run 實際上結合了 docker createdocker start 兩個步驟。如果本地沒有指定的映像檔,Docker 會自動先執行 docker pull 下載。

啟動已停止的容器:docker start

docker start 啟動一個已經存在但處於停止狀態的容器。

基本用法:

docker start [OPTIONS] CONTAINER [CONTAINER...]

範例:

# 啟動名為 web-server 的容器
docker start web-server

# 啟動容器並附加到其輸出(類似 docker run 的互動模式)
docker start -a web-server

與 docker run 的差別:

  • docker run 每次都會建立新的容器
  • docker start 重新啟動已存在的容器,保留之前的狀態和資料

停止容器:docker stop

docker stop 優雅地停止一個執行中的容器。Docker 會先發送 SIGTERM 訊號,等待容器自行關閉;如果容器在一定時間內(預設 10 秒)沒有停止,Docker 會發送 SIGKILL 強制終止。

基本用法:

docker stop [OPTIONS] CONTAINER [CONTAINER...]

範例:

# 停止名為 web-server 的容器
docker stop web-server

# 停止多個容器
docker stop web-server db-server

# 設定等待時間為 30 秒
docker stop -t 30 web-server

重啟容器:docker restart

docker restart 重新啟動一個容器,相當於先執行 docker stop 再執行 docker start

基本用法:

docker restart [OPTIONS] CONTAINER [CONTAINER...]

範例:

# 重啟名為 web-server 的容器
docker restart web-server

# 設定停止等待時間為 5 秒
docker restart -t 5 web-server

這個指令在容器出現問題需要重啟,或是更新設定後需要重新載入時很有用。

刪除容器:docker rm

docker rm 刪除一個或多個已停止的容器。

基本用法:

docker rm [OPTIONS] CONTAINER [CONTAINER...]

範例:

# 刪除名為 web-server 的容器
docker rm web-server

# 刪除多個容器
docker rm web-server db-server

# 強制刪除執行中的容器
docker rm -f web-server

注意: 預設情況下,Docker 不允許刪除執行中的容器。你需要先停止容器,或使用 -f 參數強制刪除。

清理停止的容器:

如果你想一次刪除所有已停止的容器,可以使用:

docker container prune

這個指令會要求確認後刪除所有停止狀態的容器。

常用執行參數

docker run 提供了許多參數來控制容器的行為。以下是幾個最常用的參數。

背景執行模式:-d

-d(detach)讓容器在背景執行,而不是佔用目前的終端機視窗。

範例:

# 在背景執行 nginx 容器
docker run -d nginx

# 背景執行並查看容器 ID
docker run -d --name my-nginx nginx

使用 -d 後,Docker 會回傳容器的 ID,容器會繼續在背景執行。你可以使用 docker ps 查看執行中的容器。

何時使用:

  • 執行長時間運作的服務(如 Web 伺服器、資料庫)
  • 不需要與容器互動時
  • 想讓容器在背景持續執行

互動模式:-it

-it 是兩個參數的組合:

  • -i(interactive):保持標準輸入(stdin)開啟
  • -t(tty):分配一個偽終端機

這兩個參數通常一起使用,讓你可以與容器內的程式互動。

範例:

# 啟動 Ubuntu 容器並進入 bash shell
docker run -it ubuntu bash

# 啟動 Python 容器並進入 Python 互動環境
docker run -it python:3.11

# 進入已執行的容器(使用 docker exec)
docker exec -it my-container bash

何時使用:

  • 需要在容器內執行命令或除錯
  • 執行互動式程式(如 shell、REPL)
  • 測試或開發時需要手動操作

退出互動模式:

  • 輸入 exit 或按 Ctrl+D:退出並停止容器
  • Ctrl+P 然後 Ctrl+Q:退出但保持容器執行(僅限 docker run -it 時)

容器命名:--name

--name 為容器指定一個易於識別的名稱。如果不指定,Docker 會自動產生一個隨機名稱。

範例:

# 為容器命名為 web-server
docker run -d --name web-server nginx

# 之後可以直接使用名稱操作容器
docker stop web-server
docker start web-server
docker rm web-server

優點:

  • 比使用容器 ID 更容易記憶和操作
  • 讓容器的用途一目了然
  • 避免名稱衝突(同名容器無法同時存在)

自動移除:--rm

--rm 讓容器停止後自動刪除,不會留下停止狀態的容器。

範例:

# 執行一次性任務,完成後自動清理
docker run --rm ubuntu echo "Hello, Docker!"

# 執行測試,測試完成後自動刪除容器
docker run --rm -it python:3.11 python -c "print('Test')"

何時使用:

  • 執行一次性指令或測試
  • 不需要保留容器的執行紀錄
  • 避免累積大量停止的容器

注意: --rm-d 可以一起使用,但要確保容器會自行停止,否則容器會一直執行直到手動停止。

實作練習

現在讓我們透過實作練習來鞏固學到的指令。我們會執行兩個不同類型的容器,體驗背景服務和互動式操作。

練習一:執行 nginx Web 伺服器

nginx 是一個輕量級的 Web 伺服器,非常適合作為第一個容器練習。

步驟:

  1. 拉取 nginx 映像檔

    docker pull nginx
    
  2. 以背景模式執行 nginx 容器,並映射連接埠

    docker run -d -p 8080:80 --name my-nginx nginx
    

    參數說明:

    • -d:背景執行
    • -p 8080:80:將容器的 80 連接埠映射到主機的 8080 連接埠
    • --name my-nginx:將容器命名為 my-nginx
  3. 驗證容器是否正在執行

    docker ps
    

    你應該會看到 my-nginx 容器出現在列表中。

  4. 透過瀏覽器驗證

    開啟瀏覽器,前往 http://localhost:8080,你應該會看到 nginx 的歡迎頁面:

    Welcome to nginx!
    
  5. 查看容器日誌

    docker logs my-nginx
    

    這會顯示 nginx 的存取記錄。

  6. 停止並刪除容器

    docker stop my-nginx
    docker rm my-nginx
    

練習二:使用 busybox 互動式操作

busybox 是一個輕量級的 Linux 工具集,非常適合練習互動模式。

步驟:

  1. 執行 busybox 容器並進入 shell

    docker run -it --name my-busybox busybox sh
    

    參數說明:

    • -it:互動模式
    • --name my-busybox:將容器命名為 my-busybox
    • sh:在容器內執行 shell

    你應該會看到容器內的 shell 提示符:

    / #
    
  2. 在容器內執行一些指令

    # 查看當前目錄
    pwd
    
    # 列出檔案
    ls
    
    # 建立一個檔案
    echo "Hello from Docker!" > hello.txt
    
    # 查看檔案內容
    cat hello.txt
    
    # 查看系統資訊
    uname -a
    
  3. 退出容器

    exit
    

    輸入 exit 後,容器會停止執行。

  4. 重新啟動容器並檢查檔案是否還在

    docker start -a -i my-busybox
    

    參數說明:

    • -a:附加到容器的輸出
    • -i:互動模式

    進入容器後,執行:

    cat hello.txt
    

    你應該會看到之前建立的檔案還在!這證明了容器的資料在停止後會保留。

  5. 清理容器

    退出容器後,刪除它:

    docker rm my-busybox
    

嘗試使用 --rm 參數:

現在試試使用 --rm 參數,容器停止後會自動刪除:

docker run -it --rm busybox sh

在容器內建立檔案,然後 exit 退出。再次執行 docker ps -a 檢查,你會發現容器已經不存在了。

任務結束

完成!

恭喜你完成了這個任務!現在你已經學會:

  • 在自己的作業系統上安裝 Docker
  • 理解 Docker CLI 的基本命令結構
  • 學會映像檔的基本操作(pull、images、inspect、tag、rmi)
  • 掌握容器的生命週期管理(run、start、stop、restart、rm)
  • 使用常用的容器執行參數(-d、-it、--name、--rm)
  • 透過實作練習執行第一個容器

你現在已經具備了 Docker 的基礎操作能力!在下一個任務中,我們將學習如何建立自己的映像檔,讓容器執行你自己的應用程式。