返回文章列表

Docker 容器技術入門與實踐

本文介紹 Docker 容器技術的核心概念、架構、優點以及與 Linux 容器的差異,並提供一個以 WordPress 為例的實際應用案例,說明如何使用 Docker 簡化佈署流程。文章也涵蓋 Docker 的基本指令操作、安裝以及未來展望,適合 DevOps 工程師與後端開發者學習。

容器技術 DevOps

Docker 的出現簡化了容器技術的使用,使其更易於上手和管理。相較於 Linux 容器(LXC),Docker 在程式管理、持久化儲存和可移植性方面都有顯著的改進。Docker 容器通常只執行單一程式,提升了微服務架構的靈活性;透過 Docker 卷解決了持久化儲存的問題;而 Docker 映像檔的設計則大幅提升了應用程式在不同環境間的可移植性。Docker 採用客戶端-伺服器架構,客戶端與 Docker Daemon 互動,而 Daemon 負責管理容器的生命週期。Docker 的核心元件包含 Docker 映像檔、容器、伺服器、客戶端和 Registry。Docker 映像檔是唯讀範本,用於建立容器;Docker 容器則是映像檔的執行例項;Docker Registry 儲存和分享映像檔。Dockerfile 是一個文字檔案,定義了構建映像檔的步驟。Docker Machine 則用於管理 Docker 主機,Docker Swarm 負責容器的叢集管理,Docker Compose 則簡化了多容器應用程式的定義和執行。Docker 的輕量化設計、可移植性、可重用性、快速佈署和高資源利用率使其在現代 DevOps 流程中扮演著重要的角色。相較於傳統虛擬機器,Docker 容器不包含完整的作業系統,因此更輕量且啟動速度更快。此外,Docker 容器的環境一致性也簡化了應用程式在不同環境中的佈署。

容器技術簡介

在討論 Docker 之前,我們先了解一下容器技術的基本概念。容器技術並非新興事物,它已經存在多年,但在 Docker 出現之前,並未廣泛應用。容器技術可以追溯到 Linux 容器(LXC),這些容器最初設計為輕量級的虛擬化解決方案。Docker 的出現使得容器技術變得更加流行,因為它引入了一系列改進,讓容器更加便捷、可移植且靈活。

Docker 與 Linux 容器的差異

Docker 和 LXC 之間有一些關鍵的區別:

  • 程式管理: 在 LXC 中,你可以在同一個容器內執行多個程式。相比之下,Docker 容器通常只執行一個程式。如果你的應用程式由多個程式組成,你需要執行相同數量的 Docker 容器。這種設計雖然增加了容器管理的複雜度,但它提供了更高的靈活性和微服務架構所需的細粒度控制。

  • 持久化儲存: Docker 容器本質上是無狀態的,不支援持久化儲存。你需要透過掛載 Docker 捲動磁碟(Docker Volumes)來實作外部儲存。

  • 可移植性: Docker 提供了比 LXC 更好的可移植性。LXC 的可移植性受限於不同主機上的組態差異。Docker 透過抽象化作業系統、網路和儲存細節,確保了應用程式在不同環境中的一致性。這使得開發者可以輕鬆地從開發環境將容器映像(images)移動到生產環境中。

基本容器架構

下圖展示了基本的容器架構:

此圖示解說:

  1. 應用程式:包含所需的所有依賴項。
  2. 依賴項:例如目錄結構、函式庫、程式空間等。
  3. 容器引擎:管理和執行應用程式的軟體。
  4. 宿主作業系統:執行容器引擎的底層作業系統。
  5. 伺服器基礎設施:提供計算資源的物理或虛擬機器。

Docker 架構與元件

Docker 採用客戶端-伺服器架構,客戶端與 Docker Daemon(守護程式)進行通訊,Daemon 提供所有必要的服務來管理和執行容器。以下是 Docker 生態系統中的主要元件:

Docker 元件介紹

  • Docker Server 或 Daemon: 這是執行在宿主機上的守護程式,負責管理所有在該機器上執行的容器。

  • Docker 容器: 每個 Docker 容器都是一個獨立的虛擬系統,包含執行應用程式所需的所有檔案、依賴項、程式空間和埠號。由於每個容器都有所有可用埠號,因此需要在 Docker 層次上進行對映。

  • Docker Client: 使用者介面或命令列介面,用於與 Docker Daemon 進行通訊。

  • Docker Images: 離線範本檔案是唯讀檔案,可以移動和分發。與虛擬機器不同的是,這些檔案可以進行版本控制。你可以使用 docker diff 檢視兩個映像之間的變更。每個映像由多個層次組成,這些層次可能會在不同映像之間分享。如果你需要升級現有應用程式,更新將建立一個新層次在現有映像之上。這意味著你只需要傳輸和佈署新層次,從而使整個過程更輕量級和更快速。

舉例說明:

假設我們有一個簡單的 Python 應用程式並希望將其封裝成 Docker 態象:

# 基礎映像使用官方 Python 態象
FROM python:3.9-slim

# 設定工作目錄
WORKDIR /app

# 複製應用程式檔案到容器內
COPY . /app

# 安裝所需的依賴項
RUN pip install --no-cache-dir -r requirements.txt

# 暴露應用程式執行的埠號
EXPOSE 5000

# 啟動應用程式
CMD ["python", "app.py"]

內容解密:

  1. FROM python:3.9-slim:指定基礎映像為官方 Python 態象(slim 版本),這是一個輕量級版本。
  2. WORKDIR /app:設定工作目錄為 /app
  3. COPY . /app:將當前目錄中的所有檔案複製到 /app
  4. RUN pip install –no-cache-dir -r requirements.txt:安裝應用程式所需的依賴項。
  5. EXPOSE 5000:暴露應用程式執行所需的埠號(5000)。
  6. CMD [“python”, “app.py”]:設定預設命令為啟動 app.py

這樣就建立了一個完整且可移植的 Python 應用程式映像。

  • Docker Registry: 儲存及分享 Docker 態象之倉函式庫。著名的 Registry 有 Docker Hub(類別似 GitHub),允許你提取或推播公共或私有存取許可權之態象。

  • Dockerfile: 一個簡單文字檔案,指定如何建立自訂軟體之指令。可設定安裝軟體、環境變數、工作目錄等設定。

  • Docker Machine: 用於在本地或雲端建立及管理 Docker 主機。可以直接連線各大雲端服務提供者如 Amazon 或 Microsoft Azure。

  • Docker Swarm: 提供原生叢集能力,將多個 Docker 節點組成一個大型 Docker 主機。Swarm 模式支援負載平衡及服務發現功能。

  • Docker Compose: 用於定義及執行多個容器組成之應用程式環境。允許使用一份 docker-compose.yml 檔案來管理多個服務及其相關依賴項。

Docker 容器技術

Docker 容器技術提供了一個輕量且高效的虛擬化環境,能夠彌補傳統虛擬機器(VM)技術的不足,並且為現代軟體開發與維運(DevOps)帶來了顯著的優勢。以下將探討 Docker 的架構、優點及其實際應用。

Docker 的架構

Docker 容器的核心是其輕量級的虛擬化環境,這些環境由 Docker 客戶端、容器、映像(Images)、Docker 伺服器和 Docker 登入函式庫等元件組成。以下是 Docker 的基本架構圖:

此圖示解釋:

  • Docker Client:使用者與 Docker 互動的介面,可以發出命令來管理容器。
  • Docker Registry:儲存 Docker 映像的中央倉函式庫,可以是公共的(如 Docker Hub)或私有的。
  • Docker Server:負責執行和管理容器的伺服器。
  • Containers:從映像中執行的例項,包含應用程式及其所有依賴項。
  • Images:只讀範本,包含應用程式及其依賴項。

Docker 的優點

Docker 提供了多種優勢,使其成為現代 DevOps 流程中不可或缺的一部分:

輕量化

Docker 容器不包含自己的作業系統(OS),因此其尺寸相對較小。此外,容器可以儲存為映像檔案,這些檔案可以進行版本控制並輕鬆分發。

可攜帶性

Docker 容器是應用程式及其所有依賴項的組合體,獨立於佈署模型和作業系統版本。這使得容器可以輕鬆地轉移到其他主機上執行,無需進行任何修改。你只需構建一次即可在任何地方執行。

