文章目錄
- 前言
- 一、Docker 介紹
- 1. 簡介
- 2. 應用場景
- 3. 特點
- 4. Docker和虛擬機之間的區別
- 5. 解決痛點
- 1. 解決依賴兼容
- 2. 解決操作系統環境差異
- 3. 小結
- 二、Docker 架構
- 三、工作流程
- 五、Docker 核心組件及其工作機制
- 1. Docker 客戶端(Docker Client)
- 2. Docker 守護進程(Docker Daemon)
- 3. Docker 引擎 API(Docker Engine API)
- 4. Docker 容器(Docker Containers)
- 5. Docker 鏡像(Docker Images)
- 6. Docker 倉庫(Docker Registries)
- 7. Docker Compose
- 8. Docker Swarm
- 9. Docker 網絡(Docker Networks)
- 10. Docker 卷(Docker Volumes)
- Docker 命令
前言
容器化
?
??我們搭建了微服務體系,同時借助Idea編譯工具多次完成本地服務啟動、部署和驗證。就會出現下面場景:
- 開發人員A寫好的代碼–>開發人員B的電腦上運行,B必須保證跟A一樣的系統環境(JDK/MySQL等)
- 系統代碼部署從DEV–>TEST–>PRE–>PROD,每個環節都必須保證一樣的系統環境(同上)
- 分布式系統中依賴組件非常多,組件與組件之間的部署往往會產生一些沖突(端口/依賴/環境等)
??這樣的版本一致保證會耗費我們大量的時間和精力,同時萬一有問題產生,我們也很難第一時間考慮到是因為版本不一致導致的問題。
??因此我們需要一套可以平滑切換的部署引擎,這就是容器化技術Docker。
一、Docker 介紹
1. 簡介
??Docker 是一個開源的應用容器引擎,基于 Go 語言 并遵從 Apache2.0 協議開源。
??Docker 可以讓開發者打包他們的應用以及依賴包到一個輕量級、可移植的容器中,然后發布到任何流行的 Linux 機器上,也可以實現虛擬化。
??容器是完全使用沙箱機制,相互之間不會有任何接口(類似 iPhone 的 app),更重要的是容器性能開銷極低。
??Docker 從 17.03 版本之后分為 CE(Community Edition: 社區版) 和 EE(Enterprise Edition: 企業版),我們用社區版就可以了。
相關鏈接
Docker 官網
Github Docker 源碼
2. 應用場景
-
Web 應用的自動化打包和發布(編譯構建和部署)。
-
自動化測試和持續集成、持續交付(CI/CD)。
-
在服務型環境中部署和調整數據庫或其他的后臺應用。
-
從頭編譯或者擴展現有的 OpenShift 或 Cloud Foundry 平臺來搭建自己的 PaaS 環境。
3. 特點
??Docker 是一個用于開發,交付和運行應用程序的開放平臺。
??Docker 使您能夠將應用程序與基礎架構分開,從而可以快速交付軟件。借助 Docker,您可以采用與管理應用程序相同的方式來管理基礎架構。
??通過利用 Docker 的方法實現快速交付,測試和部署代碼,您可以大幅提高,開發迭代和部署上限的效率。
- 快速,一致地交付應用程序
Docker 允許開發人員使用您提供的應用程序或服務的本地容器在標準化環境中工作,從而簡化了開發的生命周期。
容器非常適合持續集成和持續交付(CI / CD)工作流程,請考慮以下示例方案:
-
您的開發人員在本地編寫代碼,并使用 Docker 容器與同事共享他們的工作。
-
他們使用 Docker 將其應用程序推送到測試環境中,并執行自動或手動測試。
-
當開發人員發現錯誤時,他們可以在開發環境中對其進行修復,然后將其重新部署到測試環境中,以進行測試和驗證。
-
測試完成后,將修復后的程序推送給生產環境,就像將更新的鏡像推送到生產環境一樣簡單。
- 響應式部署和擴展
Docker 是基于容器的平臺,允許高度可移植的工作負載。Docker 容器可以在開發人員的本機上,數據中心的物理或虛擬機上,云服務上或混合環境中運行。
Docker 的可移植性和輕量級的特性,還可以使您輕松地完成動態管理的工作負擔,并根據業務需求指示,實時擴展或拆除應用程序和服務。
- 在同一硬件上運行更多工作負載
Docker 輕巧快速。它為基于虛擬機管理程序的虛擬機提供了可行、經濟、高效的替代方案,因此您可以利用更多的計算能力來實現業務目標。Docker 非常適合于高密度環境以及中小型部署,而您可以用更少的資源做更多的事情。
4. Docker和虛擬機之間的區別
?虛擬機
?:是基于虛擬硬件的操作系統。虛擬機是通過Hypervisor(虛擬機管理系統,常見的有VMWare workstation、VirtualBox),虛擬出網卡、CPU、內存等虛擬硬件,再在其上建立虛擬機,每個虛擬機是個獨立的操作系統,擁有自己的系統內核。體積大、啟動速度慢、性能一般。
?Docker
?:是一個系統進程。容器是利用namespace將文件系統、進程、網絡、設備等資源進行隔離,利用cgroup對權限、CPU資源進行限制,最終讓容器之間互不影響,容器無法影響宿主機。體積小、啟動速度快、性能好。
特性 | 虛擬機 | 容器 |
---|---|---|
啟動 | 分鐘級 | 秒級 |
硬盤使用 | 一般為 GB | 一般為 MB |
性能 | 弱 | 接近原生 |
系統支持量 | 一般幾十個 | 單機支持上千個容器 |
5. 解決痛點
1. 解決依賴兼容
Docker為了解決依賴的兼容問題的,采用了兩個手段:
- 【依賴打包】將應用的Libs(函數庫)、Deps(依賴)、配置與應用一起打包
- 【部署隔離】將每個應用放到一個隔離容器去運行,避免互相干擾
此時打包好的應用包(不再是原來的jar包)既包含應用本身,也包含應用所需的Libs、Deps,無需在操作系統上安裝,自然不存在應用間的兼容問題。
雖然解決了不同應用的兼容問題,但是開發、測試等多個環境,不同的操作系統版本之間也會有差異,這個不解決一樣會面臨開篇所說的問題,想了解這個必須先了解下操作系統的結構。
2. 解決操作系統環境差異
以一個ubuntu操作系統為例,如下:
其結構包括:
- 計算機硬件:如CPU、內存、磁盤等
- 系統內核:所有Linux發行版內核都是Linux,如CentOS/Ubuntu/Fedora等,內核與計算機硬件交互,對外提供內核指令,用于操作計算機硬件。
- 系統應用:操作系統本身提供的應用、函數庫。這些函數是對內核指令的封裝,使用更方便。
應用與計算機交互的流程大致如下:
- 應用(外部應用如redis/web應用等)調用操作系統應用(函數庫),實現各種功能
- 系統函數庫是對內核指令集的封裝,會調用內核指令
- 內核指令操作計算機硬件
如Ubuntu和CenOS雖然都是基于Linux內核,無非是系統應用不同,提供函數庫有差異,如下:
但就是這種差異,當一個Ubuntu版本的MySQL嘗試安裝到CentOS系統時,MySQL還是調用的Ubuntu函數庫,會出現找不到或者不匹配的情況,從而導致報錯,即出現我們上面提到的系統環境差異導致的不兼容問題:
我們來看下Docker是如何處理這種環境間的差異的:
- Docker將應用程序與所需調用的系統(如Ubuntu)函數庫一起打包
- Docker運行到不同操作系統時,直接基于打包的函數庫,借助于操作系統Linux內核來運行
3. 小結
- Docker如何解決大型項目依賴關系復雜,不同組件依賴的兼容性問題?
- Docker允許開發中將應用、依賴、函數庫、配置一起打包,形成可移植鏡像
- Docker應用運行在容器中,使用沙箱機制,相互隔離
- Docker如何解決開發、測試、生產環境有差異的問題?
- Docker鏡像中包含完整運行環境,包括系統函數庫,僅依賴系統的Linux內核,因此可以在任意Linux操作系統上運行
- Docker是一個快速交付應用、運行應用的技術,具備下列優勢:
- 可以將程序及其依賴、運行環境一起打包為一個鏡像,可以遷移到任意Linux操作系統
- 運行時利用沙箱機制形成隔離容器,各個應用互不干擾
- 啟動、移除都可以通過一行命令完成,方便快捷
二、Docker 架構
??Docker 架構是基于客戶端-服務器的C/S模式,其中包括多個關鍵組件,確保容器化應用的高效構建、管理和運行。可以使用遠程 API 來管理和創建 Docker 容器。
??Docker 容器(Container),是獨立運行的一個或一組應用,基于 Docker 鏡像來創建,是鏡像運行時的實體。
??Docker 鏡像(Image),用于創建 Docker 容器的模板,就相當于是一個 root 文件系統。
??鏡像和容器的關系,就像是面向對象程序設計中的類和實例一樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。
Docker | 面向對象 |
---|---|
容器 | 對象實例 |
鏡像 | 類 |
??Docker是一個CS架構的程序,底層由Go 語言進行開發實現,由兩部分組成:
- 服務端(Server):Docker 守護進程,負責處理 Docker 指令,管理鏡像、容器等。
- 客戶端(Client):通過命令或 RestAPI 向 Docker 服務端發送指令。可以在本地或遠程向服務端發送指令。
三、工作流程
-
構建鏡像:使用 Dockerfile 創建鏡像。
-
推送鏡像到倉庫:將鏡像上傳到 Docker Hub 或私有鏡像倉庫中。
-
拉取鏡像:通過 docker pull 從鏡像倉庫中拉取鏡像。
-
運行容器:使用鏡像創建并啟動容器。
-
管理容器:使用 Docker 客戶端命令管理正在運行的容器(例如查看日志、停止容器、查看資源使用情況等)。
-
網絡與存儲:容器之間通過 Docker 網絡連接,數據通過 Docker 卷或綁定掛載進行持久化。
五、Docker 核心組件及其工作機制
1. Docker 客戶端(Docker Client)
Docker 客戶端是用戶與 Docker 守護進程交互的命令行界面(CLI)。它是用戶與 Docker 系統的主要交互方式,用戶通過 Docker CLI 發出命令,這些命令被發送到 Docker 守護進程,由守護進程執行相應的操作。
-
功能:允許用戶使用命令與 Docker 守護進程通信,如創建容器、構建鏡像、查看容器狀態等。
-
交互方式:Docker 客戶端與 Docker 守護進程之間通過 REST API 或 Unix 套接字通信。常用的命令行工具是 docker,通過它,用戶可以發出各種 Docker 操作命令。
常用命令:
-
docker run:運行容器。
-
docker ps:列出正在運行的容器。
-
docker build:構建 Docker 鏡像。
-
docker exec:在容器中執行命令。
2. Docker 守護進程(Docker Daemon)
Docker 守護進程(通常是 dockerd)是 Docker 架構的核心,負責管理容器生命周期、構建鏡像、分發鏡像等任務。
守護進程通常以后臺進程的方式運行,等待來自 Docker 客戶端的 API 請求。
功能:
-
啟動和停止容器。
-
構建、拉取和推送鏡像。
-
管理容器的網絡和存儲。
-
啟動、停止、查看容器日志等。
-
與 Docker 注冊表進行通信,管理鏡像的存儲與分發。
Docker 守護進程監聽來自 Docker 客戶端的請求,并且通過 Docker API 執行這些請求。守護進程將負責容器、鏡像等 Docker 對象的管理,并根據請求的參數啟動容器、刪除容器、修改容器配置等。
啟動 Docker 守護進程(通常是自動啟動的):
sudo systemctl start docker
3. Docker 引擎 API(Docker Engine API)
Docker 引擎 API 是 Docker 提供的 RESTful 接口,允許外部客戶端與 Docker 守護進程進行通信。通過這個 API,用戶可以執行各種操作,如啟動容器、構建鏡像、查看容器狀態等。API 提供了 HTTP 請求的接口,支持跨平臺調用。
功能:
-
向 Docker 守護進程發送 HTTP 請求,實現容器、鏡像的管理。
-
提供 RESTful 接口,允許通過編程與 Docker 進行交互。
可以通過 curl 或其他 HTTP 客戶端訪問 Docker 引擎 API。例如,查詢當前 Docker 守護進程的版本:
curl --unix-socket /var/run/docker.sock http://localhost/version
4. Docker 容器(Docker Containers)
容器是 Docker 的執行環境,它是輕量級、獨立且可執行的軟件包。容器是從 Docker 鏡像啟動的,包含了運行某個應用程序所需的一切——從操作系統庫到應用程序代碼。容器在運行時與其他容器和宿主機共享操作系統內核,但容器之間的文件系統和進程是隔離的。
功能:
-
提供獨立的運行環境,確保應用程序在不同的環境中具有一致的行為。
-
容器是臨時的,通常在任務完成后被銷毀。
容器的生命周期是由 Docker 守護進程管理的。容器可以在任何地方運行,因為它們不依賴于底層操作系統的配置,所有的運行時依賴已經封裝在鏡像中。
啟動一個容器:
docker run -d ubuntu
5. Docker 鏡像(Docker Images)
Docker 將應用程序及其所需的依賴、函數庫、環境、配置等文件打包在一起的特殊文件系統,稱為鏡像。
Docker 鏡像是容器的只讀模板,用戶可以根據鏡像啟動容器。每個鏡像除了提供容器應用程序運行所需的操作系統、應用程序、庫、資源配置等文件外,還包含了為運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。鏡像是靜態的,不包含任何動態數據,其內容在構建之后也不會被改變。
功能:
-
鏡像是構建容器的基礎,每個容器實例化時都會使用鏡像。
-
鏡像是只讀的,不同容器使用同一個鏡像時,容器中的文件系統層是獨立的。
Docker 鏡像可以通過 ?docker pull
? 從 Docker Hub 或私有注冊表拉取,也可以通過 docker build 從 Dockerfile 構建。
拉取 Ubuntu 鏡像:
docker pull ubuntu
6. Docker 倉庫(Docker Registries)
Docker 倉庫是用來存儲 Docker 鏡像的地方,最常用的公共倉庫是 Docker Hub。用戶可以從 Docker Hub 下載鏡像,也可以上傳自己的鏡像分享給其他人。除了公共倉庫,用戶也可以部署自己的私有 Docker 倉庫來管理企業內部的鏡像。
功能:
-
存儲 Docker 鏡像。
-
提供鏡像的上傳和下載功能。
Docker Hub 提供了大量官方和社區維護的鏡像,如 Ubuntu、Nginx、MySQL 等。
推送鏡像到 Docker Hub:
docker push <username>/<image_name>
7. Docker Compose
Docker Compose 是一個用于定義和運行多容器 Docker 應用的工具。通過 Compose,用戶可以使用一個 docker-compose.yml 配置文件定義多個容器(服務),并可以通過一個命令啟動這些容器。Docker Compose 主要用于開發、測試和部署多容器的應用。
功能:
-
定義和運行多個容器組成的應用。
-
通過 YAML 文件來配置應用的服務、網絡和卷等。
創建一個簡單的 docker-compose.yml 文件來配置一個包含 Web 服務和數據庫服務的應用:
version: '3'
services:web:image: nginxports:- "8080:80"db:image: mysqlenvironment:MYSQL_ROOT_PASSWORD: example
啟動 Compose 定義的所有服務:
docker-compose up
8. Docker Swarm
Docker Swarm 是 Docker 提供的集群管理和調度工具。它允許將多個 Docker 主機(節點)組織成一個集群,并通過 Swarm 集群管理工具來調度和管理容器。Swarm 可以實現容器的負載均衡、高可用性和自動擴展等功能。
功能:
-
管理多節點 Docker 集群。
-
通過調度器管理容器的部署和擴展。
初始化 Swarm 集群:
docker swarm init
9. Docker 網絡(Docker Networks)
Docker 網絡允許容器之間相互通信,并與外部世界進行連接。Docker 提供了多種網絡模式來滿足不同的需求,如 bridge 網絡(默認)、host 網絡和 overlay 網絡等。
功能:
-
管理容器間的網絡通信。
-
支持不同的網絡模式,以適應不同場景下的需求。
創建一個自定義網絡并將容器連接到該網絡:
docker network create my_network
docker run -d --network my_network ubuntu
10. Docker 卷(Docker Volumes)
Docker 卷是一種數據持久化機制,允許數據在容器之間共享,并且獨立于容器的生命周期。與容器文件系統不同,卷的內容不會隨著容器的銷毀而丟失,適用于數據庫等需要持久存儲的應用。
功能:
-
允許容器間共享數據。
-
保證數據持久化,獨立于容器的生命周期。
創建并掛載卷:
docker volume create my_volume
docker run -d -v my_volume:/data ubuntu
Docker 命令
Docker 命令
本文的引用僅限自我學習如有侵權,請聯系作者刪除。
參考知識
Docker 教程