單體應用拆分成微服務后,能夠實現快速開發迭代,但因為小服務太多,導致測試和部署的成本提高。
單體應用中,將Spring Boot工程打包成一個war包,然后部署在linux服務器的Tomcat中就可以了。
拆分成微服務后,修改一個需求,可能會涉及多個微服務,這個時候,被修改過的代碼都需要重新測試、打包、部署、上線發布。無形之中,給現場運維人員增加了成倍的工作壓力。
微服務通常會在共有云上創建ECS進行擴容,ECS通常只包含了基本的操作系統環境,沒有包含運行JAVA的環境jdk,就需要在ECS上安裝jdk,而且每個服務依賴的jdk版本可能也不會相同,一般情況下,都會采用jdk8,但有些喜愛前言技術的項目經理,可能要試一下jdk21,畢竟也是一個長期穩定的大版本。
而容器技術可以解決上面的兩個問題(代碼部署難、缺環境)。
時下容器技術最火的當屬Docker,很多小伙伴也用了多年,只知道它是容器技術,可以將程序和依賴打到Docker里,然后發布在Linux服務器中,就完成了程序的部署,一次構建、到處運行,很牛逼,至于其它的,就不知道了,也不想知道~
一、神之容器 Docker
Docker是一個開源的應用容器引擎,讓開發者可以打包他們的應用以及依賴包到一個可移植的鏡像中,然后發布到任何流行的Linux或windows操作系統的機器上,也可以實現虛擬化。容器是完全使用沙箱機制,相互之間不會有任何接口。
Docker屬于Linux容器的一種封裝,提供簡單易用的容器使用接口。它是目前最流行的Linux容器解決方案。
一個完整的Docker由以下七個部分組成:
- Docker Client 客戶端。
- Docker Daemon 守護進程,提供Docker Server,用于接收Docker Client的請求,Docker Server 通過路由Router與分發調度,找到相應的 Handler 來執行請求。
- Docker Image 鏡像,包含Distribution(分發)、Layer(層)、Image(鏡像)、Registry(注冊中心)、Reference(引用)。
- Docker Driver 驅動,Docker架構中的驅動模塊,它主要通過與Docker守護進程進行交互,實現對Docker容器執行環境的定制和管理。
- Docker Graph 內部數據庫,Docker Graph是Docker中的一種數據結構,用于記錄和跟蹤Docker鏡像和容器之間的關系;
- LibcontAIner 函數庫,Libcontainer是Docker的底層容器管理庫,它提供了一組接口和函數,用于創建和管理容器。Libcontainer直接與內核交互,負責容器的命名空間、cgroup、網絡設備等底層操作。
- Docker Container 容器,Docker Container是Docker中的容器實例,它是通過Driver和Libcontainer共同協作創建出來的。Driver提供了容器的運行環境定制,而Libcontainer則負責容器的具體創建和管理操作。
二、Docker架構圖
- 用戶使用 Docker Client(客戶端) 與 Docker Daemon 建立通信,并發送請求給后者,客戶端和守護程序之間通過REST API進行通信,可以使用UNIX套接字或網絡接口;
- Docker Daemon(后臺守護進程)提供Docker Server,用于接收Docker Client的請求,Docker Server 通過路由Router與分發調度,找到相應的 Handler 來執行請求,Docker Daemon提供Docker Engine,Engine是Docker 架構中的運行引擎,在Docker Engine中,一個Job可以被認為是內部最基本的工作執行單元。Docker可以做的每一項工作,都可以抽象為一個Job。例如,在容器內部運行一個進程,這是一個Job;創建一個新的容器,這也是一個Job。
- Docker Image 鏡像,包含Distribution(分發)、Layer(層)、Image(鏡像)、Registry(注冊中心)、Reference(引用)。
- Docker Driver 驅動,Docker架構中的驅動模塊,它主要通過與Docker守護進程進行交互,實現對Docker容器執行環境的定制和管理;
- 當需要容器鏡像時,則從 Registry(注冊中心) 中下載鏡像,并通過鏡像管理驅動 Graphdriver 將下載鏡像以 Graph 的形式存儲;
- Docker Graph 內部數據庫,Docker Graph是Docker中的一種數據結構,用于記錄和跟蹤Docker鏡像和容器之間的關系;
- 一個 Repository 表示某類鏡像的倉庫,同一個 Repository 內的鏡像用 Tag 來區分,一個 Registry 包含多個Repository,一個 Repository 包含同類型的多個 Image,并存儲著每一個容器鏡像的具體信息;GraphDB是一個基于SQLite的小型圖數據庫,記錄容器鏡像之間的關系;
- rootfs是Docker容器的根文件系統,它位于bootfs之上,表現為Docker容器的根目錄,包含基本的文件和目錄。在Docker中,rootfs由內核掛載為“只讀”模式,而后通過“聯合掛載”技術額外掛載一個“可寫”層;
- 通過.NETworkdriver 完成Docker容器網絡環境的配置,其中包括Docker啟動時為Docker環境創建網橋等功能;
- Docker Execdriver是Docker容器的執行驅動,負責創建容器運行命名空間,負責容器資源使用的統計與限制,負責容器內部進程的真正運行等;
- Libcontainer是Docker的底層容器管理庫,它提供了一組接口和函數,用于創建和管理容器。Libcontainer直接與內核交互,負責容器的命名空間、cgroup、網絡設備等底層操作;
- Docker Container是Docker中的容器實例,它是通過Driver和Libcontainer共同協作創建出來的。Driver提供了容器的運行環境定制,而Libcontainer則負責容器的具體創建和管理操作。Docker Container是Docker架構中服務交付的最終體現形式。實現“一次構建,到處運行”的目標,大大提高了應用程序的部署效率和可移植性。
1、Docker Client 客戶端
Docker Client是Docker的客戶端工具,也被稱為Docker命令行界面(CLI)。它是用戶與Docker平臺進行交互的主要方式。
Docker Client 的主要作用如下:
- 用戶交互界面:Docker Client提供了用戶友好的命令行交互界面,用戶可以通過輸入命令來執行各種Docker操作,例如創建容器、啟動容器、停止容器、構建鏡像等。
- 容器管理:通過Docker Client,用戶可以方便地管理Docker容器。可以創建新的容器、啟動、停止、重啟容器,并且還可以查看容器的日志、狀態等信息。
- 鏡像管理:Docker Client也允許用戶管理Docker鏡像。用戶可以搜索、下載、構建、刪除鏡像等操作,以滿足應用程序部署的需求。
- 資源配置:用戶可以通過Docker Client配置容器的運行資源,例如CPU、內存等。這樣可以確保容器在運行時具有合適的資源配置。
- 網絡通信:Docker Client可以與Docker Daemon進行通信,發送請求并接收響應。它使用REST API或其他通信協議與Docker Daemon進行交互,從而實現對Docker容器的遠程管理。
Docker Client是用戶與Docker平臺進行交互的重要工具。它提供了命令行界面,讓用戶能夠方便地管理Docker容器和鏡像,并進行資源配置和網絡通信等操作。
2、Docker Daemon 守護進程
Docker Daemon是Docker的守護進程,它是Docker平臺的后臺服務組件,充當服務器角色。
Docker Daemon 的主要作用如下:
- 容器管理:Docker Daemon負責創建、啟動、停止、刪除和管理Docker容器。它接收來自Docker客戶端的請求,并根據請求執行相應的容器管理操作。
- 鏡像管理:Docker Daemon也管理Docker鏡像。它可以下載、上傳、構建和刪除鏡像,并管理鏡像的版本控制和安全性。
- 網絡資源管理:Docker Daemon負責創建和管理Docker容器的網絡環境。它配置和管理容器的網絡設置,確保容器之間的通信和互相訪問。
- 數據卷管理:Docker Daemon還管理容器的數據卷,用于持久化存儲容器中的數據,保證數據的可靠性和持久性。
Docker Daemon是Docker平臺的核心組件,提供容器、鏡像、網絡和數據卷的管理功能。它扮演著守護進程的角色,確保Docker平臺的正常運行和管理。
3、鏡像(Image)
在Docker鏡像中,Distribution、Layer、Image、Registry和Reference各自扮演了重要角色。
- Distribution(分發):通常涉及到Docker鏡像的分發和運輸。Docker鏡像可以通過不同的方式進行分發,例如直接從Registry下載,或者通過特定的工具導入和導出;
- Layer(層):Docker鏡像由多個layer層組成,每層都是一個只讀的文件系統。這種分層設計可以實現共享和復用,提高效率。當鏡像中的文件發生變化時,Docker只會下載發生變化的層,而不是整體鏡像,節省了時間和寬帶;
- Image(鏡像):鏡像是Docker的核心,它是運行容器的基礎。鏡像包含了運行應用程序的所有文件和依賴,是一個只讀模板,可以通過鏡像創建新的容器實例;
- Registry(注冊中心):Registry是存儲和管理Docker鏡像的服務器。它是用戶上傳、下載、管理Docker鏡像的地方。例如Dokcer Hub就是一個公共的Registry;
- Reference(引用):引用指的是Docker鏡像的一種標識,通過引用,用戶可以指定需要操作的特定鏡像;
4、Docker Driver 驅動模塊
Docker Driver是Docker的驅動模塊,主要負責驅動Docker容器的運行。它通過與操作系統的交互,實現對Docker容器的創建、啟動、運行和管理等操作。
Docker Driver 的主要作用如下:
- 容器創建與啟動:Driver負責根據用戶的指令創建新的容器實例,并啟動它們。它會與底層操作系統交互,設置好容器運行所需的各種環境和資源。
- 容器運行環境定制:Driver可以根據用戶的需求定制容器的運行環境。這包括網絡配置、存儲掛載、進程管理等,確保容器在特定的環境中按照預期運行。
- 容器狀態管理:Driver維護著容器的狀態信息,包括容器的運行狀態、資源使用情況等。它可以提供容器狀態的查詢和監控功能,讓用戶了解容器的實時狀態。
- 容器資源管理:Driver還負責管理容器的資源,如CPU、內存、磁盤空間等。它可以對容器使用的資源進行限制和控制,確保容器不會超出預設的資源限制。
Docker Driver是Docker中非常重要的組件,它通過與操作系統的交互,實現了Docker容器的創建、運行和管理等功能,為Docker平臺的正常運行提供了底層支持。
5、Docker Graph內部數據庫
Docker Graph是Docker中的一種數據結構,用于記錄和跟蹤Docker鏡像和容器之間的關系。
Docker Graph 的主要作用如下:
- 關系追蹤:Docker Graph能夠記錄容器和鏡像之間的關系,包括哪個鏡像被用來創建哪個容器,容器之間是否存在依賴關系等。這種關系追蹤使得用戶能夠更好地理解和管理容器與鏡像之間的關聯。
- 資源管理:通過Docker Graph,用戶可以更方便地進行資源管理,例如查找和刪除不再需要的鏡像和容器。它提供了一種全局視圖,幫助用戶了解整個Docker環境中的資源利用情況。
- 性能優化:Docker Graph可以提供一些性能方面的優化。通過分析和理解Graph中的關系,Docker可以智能地選擇最合適的鏡像層和緩存策略,從而提高鏡像構建和容器啟動的速度。
Docker Graph在Docker的較新版本中可能已經被替代或集成到其他組件中,因此具體實現和用法可能會因版本而異。
6、Docker Libcontainer函數庫
Docker Libcontainer函數庫中包含:
- namespaces:namespaces技術用于實現Docker容器之間的隔離。通過namespaces,可以實現網絡、通信、文件、權限等對象的隔離,確保容器在獨立的環境中運行,并且相互之間不會產生干擾。這種隔離機制有助于提高容器的安全性和穩定性。
- Cgroups:Cgroups(Control Groups)用于對Docker容器所占用的系統資源進行限制和管理。它可以控制容器的CPU、內存、磁盤I/O等資源的使用量,確保容器不會消耗過多的資源,從而防止系統過載或資源耗盡。
- netlink:netlink是Linux內核提供的一種用于內核與用戶空間進程之間通信的機制。在Docker Libcontainer中,netlink主要用于完成Docker容器的網絡環境配置和創建。它使得容器能夠與網絡進行交互,實現網絡通信和功能。
- capabilities:capabilities機制用于在Docker容器內部對進程的權限進行更精細的控制。它將超級用戶root的權限分割成各種不同的capabilities權限,允許根據需求將特定的權限授予容器內的進程。這種權限管理方式增強了容器的安全性,防止潛在的安全漏洞和攻擊。
這些組件和技術在Libcontainer中協作,共同實現了Docker容器的隔離、資源管理、網絡通信和權限控制等功能,為Docker平臺的穩定性和安全性提供了重要支持。
7、Docker Container 容器實例
Docker Container是Docker中的容器實例,它是通過Driver和Libcontainer共同協作創建出來的。Driver提供了容器的運行環境定制,而Libcontainer則負責容器的具體創建和管理操作。Docker Container是Docker架構中服務交付的最終體現形式。實現“一次構建,到處運行”的目標,大大提高了應用程序的部署效率和可移植性。
Docker Container 的主要作用如下:
- 應用程序的隔離運行:Docker Container提供了輕量級、獨立的運行環境,使得應用程序可以在隔離的容器中運行,避免不同應用之間的干擾和沖突;
- 環境一致性:因為Docker Container包含了應用程序及其依賴項,所以可以確保在任何環境中都能以相同的方式運行,提高了應用的可移植性和穩定性;
- 資源控制和隔離:Docker Container允許對每個容器進行資源限制,例如CPU、內存等。這樣可以防止某個容器消耗過多資源,確保系統的穩定運行;
- 快速部署和擴展:Docker Container的輕量級特性使得它可以快速啟動和停止,非常適合于云計算和微服務架構中的快速部署和橫向擴展;
- 版本控制和回滾:通過標記和版本控制,可以輕松管理和回滾容器的版本,提高了應用程序的版本管理和部署的靈活性;
- 安全性增強:Docker Container提供了隔離的運行環境,可以減少系統漏洞和攻擊面,提高應用程序的安全性。
Docker Container是Docker技術的核心組件之一,它提供了輕量級、隔離的運行環境,用于部署、運行和管理應用程序。它的出現改變了傳統應用部署和運維的方式,提高了開發、測試、運維的效率和質量。
三、Docker安裝
1、卸載Docker
sudo yum remove docker
docker-client
docker-client-latest
docker-common
docker-latest
docker-latest-logrotate
docker-logrotate
docker-engine
2、需要的安裝包
yum install -y yum-utils
3、設置鏡像倉庫
yum-config-manager
--add-repo
https://download.docker.com/linux/centos/docker-ce.repo
用國內的。
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
更新軟件包索引。
yum mackecache fast
4、安裝Docker相關
ce社區版,ee企業版,推薦安裝企業版。
yum install docker-ce docker-ce-cli containerd.io。
5、啟動Docker
systemctl start docker
6、使用docker version查看版本
7、啟動hello world鏡像
docker run hello-world
8、卸載
yum remove docker-ce docker-ce-cli containerd.io
rm -rf /var/lib/docker
rm -rf /var/lib/containerd
四、run的流程和docker原理
1、run的流程
2、與傳統虛擬化方式對比
這就是Docker為何比虛擬化更快的原因,Docker有著比虛擬機更少的抽象層,docker利用的是宿主機的內核,VM需要的是Guest OS。
五、Docker鏡像常用命令
1、基本命令
docker version
docker info
docker 命令 --help #萬能命令
docker images。
解釋:
- REPOSITORY:鏡像的倉庫源。
- TAG:鏡像的標簽。
- IMAGE ID:鏡像的ID。
- CREATE:鏡像的創建時間。
- SIZE:鏡像的大小。
可選項
- -a:列出全部的鏡像。
- -q:只顯示鏡像的ID。
2、搜索鏡像
docker search。
可選項
--filter-STATUS-3000 #搜索大于3000的。
3、下載鏡像
指定版本下載。
docker pull 鏡像名[:tag]。
4、刪除鏡像
docker rmi -f 鏡像id。
六、docker容器常用命令
1、下載容器
docker pull centos。
2、docker run [可選參數] image
參數說明:
- --name:容器名稱。
- -d:后臺方式運行。
- -it:使用交互方式運行,進入容器查看內容(例如:docker run -it centos /bin/bash)。
- -p :指定容器的端口號 -p 8080:8080(主機端口:容器端口)。
3、列出所有的運行的容器
docker ps [參數]。
- -a:列出當前正在運行的容器。
- -n :顯示最近創建的容器。
- -q :只顯示容器的編號。
例如:docker ps -aq,顯示當前正在運行的容器的編號。
4、刪除容器
- docker rm 容器id :不能刪除正在運行的容器。
- docker rm -f $(docker ps -a) :刪除所有的容器。
- docker ps -a -q|xargs docker rm :刪除所有的容器。
5、啟動和停止容器
- docker start 容器id。
- docker restart 容器id。
- docker stop 容器id。
- docker kill 容器id,強制停止。
6、進入當前正在運行的容器
- 方式一:docker exec -it 容器id /bin/bash,進入容器后開啟一個新的終端(常用)。
- 方式二:docker attach 容器id,進入容器當前正在執行的終端。
7、從容器內拷貝文件到主機
docker cp 容器id:容器內路徑 主機路徑。
例如:docker cp 容器id:/home/test.java /home。
8、其它常用命令
后臺啟動容器 -d。
查看日志命令。
docker logs --help。
顯示指定行數的日志:
docker logs -tf --tail 10 容器id。
-f:內容,,,-t:時間。
例如:循環執行。
docker run -d centos /bin/sh -c "while;do echo hello world;sleep 1;done"。
顯示容器中的進行信息。
查看docker內部的進程信息:docker top 容器id。
查看容器的元數據。
docker inspect --help。
顯示容器的所有信息:
docker inspect 容器id。
七、docker常用命令小結
常用命令 |
命令含義 |
attach |
當前shell下attach連接指定運行鏡像 |
build |
通過Dockerfile定制鏡像 |
commit |
提交當前容器為新的鏡像 |
cp |
從容器中拷貝指定文件或者目錄到宿主機中 |
create |
創建一個新的容器,同run 但不啟動容器 |
diff |
查看docker容器變化 |
events |
從docker服務獲取容器實時事件 |
exec |
在已存在的容器上運行命令 |
export |
導出容器的內容流作為一個tar歸檔文件(對應import) |
history |
展示一個鏡像形成歷史 |
images |
列出系統當前鏡像 |
import |
從tar包中的內容創建一個新的文件系統映像(對應export) |
info |
顯示系統相關信息 |
inspect |
查看容器詳細信息 |
kill |
強制停止指定docker容器 |
load |
從一個tar包中加載一個鏡像(對應save) |
login |
注冊或者登陸一個docker源服務器 |
logout |
從當前Docker registry退出 |
logs |
輸出當前容器日志信息 |
pause |
暫停容器 |
port |
查看映射端口對應的容器內部源端口 |
ps |
列出容器列表 |
pull |
從docker鏡像源服務器拉取指定鏡像或者庫鏡像 |
push |
推送指定鏡像或者庫鏡像至docker源服務器 |
rename |
重命名容器 |
restart |
重啟運行的容器 |
rm |
移除一個或者多個容器 |
rmi |
移除一個或多個鏡像(無容器使用該鏡像才可以刪除,否則需要刪除相關容器才可以繼續或者-f強制刪除) |
run |
創建一個新的容器并運行一個命令 |
save |
保存一個鏡像為一個tar包(對應load) |
search |
在docker hub中搜索鏡像 |
start |
啟動容器 |
stats |
統計容器使用資源 |
stop |
停止容器 |
tag |
給鏡像打標簽 |
top |
查看容器中運行的進程信息 |
unpause |
取消暫停容器 |
version |
查看容器版本號 |
wait |
截取容器停止時的退出狀態值 |