可重用性

Docker 命令會逐層建立新的映像層來構建最終映像。一旦映像被構建,Docker 就會重用它來進行新的構建,這使得構建速度更快且映像更小。例如,如果我們有一個根據 Ubuntu 和 Apache 網頁伺服器執行的映像,並需要另一個包含檔案 2 的映像。由於我們已經擁有第一個映像,Docker 將重用第一個映像中的所有層,除了檔案層。

快速佈署

Docker 容器是完全自給自足且輕量級的封裝包,易於分發且在測試週期中已經完全測試過。相同的容器可以在生產環境中佈署而無需進行任何或最小化的更改,從而加快佈署速度並減少因環境依賴而導致的回復。

資源利用率高

與虛擬機器相比,Docker 利用資源更加高效。因為其輕量級特性,可以在同一主機上安裝更多的容器而不是虛擬機器。

Docker 與虛擬機器技術

雖然 Docker 技術在許多情況下優於虛擬機器技術,但它並不會完全取代虛擬機器。實際上,許多佈署方式都是結合這兩種技術來最大化資源利用效率。例如,可以在虛擬機器內執行 Docker 容器。

Docker 的實際應用:WordPress 應用案例

假設我們需要設定一個基本的 WordPress 網站,該網站包含三個部分:網頁伺服器、關聯式資料函式庫(如 MySQL)和資料儲存空間。傳統虛擬機器方式需要建立多個虛擬機器並分別安裝所需軟體。

然而,使用 Docker 輕鬆實作同樣功能:

第一步:資料容器

我們可以從 Docker Hub 提取現成的 Ubuntu 基礎 Linux 應用並執行它來建立本地儲存空間:

docker create --name mysql_data_container -v /var/lib/mysql ubuntu

第二步:MySQL 容器

從 Docker Hub 提取最新版本的 MySQL 應用並執行它:

docker run --volumes-from mysql_data_container -v /var/lib/mysql:/var/lib/mysql -e MYSQL_USER=mysql -e MYSQL_PASSWORD=mysql -e MYSQL_DATABASE=test -e MYSQL_ROOT_PASSWORD=test -it -p 3306:3306 -d mysql

第三步:WordPress 容器

從 Docker Hub 提取最新版本的 WordPress 應用並執行它:

docker run -d --name wordpress --link mysql:mysql wordpress

這樣我們就完成了 WordPress 網站的設定,整個過程僅需十分鐘左右。

此圖示解釋:

  • Data Container:使用 Ubuntu 基礎 Linux 應用來建立本地儲存空間。
  • MySQL Container:使用 MySQL 應用來執行資料函式庫服務。
  • WordPress Container:使用 WordPress 應用來執行網頁伺服器。

#### 內容解密:

  • Data Container 建立:我們首先建立了一個名為 mysql_data_container 的資料容器,並將 /var/lib/mysql 掛載到 Ubuntu 基礎 Linux 應用中。這樣做是為了確保資料持久化儲存。
  • MySQL Container 建立:接著我們從 Docker Hub 提取 MySQL 應用並執行它。我們使用 --volumes-from 選項將之前建立的資料卷掛載到 MySQL 容器中。
  • WordPress Container 建立:最後我們提取 WordPress 應用並執行它。我們使用 --link 選項將 WordPress 與 MySQL 資料函式庫連線起來。

這種設計方法不僅簡化了佈署流程,還提高了系統的可移植性和可靠性。每個容器都獨立執行一個程式,透過標準間程式通訊(IPC)與其他服務或程式進行互動。這樣可以實作微服務架構中的獨立和可擴充套件性。

容器技術的優勢與實踐

在現代軟體開發與佈署中,容器技術已成為不可或缺的一部分。容器技術的輕量化設計使其能夠在不需獨立作業系統的情況下執行,這大大簡化了維護和擴充套件的難度。以下將探討容器技術的優勢,並以Docker為例,詳細說明其實際應用。

輕量化設計與簡單維護

容器的輕量化設計使其能夠快速啟動和停止,這對於需要頻繁佈署和更新的應用程式來說非常有利。以下是一些具體的優勢:

簡單升級流程

