Docker 容器技術的興起,有效解決了軟體佈署和擴充套件性方面的挑戰,尤其在微服務架構下,管理大量服務的複雜性更加顯著。相較於虛擬機器,Docker 容器更輕量級,它將應用程式及其所有依賴項封裝在一起,無需額外的客戶作業系統,可以直接與主機核心通訊,從而提高資源利用率。Docker 的核心概念在於映像和容器,映像作為只讀範本,用於建立容器,而容器則是應用程式執行的例項。Docker 的架構包含客戶端、伺服器、儲存函式庫等元件,共同協作完成容器的構建、佈署和管理。Docker 的優勢在於其輕量級、可攜性、重複使用性、快速佈署能力以及資源高效利用等方面,這些特性使其成為現代 DevOps 的理想工具。實際應用中,Docker 可以快速佈署複雜應用,例如 WordPress 網站,只需簡單的幾個步驟即可完成 Web 伺服器、資料函式庫和資料儲存的組態,大幅簡化了佈署流程。雖然 Docker 帶來了諸多優勢,但也面臨安全性、資源管理和網路組態等挑戰,需要持續關注和改進。隨著雲端運算和微服務架構的普及,Docker 容器技術將持續發展,並且 Kubernetes 等容器協調工具緊密結合,進一步提升應用程式佈署和管理的效率。
Docker 容器
Docker 容器是另一個熱門話題。隨著公司擴充套件,它們會因軟體佈署和可擴充套件性而遇到困難。隨著更多使用者和功能的加入,軟體趨於複雜化,而真正的軟體佈署和可擴充套件性問題也隨之而來。第一章「微服務介紹」中提到,微服務可以透過簡化架構來解決開發挑戰,但也將操作複雜性推向佈署和可擴充套件性。進一步增加挑戰的是,根據微服務架構時你可能需要託管、佈署和管理數千個服務。這就是容器出現的原因了。
Docker 是一個開源技術倡議專案,它透過將應用從基礎設施依賴中分離來解決佈署和可擴充套件問題。它透過容器來解決這些問題,容器允許我們將應用及其所有依賴項封裝在一起,包括目錄結構、元資料、程式空間、埠集等。我們可以在所有機器和環境中以相同方式執行封裝好的應用程式。「這就是 Docker 與眾不同之處」也是其迅速崛起背後最大因素之一。你可能會想,「這正是虛擬機器(VM)所做的」。要了解它們之間的差異,「我們」需瞭解這些技術如何不同。
此圖示
  graph TD
    A[Docker] --> B[Container]
    B --> C[Application]
    B --> D[Dependencies]
    B --> E[Directory Structure]
    B --> F[Metadata]
    B --> G[Process Space]
    B --> H[Ports]
    I[Virtual Machine] --> J[Host OS]
    I --> K[Guest OS]
    I --> L[Application]
    M[Docker vs VM] --> N[Separation of Concerns]
內容解密:
- Docker & Container:Docker 是一種技術倡議專案,主要透過容器來解決佈署和可擴充套件問題。容器允許我們將應用及其所有依賴項封裝在一起。
- Dependencies, Directory Structure, Metadata, Process Space, Ports:容器內包含了應用所需的所有依賴項、目錄結構、元資料、程式空間及埠集。
- Host OS, Guest OS, Application:虛擬機器需要在主機作業系統上執行一個完全獨立的客戶作業系統才能執行應用。
- Separation of Concerns:與虛擬機器不同的是 Docker 主要透過隔離應用及其依賴來提供獨立環境而非隔離整個作業系統環境。
Docker 容器:現代開發與佈署的利器
在現代軟體開發與佈署中,Docker 容器已成為不可或缺的工具。為了理解 Docker 容器的優勢,我們首先需要知道虛擬機器(Virtual Machines, VM)的基本概念及其侷限性。接著,我們將探討容器技術如何解決這些問題,並帶來更高效的資源利用與更靈活的應用佈署。
虛擬機器:基礎與侷限
虛擬機器是一種自包含的系統,包含獨立的作業系統(稱為Guest OS)、應用程式環境以及應用程式本身。透過超級管理程式(Hypervisor),多個虛擬機器可以在同一台主機(Host Machine)上執行。超級管理程式作為硬體代理,讓Guest OS覺得它們在獨立的硬體上執行。這種架構有助於充分利用硬體資源,並提供應用程式隔離。
然而,虛擬機器也有其侷限性:
- 資源消耗大:每個虛擬機器都需要自己的作業系統,這意味著額外的儲存和處理能力消耗。
- 備份與還原:虛擬機器的備份通常是一個大檔案,包含作業系統、應用程式及其依賴專案,這使得備份和還原過程變得繁瑣且耗時。
- 移植性差:虛擬機器之間的差異可能導致應用程式在不同環境中的行為不一致。
- 效能開銷:虛擬機器之間的通訊需要經過多層轉換,這會引起效能損失。
容器技術:輕量級與高效
容器技術則提供了一種不同的解決方案。容器將應用程式所需的所有元素(如程式、資料、組態等)封裝成一個單元,但它不需要獨立的作業系統。相反,容器直接與主機的核心通訊,這使得它們比虛擬機器更輕量級且高效。
此圖示展示了容器與虛擬機器之間的基本區別:
  graph TD;
    A[主機作業系統] --> B[Docker引擎];
    B --> C[Container 1];
    B --> D[Container 2];
    C --> E[應用1];
    D --> F[應用2];
