天天看點

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

◆ Docker的原理

Docker有三個核心元件,掌握這三個元件的概念有助于我們進一步了解Docker的工作機制。

  • 鏡像:Docker Image,它是容器運作所需要的靜态二進制檔案和依賴包的集合,可以将它了解為一個面向Docker的隻讀模闆,容器鏡像基于分層的聯合檔案系統(UnionFS)實作。使用者可以根據需求,通過DockerFile定制容器鏡像,同時Docker提供了對鏡像的各種API操作指令實作鏡像版本管理的功能。
  • 容器:Docker Container,是從鏡像建立的應用,是鏡像的動态運作執行個體,Docker利用容器來運作和隔離應用。鏡像自身是隻讀的,容器從鏡像啟動時在鏡像最上層建立一個可寫層,鏡像本身保持不變,容器啟動後以程序的方式運作。另外,Docker支援一個容器對應一個程序的方式,而這種方式也非常适合以單程序運作為主的微服務架構。
  • 倉庫:Docker Repository,主要用來存放鏡像,可以分為公有倉庫和私有倉庫。當使用者建立了自己的鏡像之後,就可以使用推送的方式将它上傳到指定的公有倉庫或私有倉庫。這樣使用者下次在另一台機器上使用該鏡像時,隻需将其從倉庫拉取下來就可以了。

這三個元件組成了Docker的整個生命周期,下圖是三者之間的關系。

你都30多歲的程式員了,還不懂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操作往鏡像倉庫上傳或下載下傳鏡像。

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

◆ Docker建構部署過程

Docker建構部署過程主要包括下面三個步驟。

  • 建構:通過DockerFile來描述應用依賴的運作環境,包括作業系統、啟動端口、執行腳步,通過編譯運作DockerFile來生成Docker鏡像,并放在本地倉庫中。
  • 裝載:将鏡像推送(Push)到遠端倉庫。
  • 部署運作:從倉庫拉取(Pull)鏡像,并建立容器執行個體,啟動部署容器執行個體。

下 面 我 們 以 金 融 公 司 開 源 微 服 務 網 關 産 品 ——SIAGateway(GitHub上的開源項目)為例,示範如何編寫DockerFile,以及Docker建構部署過程。

◆ 網關項目源碼結構

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

說明:SIA-Gateway項目采用前後端分離架構,由Admin、前端(Vue)、核心(Core)三個子產品組成。在Docker示例代碼中,我們将三個子產品整體打包到一個SIA-Gateway鏡像中。

◆ DockerFile解析

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

對上述DockerFile說明一下,對Java開發程式員來說,大多數人都對Maven內建工具比較熟悉。其實DockerFile的編寫過程與Maven有類似的地方,可以按照打包鏡像工作的屬性大緻分為三部分,我們将這三部分總結如下。

  • 首先,選擇基礎鏡像及yum源定義,如果部署機器能夠使用阿裡yum源,則此步忽略;應用運作加載需要的基礎設施和依賴庫。
  • 其次,對于yum源中不存在的第三方依賴軟體庫,可以從本地通過ADD指令加載,并為鏡像定義全局環境變量。
  • 最後,加載已經打包好的應用軟體包到鏡像,也可以指定應用工作目錄,以及需要使用的挂載點(Volume)等;定義鏡像運作時需要執行的相關解壓包或者授權等相關指令。

◆ 建構鏡像

使用DockerFile建構鏡像,需要注意的是,首先要把DockerFile依賴的應用包進行打包。對于SIA-Gateway項目而言,可以在根目錄下執 行 mvn install 腳 本 進 行 代 碼 打 包 。打 包 完 成 後 , 執 行docker.build.sh建構網關鏡像。下面是建構鏡像的代碼。

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

鏡像制作完成後,可以使用docker push指令将鏡像推送到私有倉庫或者遠端倉庫,Docker官方提供了一個搭建私有鏡像的倉庫,隻需把鏡像下載下傳下來,運作容器并暴露5000端口。Docker Hub是Docker官方維護的容器鏡像,可以使用docker search指令搜尋所有鏡像,本節省略Docker Hub的登入通路過程。

  • 将SIA-Gateway推送到Docker私有倉庫的指令如下。
你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?
  • 将SIA-Gateway推送到Docker Hub的指令如下。
