返回文章列表

Docker 容器化入門:建置與運行首個應用

本文闡述 Docker 容器化技術的基礎實踐,以經典的「Hello World」應用為例,展示從下載映像檔、啟動容器到檢視輸出的完整流程。內容涵蓋 Docker 的核心指令,包括 `docker pull`、`docker run` 與 `docker ps`,並說明如何透過 `docker rm` 與

容器技術 軟體開發

在現代軟體開發與部署流程中,確保應用程式在不同環境下的一致性是關鍵挑戰。傳統虛擬機雖能隔離環境,卻因資源開銷龐大而顯得笨重。Docker 作為輕量級容器化技術的代表,徹底改變了此一局面。它將應用程式及其所有相依套件打包至標準化的「映像檔」(Image),實現「一次建置,到處運行」的理想。當映像檔被啟動時,便會生成一個獨立、可執行的「容器」(Container),在隔離環境中運行,不僅確保一致性,更大幅提升資源利用率與部署效率。本文將從基礎實踐出發,引導讀者掌握 Docker 核心操作,體驗容器化帶來的變革。

Docker 入門實踐:建置與運行首個容器化應用

體驗 Docker:運行「Hello World」容器

Docker 的核心魅力在於其簡潔高效的應用程式封裝與運行能力。要親身體驗這一點,最直接的方式就是運行一個經典的「Hello World」應用程式容器。這個過程將引導我們完成下載 Docker 映像檔、啟動容器、查看輸出,以及清理資源的完整流程。

1. 下載 Docker 映像檔

Docker 映像檔是運行容器的藍圖。對於「Hello World」應用,Docker Hub 上提供了官方的映像檔。我們需要使用 docker pull 命令來下載它。

docker pull hello-world

執行此命令後,Docker 會從 Docker Hub 下載 hello-world 映像檔。如果映像檔已經存在於本地,則會使用本地版本。下載過程會顯示下載的層級和進度。

2. 運行 Docker 容器

下載映像檔後,我們就可以使用 docker run 命令來啟動一個容器。這個命令會基於指定的映像檔創建一個新的容器,並執行其中定義的預設命令。

docker run hello-world

當這個命令執行時,Docker 會:

  • 檢查本地是否存在 hello-world 映像檔。
  • 如果不存在,則會嘗試從 Docker Hub 下載。
  • 基於映像檔創建一個新的容器。
  • 在容器內執行映像檔預設的啟動命令。
  • 容器執行完畢後,通常會自動退出。

3. 查看應用程式輸出

「Hello World」容器的預設命令是輸出一段歡迎訊息,說明 Docker 安裝成功,並解釋了容器的工作原理。這段訊息會直接顯示在終端介面上。

輸出內容大致如下:

Hello from Docker!
This message shows that your installation appears to be working.

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.
    (assuming it was not already locally available.)
 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.

To try something more ambitious, you can run our Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

這段訊息清楚地表明,Docker 已經成功安裝並運行,並且能夠從 Docker Hub 下載映像檔並執行容器。

4. 列出正在運行的 Docker 容器

即使「Hello World」容器執行完畢後就退出了,我們也可以使用 docker ps 命令來查看當前正在運行的容器。

docker ps

由於「Hello World」容器執行後即退出,docker ps 命令預設不會顯示它。若要查看所有容器(包括已退出的),需要加上 -a 參數:

docker ps -a

這個命令會列出所有容器的 ID、映像檔、啟動時間、狀態(例如 Exited (0) ... 表示成功退出)以及命令。

5. 停止和移除容器

對於已退出的容器,我們通常需要移除它們以釋放資源。使用 docker rm 命令來移除指定的容器,需要提供容器的 ID 或名稱。

首先,找到要移除的容器 ID (例如,從 docker ps -a 的輸出中獲取):

docker rm <CONTAINER_ID>

例如:docker rm a1b2c3d4e5f6

6. 移除 Docker 映像檔

如果不再需要某個映像檔,也可以使用 docker rmi 命令將其從本地移除,以釋放磁碟空間。

docker rmi hello-world

7. 停止 Docker 服務

在某些情況下,可能需要停止 Docker 服務本身。這通常在 Linux 系統中使用 systemctl 命令來完成:

sudo systemctl stop docker

透過以上步驟,我們不僅運行了第一個 Docker 應用,還掌握了 Docker 的基本生命週期管理:下載映像檔、運行容器、查看輸出、管理容器和映像檔,以及控制 Docker 服務。

@startuml
!define DISABLE_LINK
!define PLANTUML_FORMAT svg
!theme _none_

skinparam dpi auto
skinparam shadowing false
skinparam linetype ortho
skinparam roundcorner 5
skinparam defaultFontName "Microsoft JhengHei UI"
skinparam defaultFontSize 16
skinparam minClassWidth 100

object "使用者" as User
object "Docker CLI" as DockerCLI
object "Docker Daemon" as DockerDaemon
object "Docker Image (hello-world)" as HelloWorldImage
object "Docker Container (hello-world)" as HelloWorldContainer