內容解密:
- 主機作業系統:提供基礎的硬體資源和環境。
- Docker引擎:管理和執行容器。
- Container 1 與 Container 2:分別包含獨立的應用程式和其所需資源,但分享同一個核心。
- 應用1 與 應用2:各自執行在不同的容器中,彼此隔離。
容器技術優勢
容器技術解決了虛擬機器的一些主要問題:
- 資源利用率高:因為不需要獨立的作業系統,容器可以更高效地利用硬體資源。
- 移植性強:由於容器包含所有應用所需的依賴專案,它們可以在不同環境中無縫執行。
- 快速佈署與更新:因為容器是輕量級的,佈署和更新過程變得更加迅速。
- 隔離性強:雖然容器分享同一個核心,但它們仍然能夠提供程式和資料的隔離。
Docker 的實踐經驗
在實際操作中,Docker 提供了豐富的工具和命令來管理容器。例如:
# 提取一個 Docker 映像
docker pull ubuntu
# 執行一個 Docker 容器
docker run -it ubuntu /bin/bash
內容解密:
- docker pull ubuntu:從 Docker Hub 提取 Ubuntu 的映像到本地。
- docker run -it ubuntu /bin/bash:以互動模式執行一個 Ubuntu 容器並進入 Bash 命令列。
隨著雲端運算和微服務架構的普及,Docker 容器將繼續發揮重要作用。未來,我們可以期待更多創新技術出現,進一步提升容器技術的效能和安全性。
總結來說,Docker 容器以其輕量級、高效率和強大的移植性,成為現代軟體開發與佈署中的首選工具。透過理解和掌握 Docker 的基本概念和操作方法,開發者可以更好地管理和最佳化他們的應用程式。
根據容器的開發架構
容器技術,特別是 Linux 容器(LXCs),已經存在很長時間,但最近因 Docker 的出現而變得更加流行。Docker 是一個開源專案,它透過引入一系列改進措施,使 Linux 基礎的容器更加便攜、易用且靈活。這些改進措施包括一組工具,使容器能夠更方便地建立、運輸、複製和執行。使用 Docker 容器,開發者可以克服大部分使用虛擬機器(VMs)的缺點。
Linux 容器與 Docker 容器的差異
儘管 Linux 容器和 Docker 容器看似相似,但實際上存在一些微妙的差異:
- 
程式管理:在 LXC 中,你可以執行多個程式,而 Docker 容器則限制為單一程式。如果你的應用程式由多個程式組成,則需要執行相等數量的 Docker 容器。這雖然增加了容器管理的複雜性,但也提供了更大的靈活性。由於每個容器對應一個程式,你可以在程式級別進行精細化管理和行為調整。這是微服務架構中最需要解決的一個問題:自包含服務,每個服務僅執行一個程式。 
- 
持久化儲存:Docker 容器是無狀態的,不支援持久化儲存。你需要透過掛載 Docker 檔案系統來附加外部儲存。 
- 
便攜性:Docker 提供比 LXC 更好的便攜性。LXC 的便攜性不可保證;當你將 LXC 容器從一個主機移動到另一個主機時,可能會因為不同的伺服器組態而無法順利執行。相反,Docker 則能夠確保便攜性不會成為問題,因為它能夠更好地抽象化作業系統、網路和儲存細節。當開發者完成開發和測試後,可以建立映像檔並下載到生產環境中執行,這是 Docker 容器解決的一個關鍵複雜性問題。 
Docker 架構與元件
Docker 採用客戶端-伺服器架構,客戶端與 Docker 守護程式進行通訊,後者提供主要服務。以下是構成 Docker 生態系統的元件:
- Docker 伺服器或守護程式:這是位於主機系統上的核心元件,負責管理所有在主機上執行的容器。
- Docker 容器:這是一個獨立的虛擬系統,包含執行應用所需的所有檔案、依賴項、程式空間和埠。由於每個容器都有可用的埠,我們需要在 Docker 層面進行對映。
- Docker 檔案函式庫:這是隻讀範本檔案格式之一種形式的 Docker 映像檔案型別其中可以移動及分發。與虛擬機器不同的是,這些檔案可以進行版本控制。不僅如此我們還可以使用 docker diff命令來檢視兩個映像之間的變更。每個映像由多層組成並可能在不同映像之間分享。
- Docker 儲存函式庫:這是用來分享和儲存 Docker 容器映像的倉函式庫。最著名的是 Docker Hub(類別似於 GitHub),允許你推播或提取具有公開或私人存取許可權的容器映像。你也可以在組織內部設定自己的私人儲存函式庫。
- Dockerfile:這是一個簡單的文字檔案,可以指定用於建立 Docker 映像的命令。它允許設定安裝軟體、環境變數、工作目錄和入口點等指令以及使用 Docker 命令新增新程式碼以生成自定義軟體。
- Docker Machine:Docker Machine 允許在本地機器或公有/私有雲端上啟動 Docker 主機(包括 AWS 和 Azure)。它還提供了一種透過 Docker Machine 命令來管理主機(例如開始、停止、檢查等)的方式。
- Docker Swarm:Swarm 提供原生群集功能,使多個 Docker 節點作為一個大型 Docker 主機運作。它是一個獨立工具,可以使用 Docker Machine 或手動提取 Swarm 映像來安裝。
- Docker Compose:一個應用程式可能會有多個元件並執行多個容器。Docker 提供了 Compose 工具來定義和執行多個容器應用程式。
基本 container 架構
此圖示展示了基本的 container 架構:
- 每個 container 包含應用及其依賴項
- container engine 與 host OS 處於同層級
- server infrastructure 處於基礎層級
問題與挑戰
儘管 Docker 帶來了許多好處,但也存在一些挑戰:
- 安全性:由於容器分享主機作業系統核心,因此潛在漏洞可能影響所有執行中的容器。
- 資源管理:隨著越來越多的 container 被佈署到單一主機上時如何有效地管理資源?例如 CPU 和記憶體分配?
- 網路組態:如何確保不同 container 之間安全且高效地進行通訊?
未來趨勢
隨著技術的不斷進步以及社群對持續交付/持續佈署(CI/CD)流程需求日益增長。
控制台
- 一旦完成環境設定之後我們就能夠使用 docker run命令來啟動 container:
docker run -d -p 80:80 --name webserver nginx
- 在此範例中我們使用 -d標誌來使 container 在背景中執行並將主機上的埠80與 container 中的80埠繫結,--name標誌來指定 container 名稱為webserver。
小段落標題
- 接著我們就能夠使用 docker ps命令來檢視目前正在執行中的所有 container:
docker ps
內容解密:
- 
docker run -d -p 80:80 --name webserver nginx- -d:在背景中執行
- -p 80:80:將主機上的埠- 80與 container 中- 80的埠繫結
- --name webserver:指定 container 名稱為 webserver
- nginx:指定要執行之 image 的名稱
 
