![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLiAjM2EzLcd3LcJzLcJzdllmVldWYtl2Pml2ZugTNjN2M5QWO0UTNiJDZjR2M4EzNzgjYmVDMkZjNjRTNvwFNxkDMxUTMtUGall3LcVmdhNXLwRHdo9CXt92YucWbpRWdvx2Yx5yazF2Lc9CX6MHc0RHaiojIsJye.gif)
◆ Docker的原理
Docker有三個核心元件,掌握這三個元件的概念有助于我們進一步了解Docker的工作機制。
- 鏡像:Docker Image,它是容器運作所需要的靜态二進制檔案和依賴包的集合,可以将它了解為一個面向Docker的隻讀模闆,容器鏡像基于分層的聯合檔案系統(UnionFS)實作。使用者可以根據需求,通過DockerFile定制容器鏡像,同時Docker提供了對鏡像的各種API操作指令實作鏡像版本管理的功能。
- 容器:Docker Container,是從鏡像建立的應用,是鏡像的動态運作執行個體,Docker利用容器來運作和隔離應用。鏡像自身是隻讀的,容器從鏡像啟動時在鏡像最上層建立一個可寫層,鏡像本身保持不變,容器啟動後以程序的方式運作。另外,Docker支援一個容器對應一個程序的方式,而這種方式也非常适合以單程序運作為主的微服務架構。
- 倉庫:Docker Repository,主要用來存放鏡像,可以分為公有倉庫和私有倉庫。當使用者建立了自己的鏡像之後,就可以使用推送的方式将它上傳到指定的公有倉庫或私有倉庫。這樣使用者下次在另一台機器上使用該鏡像時,隻需将其從倉庫拉取下來就可以了。
這三個元件組成了Docker的整個生命周期,下圖是三者之間的關系。
Docker采用C/S架構,下面是Docker的主要運作過程和原理圖,同時涵蓋了Docker的核心元件。
- 首先,Client通過相應的Docker指令以及HTTP或REST API等方式與Docker Daemon實作Docker服務的使用與管理。
- 其次,Docker Daemon作為服務端(部署在本地或者遠端),負責監聽Client的請求并管理Docker對象(容器、鏡像、網絡等),Docker Image提供容器運作所需的所有檔案。
- Docker Daemon通過通路容器鏡像倉庫,負責Docker鏡像的存儲管理。鏡像倉庫可以用DockerHub或者自建私有鏡像倉庫。
可以通過Docker push或pull操作往鏡像倉庫上傳或下載下傳鏡像。
◆ Docker建構部署過程
Docker建構部署過程主要包括下面三個步驟。
- 建構:通過DockerFile來描述應用依賴的運作環境,包括作業系統、啟動端口、執行腳步,通過編譯運作DockerFile來生成Docker鏡像,并放在本地倉庫中。
- 裝載:将鏡像推送(Push)到遠端倉庫。
- 部署運作:從倉庫拉取(Pull)鏡像,并建立容器執行個體,啟動部署容器執行個體。
下 面 我 們 以 金 融 公 司 開 源 微 服 務 網 關 産 品 ——SIAGateway(GitHub上的開源項目)為例,示範如何編寫DockerFile,以及Docker建構部署過程。
◆ 網關項目源碼結構
說明:SIA-Gateway項目采用前後端分離架構,由Admin、前端(Vue)、核心(Core)三個子產品組成。在Docker示例代碼中,我們将三個子產品整體打包到一個SIA-Gateway鏡像中。
◆ DockerFile解析
對上述DockerFile說明一下,對Java開發程式員來說,大多數人都對Maven內建工具比較熟悉。其實DockerFile的編寫過程與Maven有類似的地方,可以按照打包鏡像工作的屬性大緻分為三部分,我們将這三部分總結如下。
- 首先,選擇基礎鏡像及yum源定義,如果部署機器能夠使用阿裡yum源,則此步忽略;應用運作加載需要的基礎設施和依賴庫。
- 其次,對于yum源中不存在的第三方依賴軟體庫,可以從本地通過ADD指令加載,并為鏡像定義全局環境變量。
- 最後,加載已經打包好的應用軟體包到鏡像,也可以指定應用工作目錄,以及需要使用的挂載點(Volume)等;定義鏡像運作時需要執行的相關解壓包或者授權等相關指令。
◆ 建構鏡像
使用DockerFile建構鏡像,需要注意的是,首先要把DockerFile依賴的應用包進行打包。對于SIA-Gateway項目而言,可以在根目錄下執 行 mvn install 腳 本 進 行 代 碼 打 包 。打 包 完 成 後 , 執 行docker.build.sh建構網關鏡像。下面是建構鏡像的代碼。
鏡像制作完成後,可以使用docker push指令将鏡像推送到私有倉庫或者遠端倉庫,Docker官方提供了一個搭建私有鏡像的倉庫,隻需把鏡像下載下傳下來,運作容器并暴露5000端口。Docker Hub是Docker官方維護的容器鏡像,可以使用docker search指令搜尋所有鏡像,本節省略Docker Hub的登入通路過程。
- 将SIA-Gateway推送到Docker私有倉庫的指令如下。
- 将SIA-Gateway推送到Docker Hub的指令如下。
- 可以通過docker pull指令驗證從私有倉庫下載下傳容器鏡像。
◆ 運作和部署容器鏡像
容器鏡像建構好後,就可以運作和部署容器鏡像,使用dockerrun.sh可以從本地加載部署運作SIA-Gateway鏡像。docker-run.sh腳本如下。
對docker run指令說明如下。
- docker run--name gateway-test-d reg.caiwu/sia/gateway:v1
使用docker鏡像reg.caiwu/sia/gateway:v1以背景運作模式啟動一個容器,并将容器命名為gateway-test。
- -v參數和-P參數
使用-v參數可以将主機的一個目錄映射到容器的目錄,例如主機目 錄 ${str}
/sia-gateway-buildcomponent/config 到 容 器目錄/app/jar/ROOT/gateway/config。使用-P參數可以将容器的8080端口映射到主機的8080端口。
- /bin/bash-c指令
docker run可以使用/bin/bash-c指令執行一個背景任務,這樣容器就不會退出了。目前-c參數後緊跟的參數是/app/jar/ROOT/dockerstart.sh(對應執行的背景任務),而docker-start.sh腳本檔案是在DockerFile中通過ADD指令打包到鏡像中的。
◆ 容器載入後運作腳本
我們來看下docker-start.sh。這個指令是容器啟動後加載dockerrun指令執行的容器内部網關程式的啟動腳本,這裡我們啟動了Admin和Core中的多個服務。需要注意的是,在這個腳本中,至少需要有一個服務的程序是前台運作的,保證Docker不會銷毀退出。至此,通過以上步驟實作了微服務應用基于Docker啟動部署的過程。
◆ DockerFile的常用指令
- FROM指令:是整個DockerFile的入口,必須是第一條指令。代表新制作鏡像的基礎鏡像。
【格式】
Docker中存在一種特殊的情況,就是不以任何基礎鏡像為基準。
基礎鏡像可以自己制作,也可以從開源的倉庫拉取,例如Docker Hub或者國内阿裡雲的免費倉庫。
- COPY指令:用于将主控端檔案複制到鏡像内的指定路徑。
【格式】
或
- ADD進階複制:ADD的本質作用類似COPY,将本地檔案添加到容器中。
【格式】
(1)ADD過來的壓縮包可以自動在目标路徑下進行解壓。
(2)原始路徑可以是一個連結,ADD過程會嘗試從該連結下載下傳所需的檔案到目标路徑。
(3)一般情況下,建議使用COPY,而不是ADD。因為COPY過來的檔案可以配合使用RUN來進行解壓或者其他操作,搭配使用更靈活,而且單條語句所負擔的功能唯一。
- ENV設定環境變量:ENV指令用于定義鏡像的環境變量。
【格式】
- EXPOSE暴露端口:EXPOSE指令聲明運作時容器提供的服務端口,在運作時并不會因為這個聲明,應用就會開啟這個端口的服務。
【格式】
在DockerFile中寫入這樣的聲明有兩個好處,一是幫助鏡像使用者了解這個鏡像服務的守護端口,以友善配置映射;二是在運作中使用随機端口映射時,也就是docker run-P時,會自動随機映射EXPOSE的端口。
- VOLUME挂載共享卷。
【格式】
Docker的使用原則除了每個容器做盡量少的事情,還要求容器運作時應該盡量保持容器存儲層不發生寫操作。對于資料庫類需要儲存動态資料的應用,其資料庫檔案應該儲存在卷(Volume)中,也就是将本地磁盤的某一個目錄挂載至容器内。這樣的共享目錄可以同時被多個不同的容器所使用。
- CMD服務啟動指令:Docker不是虛拟機,而是一個程序。作為程序,可以設定啟動鏡像時的具體參數,其實就是設定一些你想自動啟動的服務。
【shell格式】
【exec格式】
【參數清單格式】
在指定ENTRYPOINT指令後,用CMD指定具體的參數。
- RUN指令:是DockerFile中最常用的指令之一,用來執行指令行的指令。
【格式】
shell格式:RUN<指令>,類似直接在終端輸入指令。例如:
來源:
https://www.toutiao.com/article/7114633497968640519/?log_from=6379d68d5417b_1656571330504
“IT大咖說”歡迎廣大技術人員投稿,投稿郵箱:[email protected]
來都來了,走啥走,留個言呗~
IT大咖說 | 關于版權
由“IT大咖說(ID:itdakashuo)”原創的文章,轉載時請注明作者、出處及微信公衆号。投稿、約稿、轉載請加微信:ITDKS10(備注:投稿),茉莉小姐姐會及時與您聯系!
感謝您對IT大咖說的熱心支援!
-
相關推薦
推薦文章
- 一次性把Docker的概念、容器與虛拟機的差別、容器傳遞的優勢講清
- 從 CPU 講起,深入了解 Java 記憶體模型!
- 前端工程化:保姆級教學 Jenkins 部署前端項目
- 中進階程式員可能都不會使用spring-boot-starter-jdbc通路MySQL
- 探索雲原生技術之基石——Docker容器
- 一種并行,背壓的Kafka Consumer
- Nomad正在接管Kubernetes嗎
- MIT協定分布式檔案系統,一個簡單、友善的檔案存儲方案
- 深入淺出 Nginx 實戰與架構原理
- 技術專家帶你徹底掌握線程池