partition "Docker Hello World 應用運行流程" {
  User --> DockerCLI : 執行 docker pull hello-world
  DockerCLI --> DockerDaemon : 請求下載映像檔
  DockerDaemon --> HelloWorldImage : 從 Docker Hub 下載映像檔
  User --> DockerCLI : 執行 docker run hello-world
  DockerCLI --> DockerDaemon : 請求運行容器
  DockerDaemon --> HelloWorldContainer : 基於映像檔創建並啟動容器
  HelloWorldContainer --> DockerDaemon : 執行預設命令並輸出訊息
  DockerDaemon --> DockerCLI : 傳送容器輸出
  DockerCLI --> User : 顯示應用程式輸出
  User --> DockerCLI : 執行 docker ps -a
  DockerCLI --> DockerDaemon : 請求列出所有容器
  DockerDaemon --> HelloWorldContainer : 提供容器狀態
  DockerCLI --> User : 顯示容器列表
  User --> DockerCLI : 執行 docker rm <CONTAINER_ID>
  DockerCLI --> DockerDaemon : 請求移除容器
  DockerDaemon --> HelloWorldContainer : 終止並移除容器
  User --> DockerCLI : 執行 docker rmi hello-world
  DockerCLI --> DockerDaemon : 請求移除映像檔
  DockerDaemon --> HelloWorldImage : 從本地移除映像檔
}

@enduml

看圖說話:

此圖示詳細展示了運行 Docker「Hello World」應用程式的完整流程。首先,使用者透過 Docker CLI(命令列介面)執行 docker pull hello-world 命令,請求 Docker Daemon 從 Docker Hub 下載 hello-world 映像檔。下載完成後,使用者接著執行 docker run hello-world 命令。Docker Daemon 接收到請求後,會基於下載好的 hello-world 映像檔創建一個新的 Docker 容器,並在其中執行預設的應用程式命令。該應用程式執行後會產生一段輸出訊息,Docker Daemon 會將此輸出訊息傳送回 Docker CLI,最終顯示在終端介面上,讓使用者確認 Docker 安裝成功。為了查看容器的運行狀態,使用者可以執行 docker ps -a 命令,Docker Daemon 會回報所有容器(包括已退出的)的列表。當不再需要該容器時,使用者可以使用 docker rm <CONTAINER_ID> 命令請求 Docker Daemon 移除容器。若要釋放磁碟空間,使用者還可以使用 docker rmi hello-world 命令請求 Docker Daemon 從本地移除 hello-world 映像檔。整個流程體現了 Docker CLI 與 Docker Daemon 之間的協同工作,以及映像檔、容器和訊息流動的關係。

設定運行環境:Amazon EC2 實例的選擇

為了進行 Docker 的實際部署和應用,選擇合適的雲端計算資源是必要的。本節將探討如何在 Amazon Elastic Compute Cloud (EC2) 上選擇合適的 Linux 實例來運行 Docker。

選擇 Linux 發行版

Docker 運行在 Linux 核心之上,因此需要一個 Linux 作業系統作為基礎。出於對 64 位元軟體支援的需求,我們需要選擇支援 64 位元的 Linux 發行版。文中提到了兩個常用的 Amazon Machine Images (AMIs):

  1. Ubuntu Server 14.04 LTS (HVM), SSD Volume Type:Ubuntu 是一個廣受歡迎的 Linux 發行版,以其易用性和龐大的社群支援而聞名。LTS (Long Term Support) 版本提供了較長的支援週期。
  2. Red Hat Enterprise Linux version 7.1 (HVM), EBS General Purpose (SSD):Red Hat Enterprise Linux (RHEL) 是企業級 Linux 的標準,以其穩定性和安全性著稱。版本 7.1 是當時較新的穩定版本。

這兩個選項都提供了 64 位元的環境,足以運行 Docker 引擎和各種容器化應用。

實例類型與磁碟選項

  • HVM (Hardware Virtual Machine):表示實例類型支援完全虛擬化,這對於運行 Docker 這類需要直接存取作業系統核心的技術至關重要。
  • SSD Volume Type / EBS General Purpose (SSD):這指的是實例的儲存選項。SSD(固態硬碟)提供了比傳統 HDD(硬碟)更快的讀寫速度,對於需要頻繁讀寫的 Docker 映像檔和容器日誌來說,SSD 能夠顯著提升效能。EBS (Elastic Block Store) 是 AWS 的塊儲存服務,General Purpose (SSD) 是一種性價比高的 SSD 選項。

選擇合適的 EC2 實例類型(如 t2.micro, m5.large 等)以及磁碟配置,將直接影響 Docker 運行時的效能和成本。對於初學者和測試目的,較小的實例類型(如 t2.micro)通常是足夠的。

深入剖析這段從本地端「Hello World」到雲端環境建置的實踐路徑後,我們不僅是完成了一次技術操作,更是體驗了一場關於應用程式封裝與部署的思維革命。hello-world 的瞬間啟動,看似簡單,實則深刻地對比了傳統部署模式中環境配置與依賴管理的繁瑣,展現了容器化在效率與一致性上的典範轉移。

將此概念延伸至 EC2 的環境選擇,則揭示了從單點實驗到系統化部署的專業考量。對 Linux 發行版、虛擬化技術(HVM)與儲存效能(SSD)的權衡,標誌著技術人員已從「讓它運行」的初階思維,提升至「讓它高效、穩定地運行」的架構師視角。此過程的真正價值,在於將抽象的容器化理念,轉化為具備效能與成本意識的落地決策。

展望未來,容器化已非選修技能,而是構成現代軟體開發生命週期的基礎設施。掌握 Docker 不僅是學會一組指令,更是理解一種解耦、可擴展的架構哲學,為進入 Kubernetes 等更宏大的雲原生生態系奠定基石。

玄貓認為,將 Docker 從一項工具技能內化為一種核心開發哲學,是技術專業人士在當代技術浪潮中,實現自我突破並維持長期競爭力的關鍵投資。