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