Docker入門——理解Docker的核心概念

来源:https://www.cnblogs.com/larrydpk/archive/2020/06/30/13211467.html
-Advertisement-
Play Games

1 前言 相信不少人聽過這麼一句話: 人類的本質是復讀機。 在軟體開發領域也一樣,我們總是想尋找更好地方式複製優秀的邏輯或系統。最核心的方法是抽取通用邏輯和組件,把差異化的東西介面化或配置化,達到復用的效果。如Java的Build Once, Run Everywhere,還有Spring的強大的抽 ...


1 前言

相信不少人聽過這麼一句話:

人類的本質是復讀機。

在軟體開發領域也一樣,我們總是想尋找更好地方式複製優秀的邏輯或系統。最核心的方法是抽取通用邏輯和組件,把差異化的東西介面化或配置化,達到復用的效果。如JavaBuild Once, Run Everywhere,還有Spring的強大的抽象能力。這是應用層面的復用,Docker則在系統層面作文章,讓我們可以快速複製一個系統(如CentOS)或一個服務(如Kafka)。

2 Docker的便利與優勢

利用Docker,我們可以很快的使用別人已經建立好的鏡像來發佈一個完整的系統或某個組件。它至少提供了以下便利:

  • 提供一致的運行環境。從同一個鏡像文件創建容器,應用運行環境相同,保持開發環境、測試環境和生產環境的一致。這能減少許多因環境差異和配置差異帶來的問題。測試提了Bug,開發再也不能第一時間回:是你環境沒配好吧?是你不會用吧?
  • 彈性的系統。因Docker可快速啟動/停止,使系統能根據請求量/數據量動態的改變運行的服務數量,以提供伸縮可變的系統服務。
  • 微服務開發。容器可以非常輕量級,而且可快速動態啟停,非常適用於微服務架構。一臺物理機器也能運行多個容器,不一定需要物理集群。

複製一個系統,我們可以通過增加一臺物理機,或者通過虛擬機技術運行多個系統,現在有了Docker,還可以通過它來啟動一個系統。與其它方式相比,Docker有以下優勢:

  • 啟動速度快,秒級的啟動速度;

  • 性能好,近似物理機的性能,不會有過多資源損失和性能浪費;

  • 體量小,鏡像可以做得更小(MB級),不像虛擬機的幾GB;

  • 跨平臺,能在Linux/Unix/Mac/Windows系統下運行;

  • 利於CI/CD,有成熟的技術實踐;

  • 社區活躍,有大公司背書,應用廣泛,鏡像資源豐富。

3 Docker核心概念

3.1 鏡像Image

說起鏡像,不由想起當年拿著U盤搗鼓各種系統的日子。那時會找各種系統的iso文件,下載速度還特別慢,幾GB的文件呢。那些iso文件,就是鏡像文件。但這些鏡像文件是相對於物理機系統或虛擬機技術而言的,而不是Docker的鏡像文件。

對於Docker而言,鏡像會被統一管理,在本地有特定的地方存放鏡像,不同的系統位置不一樣。一般而言,是無須自己管理鏡像文件的,Docker會有效地管理和組織。列出所有鏡像命令如下:

docker images
或docker image ls

Docker由鏡像啟動容器,就像通過iso文件安裝啟動系統一樣。鏡像是通用的,因此也是可以共用的。一般我們可以通過復用別人做好的優秀鏡像來提高開發效率。我們只需要在別人鏡像的基礎上做定製開發即可。例如我們可拉取一個帶JDKLinux鏡像,然後把自己的Java應用添加上去,形成自己新的鏡像。

為了提高復用率與速度,我們將鏡像分層,如下圖所示:

如鏡像B是基於鏡像A打包而成的,則鏡像B比鏡像A多一層。鏡像B包含了鏡像A的所有層級。這樣做的好處是,不用管理一個大的鏡像,而管理層級變化。假如本機已經下載了鏡像E,則本機已經有(A, B, C, E),當需要拉取F的時候,不再需要拉取(A, B)了。這利用了Docker的緩存技術,另外,在構建新鏡像時,同樣也使用了緩存。

標簽Tag是鏡像的重要概念,一般用於標記版本號,對於同一個鏡像源名,可以有多個標簽,如redis:5.0.8redis:latest5.0.8latest都是標簽名,預設使用latest

