當前位置: 妍妍網 > 碼農

用了這麽多年Docker,殊不知你還有這麽多彎彎繞!

2024-06-05碼農

嗨,你好呀,我是哪咤。

單體套用拆分成微服務後,能夠實作快速開發叠代,但因為小服務太多,導致測試和部署的成本提高。

單體套用中,將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由以下七個部份組成:

  1. Docker Client 客戶端

  2. Docker Daemon 守護行程 ,提供Docker Server,用於接收Docker Client的請求,Docker Server 透過路由Router與分發排程,找到相應的 Handler 來執行請求;

  3. Docker Image 映像 ,包含Distribution(分發)、Layer(層)、Image(映像)、Registry(註冊中心)、Reference(參照);

  4. Docker Driver 驅動 ,Docker架構中的驅動模組,它主要透過與Docker守護行程進行互動,實作對Docker容器執行環境的客製和管理;

  5. Docker Graph 內部資料庫 ,Docker Graph是Docker中的一種數據結構,用於記錄和跟蹤Docker映像和容器之間的關系;

  6. Libcontainer 函式庫 ,Libcontainer是Docker的底層容器管理庫,它提供了一組介面和函式,用於建立和管理容器。Libcontainer直接與內核互動,負責容器的名稱空間、cgroup、網路裝置等底層操作;

  7. Docker Container 容器 ,Docker Container是Docker中的容器例項,它是透過Driver和Libcontainer共同協作建立出來的。Driver提供了容器的執行環境客製,而Libcontainer則負責容器的具體建立和管理操作。

二、Docker架構圖

  1. 使用者使用 Docker Client (客戶端) 與 Docker Daemon 建立通訊,並行送請求給後者,客戶端和守護程式之間透過REST API進行通訊,可以使用UNIX套接字或網路介面;

  2. Docker Daemon (後台守護行程)提供Docker Server,用於接收Docker Client的請求,Docker Server 透過路由Router與分發排程,找到相應的 Handler 來執行請求,Docker Daemon提供Docker Engine,Engine是Docker 架構中的執行引擎,在Docker Engine中,一個Job可以被認為是內部最基本的工作執行單元。Docker可以做的每一項工作,都可以抽象為一個Job。例如,在容器內部執行一個行程,這是一個Job;建立一個新的容器,這也是一個Job。

  3. Docker Image 映像,包含Distribution(分發)、Layer(層)、Image(映像)、Registry(註冊中心)、Reference(參照)。

  4. Docker Driver 驅動,Docker架構中的驅動模組,它主要透過與Docker守護行程進行互動,實作對Docker容器執行環境的客製和管理;

  5. 當需要容器映像時,則從 Registry(註冊中心) 中下載映像,並透過映像管理驅動 Graphdriver 將下載映像以 Graph 的形式儲存;

  6. Docker Graph 內部資料庫 ,Docker Graph是Docker中的一種數據結構,用於記錄和跟蹤Docker映像和容器之間的關系;

  7. 一個 Repository 表示某類映像的倉庫,同一個 Repository 內的映像用 Tag 來區分,一個 Registry 包含多個Repository,一個 Repository 包含同型別的多個 Image,並儲存著每一個容器映像的具體資訊;GraphDB是一個基於SQLite的小型圖資料庫,記錄容器映像之間的關系;

  8. rootfs是Docker容器的根檔案系統,它位於bootfs之上,表現為Docker容器的根目錄,包含基本的檔和目錄。在Docker中,rootfs由內核掛載為「唯讀」模式,而後透過「聯合掛載」技術額外掛載一個「可寫」層;

  9. 透過 Networkdriver 完成Docker容器網路環境的配置,其中包括Docker啟動時為Docker環境建立網橋等功能;

  10. Docker Execdriver是Docker容器的執行驅動,負責建立容器執行名稱空間,負責容器資源使用的統計與限制,負責容器內部行程的真正執行等;

  11. Libcontainer 是Docker的底層容器管理庫,它提供了一組介面和函式,用於建立和管理容器。Libcontainer直接與內核互動,負責容器的名稱空間、cgroup、網路裝置等底層操作;

  12. Docker Container 是Docker中的容器例項,它是透過Driver和Libcontainer共同協作建立出來的。Driver提供了容器的執行環境客製,而Libcontainer則負責容器的具體建立和管理操作。Docker Container是Docker架構中服務交付的最終體現形式。實作「一次構建,到處執行」的目標,大大提高了應用程式的部署效率和可移植性。

1、Docker Client 客戶端

Docker Client是Docker的客戶端工具,也被稱為Docker命令列界面(CLI)。它是使用者與Docker平台進行互動的主要方式。