你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?
  • 可以通過docker pull指令驗證從私有倉庫下載下傳容器鏡像。
你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

◆ 運作和部署容器鏡像

容器鏡像建構好後,就可以運作和部署容器鏡像,使用dockerrun.sh可以從本地加載部署運作SIA-Gateway鏡像。docker-run.sh腳本如下。

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?
你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

對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啟動部署的過程。

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

◆ DockerFile的常用指令

  • FROM指令:是整個DockerFile的入口,必須是第一條指令。代表新制作鏡像的基礎鏡像。

【格式】

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

Docker中存在一種特殊的情況,就是不以任何基礎鏡像為基準。

基礎鏡像可以自己制作,也可以從開源的倉庫拉取,例如Docker Hub或者國内阿裡雲的免費倉庫。

  • COPY指令:用于将主控端檔案複制到鏡像内的指定路徑。

【格式】

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?
  • ADD進階複制:ADD的本質作用類似COPY,将本地檔案添加到容器中。

【格式】

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

(1)ADD過來的壓縮包可以自動在目标路徑下進行解壓。

(2)原始路徑可以是一個連結,ADD過程會嘗試從該連結下載下傳所需的檔案到目标路徑。

(3)一般情況下,建議使用COPY,而不是ADD。因為COPY過來的檔案可以配合使用RUN來進行解壓或者其他操作,搭配使用更靈活,而且單條語句所負擔的功能唯一。

  • ENV設定環境變量:ENV指令用于定義鏡像的環境變量。

【格式】

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?
  • EXPOSE暴露端口:EXPOSE指令聲明運作時容器提供的服務端口,在運作時并不會因為這個聲明,應用就會開啟這個端口的服務。

【格式】

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

在DockerFile中寫入這樣的聲明有兩個好處,一是幫助鏡像使用者了解這個鏡像服務的守護端口,以友善配置映射;二是在運作中使用随機端口映射時,也就是docker run-P時,會自動随機映射EXPOSE的端口。

  • VOLUME挂載共享卷。

【格式】

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

Docker的使用原則除了每個容器做盡量少的事情,還要求容器運作時應該盡量保持容器存儲層不發生寫操作。對于資料庫類需要儲存動态資料的應用,其資料庫檔案應該儲存在卷(Volume)中,也就是将本地磁盤的某一個目錄挂載至容器内。這樣的共享目錄可以同時被多個不同的容器所使用。

  • CMD服務啟動指令:Docker不是虛拟機,而是一個程序。作為程序,可以設定啟動鏡像時的具體參數,其實就是設定一些你想自動啟動的服務。

【shell格式】

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

【exec格式】

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

【參數清單格式】

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

在指定ENTRYPOINT指令後,用CMD指定具體的參數。

  • RUN指令:是DockerFile中最常用的指令之一,用來執行指令行的指令。

【格式】

shell格式:RUN<指令>,類似直接在終端輸入指令。例如:

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

來源:

https://www.toutiao.com/article/7114633497968640519/?log_from=6379d68d5417b_1656571330504

“IT大咖說”歡迎廣大技術人員投稿,投稿郵箱:[email protected]

你都30多歲的程式員了,還不懂Docker的原理及建構部署過程嗎?

來都來了,走啥走,留個言呗~

 IT大咖說  |  關于版權

由“IT大咖說(ID:itdakashuo)”原創的文章,轉載時請注明作者、出處及微信公衆号。投稿、約稿、轉載請加微信:ITDKS10(備注:投稿),茉莉小姐姐會及時與您聯系!

感謝您對IT大咖說的熱心支援!

  • 相關推薦

    推薦文章

  • 一次性把Docker的概念、容器與虛拟機的差別、容器傳遞的優勢講清
  • 從 CPU 講起,深入了解 Java 記憶體模型!
  • 前端工程化:保姆級教學 Jenkins 部署前端項目
  • 中進階程式員可能都不會使用spring-boot-starter-jdbc通路MySQL
  • 探索雲原生技術之基石——Docker容器
  • 一種并行,背壓的Kafka Consumer
  • Nomad正在接管Kubernetes嗎
  • MIT協定分布式檔案系統,一個簡單、友善的檔案存儲方案
  • 深入淺出 Nginx 實戰與架構原理
  • 技術專家帶你徹底掌握線程池