3.2 容器Container

有了鏡像後,就可以創建容器了。啟動一個容器,就像啟動一個進程一樣快速,可以通過docker run命令啟動,如下:

$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

容器提供了軟體硬體環境,會消耗物理機資源,同時它還具有狀態,相互隔離。可以從一個鏡像啟動多個不同的容器,如從Ubuntu鏡像啟動多個Ubuntu系統。可以通過命令docker ps查看當前運行的容器,已經停止的容器不會顯示出來。當容器停止時,容器文件並不會消失,可以通過docker ps -a查看所有容器。

可以簡單理解鏡像與容器的關係:

鏡像是容器的模板,是沒運行沒狀態的文件,啟動容器需要鏡像。容器是運行著的、帶狀態的相互隔離的服務。可以由一個鏡像啟動多個容器,也可以從一個容器創建一個鏡像,但這並不說明兩者是可逆的相互轉換。

3.3 倉庫Repository

倉庫很容易理解,就是存放鏡像的地方。既然鏡像是通用的,可以共用,那就需要一個共用的地方,倉庫承擔著這樣一個責任。這跟mavennpm等是同樣的道理。最大、最常用的倉庫當然是官方倉庫Docker Hub,但國內訪問速度也相當感人,可以通過使用國內倉庫解決這個問題,如使用阿裡的倉庫。這跟GitHubmaven也是何其相似。

我們可以從倉庫拉取別人的鏡像,也可以把自己構建的鏡像推送到倉庫上。

4 總結

本次主要講解一下Docker的概念,實踐與命令以後再一一道來。

歡迎訪問南瓜慢說 www.pkslow.com獲取更多精彩文章!

歡迎關註微信公眾號<南瓜慢說>,將持續為你更新...

多讀書,多分享;多寫作,多整理。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 先上預覽地址 http://106.12.212.110:8077/#/ 1.創建項目 使用vue init webpack temperaure 創建一個vue項目 然後安裝axios zrender 命令分別是 npm install axios -S npm install zrender安裝 ...
  • 在最近的一周,我維護的業務系統出現了很多壞毛病,一周七天crash掉了4次,每次都需要都是因為一點很小的問題,觸發了蝴蝶效應,導致整個系統全盤崩潰,於是產生除了敘述本篇的想法,當然這並不是為了掩蓋我在Coding上的一些細節處理和職責疏忽,只是為了從根本的細節上去分析這些問題。 (一、)為什麼會產生 ...
  • 需求:1、點擊新增一欄商品信息,表單驗證區分 2、輸入SKU編碼,帶出當前行的產品名稱,品牌及單位 解決: ...
  • 本文將以UI設計師轉型做web前端作為案例,詳細解讀學web前端該學習哪些專業知識!當然也適用於所有想轉型web前端的親們! 如何學習web前端知識轉型? 不少UI設計師想要學習web前端知識,一方面是喜歡那些華麗的網頁特效,另一方面則是想成為全棧式UI設計師。 1、HTML/CSS學習 第一階段, ...
  • 使用插件: vue-i18n 1. 安裝: npm install vue-i18n 2. 目錄結構 // i18n.js import Vue from 'vue' import VueI18n from 'vue-i18n' import messages from './lang' Vue.u ...
  • 預設表單提示是英文的,我們可以安裝語言包構建多語言環境。 根據版本選擇命令 For Laravel 7.x : run composer require caouecs/laravel-lang:~6.0 For Laravel 6.x : run composer require caouecs/ ...
  • 1.代碼生成器: [正反雙向](單表、主表、明細表、樹形表,快速開發利器)freemaker模版技術 ,0個代碼不用寫,生成完整的一個模塊,帶頁面、建表sql腳本、處理類、service等完整模塊2.多數據源:(支持同時連接無數個資料庫,可以不同的模塊連接不同數的據庫)支持N個數據源3.阿裡資料庫連 ...
  • 基於Nexus搭建私服 1. 工作流程 2. 倉庫類型 hosted 私服倉庫 proxy倉庫 遠程倉庫 group倉庫 組倉庫,裡面可以設置組合多個倉庫。按順序獲取jar。 3. 預設倉庫 安裝好了Nexus後,會內置幾個maven的預設倉庫。可自定義倉庫。 maven-central proxy ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...