Docker Client 的主要作用如下:

  1. 使用者互動界面 :Docker Client提供了使用者友好的命令列互動界面,使用者可以透過輸入命令來執行各種Docker操作,例如建立容器、啟動容器、停止容器、構建映像等。

  2. 容器管理 :透過Docker Client,使用者可以方便地管理Docker容器。可以建立新的容器、啟動、停止、重新開機容器,並且還可以檢視容器的日誌、狀態等資訊。

  3. 映像管理 :Docker Client也允許使用者管理Docker映像。使用者可以搜尋、下載、構建、刪除映像等操作,以滿足應用程式部署的需求。

  4. 資源配置 :使用者可以透過Docker Client配置容器的執行資源,例如CPU、記憶體等。這樣可以確保容器在執行時具有合適的資源配置。

  5. 網路通訊 :Docker Client可以與Docker Daemon進行通訊,發送請求並接收響應。它使用REST API或其他通訊協定與Docker Daemon進行互動,從而實作對Docker容器的遠端管理。

Docker Client是使用者與Docker平台進行互動的重要工具。它提供了命令列界面,讓使用者能夠方便地管理Docker容器和映像,並進行資源配置和網路通訊等操作。

2、Docker Daemon 守護行程

Docker Daemon是Docker的守護行程,它是Docker平台的後台服務元件,充當伺服器角色。

Docker Daemon 的主要作用如下:

  1. 容器管理 :Docker Daemon負責建立、啟動、停止、刪除和管理Docker容器。它接收來自Docker客戶端的請求,並根據請求執行相應的容器管理操作。

  2. 映像管理 :Docker Daemon也管理Docker映像。它可以下載、上傳、構建和刪除映像,並管理映像的版本控制和安全性。

  3. 網路資源管理 :Docker Daemon負責建立和管理Docker容器的網路環境。它配置和管理容器的網路設定,確保容器之間的通訊和互相存取。

  4. 數據卷管理 :Docker Daemon還管理容器的數據卷,用於持久化儲存容器中的數據,保證數據的可靠性和永續性。

Docker Daemon是Docker平台的核心元件,提供容器、映像、網路和數據卷的管理功能。它扮演著守護行程的角色,確保Docker平台的正常執行和管理。

3、映像(Image)

在Docker映像中,Distribution、Layer、Image、Registry和Reference各自扮演了重要角色。

  1. Distribution(分發) :通常涉及到Docker映像的分發和運輸。Docker映像可以透過不同的方式進行分發,例如直接從Registry下載,或者透過特定的工具匯入和匯出;

  2. Layer(層) :Docker映像由多個layer層組成,每層都是一個唯讀的檔案系統。這種分層設計可以實作共享和復用,提高效率。當映像中的檔發生變化時,Docker只會下載發生變化的層,而不是整體映像,節省了時間和寬頻;

  3. Image(映像) :映像是Docker的核心,它是執行容器的基礎。映像包含了執行應用程式的所有檔和依賴,是一個唯讀樣版,可以透過映像建立新的容器例項;

  4. Registry(註冊中心) :Registry是儲存和管理Docker映像的伺服器。它是使用者上傳、下載、管理Docker映像的地方。例如Dokcer Hub就是一個公共的Registry;

  5. Reference(參照) :參照指的是Docker映像的一種標識,透過參照,使用者可以指定需要操作的特定映像;


三、run的流程和docker原理

1、run的流程

2、與傳統虛擬化方式對比

這就是Docker為何比虛擬化更快的原因,Docker有著比虛擬機器更少的抽象層,docker利用的是宿主機的內核,VM需要的是Guest OS。

直接存取、經濟、穩定 使用最新ChatGpt4o的方法

給大家推薦一個ChatGPT 4o國內網站,是我們團隊一直在使用的,我們對接的是OpenAI官網的帳號,給大家打造了一個一模一樣的ChatGPT,很多粉絲朋友現在也都透過我拿這種號,價格不貴,關鍵還有售後 。

一句話說明 用官方一半價格的錢,用跟官方 ChatGPT4.0 一模一樣功能的工具,而且不需要魔法,直接使用,不用擔心網路問題。

功能簡介:O penAI最新大模型GPT-4o、ChatGPT4.0知識問答、最強程式碼大模型Code Copilot、DALL-E AI繪畫、寫論文大模型Consensus、論文降重大模型(中文論文降重)、圖片自動辨識、聯網查詢、BUG解決、程式碼最佳化、上傳檔、數據分析等。

國內直接使用 ChatGPT4o

  1. 支持OpenAI最新的ChatGPT4o。

  2. 無需魔法, 同時支持 PC、手機、平板,瀏覽器直接使用

  3. 一個帳號一個專屬授權碼,保護個人私密,使用記錄長期保存。

  4. ChatGPT3.5永久免費, 提供免費共享GPT3.5授權碼 。

  5. 官方獨立帳戶規定每3小時40次 4.0提問,我們這個不限制4.0提問次數。

  6. 我們這個不會出現封號的情況,避免你因為封號多花冤枉錢。

  7. 聯系站長 18640839506 ,備註AI,直接使用ChatGPT4o,拉你進ChatGPT售後群,群公告有使用說明和註意事項,有任何問題群裏交流,群裏有專業的技術支持

ChatGPT4o

NOW 6 .3

四、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

五、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 截取容器停止時的結束狀態值

回復gpt,獲取ChatGPT4o直接使用地址

點選閱讀原文,國內直接使用ChatGpt4o