- 
docker ps- 檢視目前正在執行中的所有 container
 
容器化技術與 Docker 的實踐
在現代軟體開發中,容器化技術已成為不可或缺的一部分。Docker 作為容器化技術的代表,提供了一種輕量級、便捷的方式來封裝、分銷及執行應用程式。本文將探討 Docker 的優勢及其在實際應用中的具體案例。
Docker 容器的架構
Docker 容器提供了一個虛擬化的環境,讓開發者可以將應用程式及其依賴項封裝成一個獨立的單元。這些單元可以在不同的環境中執行,無需擔心依賴項的衝突。Docker 的核心架構包括 Docker 客戶端、容器、映像、Docker 伺服器及 Docker 憑證。
此圖示展示了 Docker 的核心架構,顯示了各元件之間的互動關係。
  graph TD;
    A[Docker Client] --> B[Docker Server];
    B --> C[Docker Registry];
    B --> D[Containers];
    B --> E[Images];
    C --> E;
內容解密:
- Docker Client:使用者端工具,負責傳送命令給 Docker 伺服器。
- Docker Server:伺服器端元件,負責管理容器和映像。
- Docker Registry:儲存映像的倉函式庫,可以是本地或遠端。
- Containers:執行中的應用程式例項。
- Images:映像是靜態的、不可變的範本,用來建立容器。
Docker 的優勢
Docker 技術不僅解決了虛擬機器遇到的許多問題,還提供了許多額外的好處,使其成為 DevOps 的理想工具:
- 輕量級:Docker 容器不包含自己的作業系統,因此體積較小。容器可以儲存為映像,這些映像是簡單的檔案,可以方便地進行版本控制和分銷。
- 可攜帶性:Docker 容器包含應用程式及其所有依賴項,並且與佈署模型和作業系統版本無關。這些容器可以輕鬆地轉移到另一台主機上並執行。
- 重複使用:Docker 映像由一系列層組成,每次執行命令都會建立新的層。一旦建立了映像,Docker 就會重複使用它們進行新的構建,從而加快構建速度並減少映像大小。
- 快速佈署:Docker 容器是完全自給自足、輕量級且經過測試的包裝。相同的容器可以在生產環境中以最小或無需修改來佈署,從而加快佈署速度並減少因環境依賴性導致的回復。
- 資源高效利用:與虛擬機器相比,Docker 更高效地利用資源。因為它們更輕量級,因此在同一台主機上可以安裝更多的容器。
簡單案例:使用 Docker 建立 WordPress 網站
為了更好地理解 Docker 的實際應用,讓我們來看一個簡單的案例:使用 Docker 建立一個基本的 WordPress 網站。這個網站由三個部分組成:Web 伺服器(包含 WordPress 應用程式)、關聯式資料函式庫(例如 MySQL)以及資料儲存。
虛擬機器佈署 vs. Docker 佈署
在虛擬機器世界中,這些部分可能位於一台或多台虛擬機器上。你需要使用虛擬機器管理器建立虛擬機器,然後在每個虛擬機器上安裝特定作業系統軟體(如 MySQL 和 WordPress)。
然而,使用 Docker 則可以更高效地完成這些任務。以下是具體步驟:
- 資料容器:從 Docker Hub 提取基本 Linux 映像(如 Ubuntu),然後執行它以建立本地儲存。你還可以分配記憶體、儲存和 CPU。
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 容器:類別似於之前步驟,你可以提取並執行最新版本的 WordPress 型態映像。在同一執行命令中,將 MySQL 資料函式庫進行連線。
docker run -d --name wordpress --link mysql:mysql wordpress
推論
透過這些步驟,你可以在不到10分鐘內搭建起一個基本的 WordPress 網站。這展示了 Docker 在佈署和管理應用程式方面的高效性和靈活性。
此圖示展示瞭如何使用三個容器來建立一個 WordPress 網站。
  graph TD;
    A[Data Container] --> B[MySQL Container];
    B --> C[WordPress Container];
    A --> D[Ubuntu Dependencies];
    B --> E[MySQL Dependencies];
    C --> F[WordPress Dependencies];
內容解密:
- Data Container:用於儲存資料的一個基本 Linux 型態。
- MySQL Container:包含 MySQL 資料函式庫的一個映像。
- WordPress Container:包含 WordPress 應用程式的一個映像。
- Ubuntu Dependencies 和 MySQL Dependencies 和 WordPress Dependencies 分別表示各自依賴項。
 
            