假設我們需要升級MySQL的映像檔,只需停止目前執行中的MySQL容器,提取最新版本的MySQL映像檔,並將其執行在相同的卷對映上即可完成升級。這種操作簡單且高效,大大減少了升級過程中的風險和時間成本。

資源重用

容器技術允許我們在不同的環境中重用相同的映像檔。例如,如果我們需要為特定團隊定製一個WordPress版本,可以提取另一個WordPress映像檔並執行新的Docker容器,同時連線到相同的資料函式庫。這種重用機制大大提高了開發效率。

簡單且直觀的叢集管理

Docker提供了原生叢集功能稱為Swarm模式。透過幾個簡單的指令,我們可以建立叢集、負載平衡和服務發現。這種叢集管理方式簡單直觀,適合於需要高用性和擴充套件性的應用場景。

Docker安裝

隨著Docker技術的普及,其安裝過程也變得越來越簡單。以下將介紹在不同作業系統上安裝Docker的步驟。

在Mac OS X上的安裝

假設你的Mac電腦是2010年或之後生產的,並且安裝了OS X 10.11或更高版本。以下是安裝Docker的步驟:

  1. 開啟瀏覽器,輸入以下網址:https://docs.docker.com/docker-for-mac/install/#download-docker-for-mac。點選「Get Docker for Mac (Stable)」開始下載Docker工具箱。
  2. 雙擊下載好的安裝包進行解壓縮。
  3. 將解壓縮後的Docker鯨魚圖示拖動到應用程式資料夾中。
  4. 雙擊應用程式圖示並點選「Open」,然後點選「OK」。
  5. 系統會彈出要求輸入Mac OS X密碼,請輸入你的密碼進行授權。
  6. 如果你之前安裝過Docker工具箱,系統會彈出一個選項讓你選擇是否要複製現有的Docker映像和容器。選擇「Copy」即可完成複製;如果是新安裝則不會看到此畫面。
  7. 安裝完成後,Docker引擎會自動啟動。

註冊Docker Hub

安裝完成後,系統會提示你註冊Docker Hub。Docker Hub是一個雲端註冊服務,用於儲存和分配Docker映像檔。你可以在公共空間分享你的Docker映像檔,或者購買私有選項來限制存取許可權。

如果你已經註冊了Docker Hub,可以輸入你的使用者名稱和密碼登入;如果還沒有註冊,可以選擇稍後註冊。

基本指令操作

以下是一些基本的Docker指令操作示例:

  1. 驗證Docker版本

    docker --version
    

    這條指令會顯示你所安裝的Docker版本號。

  2. 檢視所有可用指令

    docker --help
    

    這條指令會列出所有可用的Docker指令及其用法。

內容解密:

  • docker --version:這條指令用於確認當前系統上所安裝的Docker版本號。這在進行除錯或確認系統環境時非常有幫助。
  • docker --help:這條指令列出所有可用的Docker指令及其簡要說明,方便我們快速查詢和使用。

容器技術正以迅猛之勢發展著。隨著越來越多公司和開發者採用這項技術,社群也在不斷推出新功能和改進現有功能。玄貓建議大家持續關注最新動態並參與社群交流以保持技術競爭力。

此圖示展示了Docker容器之間如何透過網路互聯:

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Docker 容器技術入門與實踐

package "Docker 架構" {
    actor "開發者" as dev

    package "Docker Engine" {
        component [Docker Daemon] as daemon
        component [Docker CLI] as cli
        component [REST API] as api
    }

    package "容器運行時" {
        component [containerd] as containerd
        component [runc] as runc
    }

    package "儲存" {
        database [Images] as images
        database [Volumes] as volumes
        database [Networks] as networks
    }

    cloud "Registry" as registry
}

dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置

@enduml

內容解密:

  • Container 1:代表第一個執行中的Docker容器。
  • Container 2:代表第二個執行中的Docker容器。
  • Container 3:代表第三個執行中的Docker容器。
  • Database:代表一個外部資料函式庫。
  • Network:表示各個容器之間透過網路進行通訊。

玄貓希望透過這些內容幫助大家更好地理解並掌握容器技術。隨著技術不斷進步及應用場景日益豐富,玄貓期待看到更多創新應用和實踐案例。