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

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

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獲取更多精彩文章!

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

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


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

更多相關文章
  • 先上預覽地址 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 ...
一周排行
  • 比如要拆分“呵呵呵90909086676喝喝999”,下麵當type=0返回的是中文字元串“呵呵呵,喝喝”,type=1返回的是數字字元串“90909086676,999”, private string GetStrings(string str,int type=0) { IList<strin ...
  • Swagger一個優秀的Api介面文檔生成工具。Swagger可以可以動態生成Api介面文檔,有效的降低前後端人員關於Api介面的溝通成本,促進項目高效開發。 1、使用NuGet安裝最新的包:Swashbuckle.AspNetCore。 2、編輯項目文件(NetCoreTemplate.Web.c ...
  • 2020 年 7 月 30 日, 由.NET基金會和微軟 將舉辦一個線上和為期一天的活動,包括 微軟 .NET 團隊的演講者以及社區的演講者。本次線上大會 專註.NET框架構建微服務,演講者分享構建和部署雲原生應用程式的最佳實踐、模式、提示和技巧。有關更多信息和隨時瞭解情況:https://focu... ...
  • #abp框架Excel導出——基於vue #1.技術棧 ##1.1 前端採用vue,官方提供 UI套件用的是iview ##1.2 後臺是abp——aspnetboilerplate 即abp v1,https://github.com/aspnetboilerplate/aspnetboilerp ...
  • 前言 本文的文字及圖片來源於網路,僅供學習、交流使用,不具有任何商業用途,版權歸原作者所有,如有問題請及時聯繫我們以作處理。 作者:碧茂大數據 PS:如有需要Python學習資料的小伙伴可以加下方的群去找免費管理員領取 input()輸入 Python提供了 input() 內置函數從標準輸入讀入一 ...
  • 從12年到20年,python以肉眼可見的趨勢超過了java,成為了當今It界人人皆知的編程語言。 python為什麼這麼火? 網路編程語言搜索指數 適合初學者 Python具有語法簡單、語句清晰的特點,這就讓初學者在學習階段可以把精力集中在編程對象和思維方法上。 大佬都在用 Google,YouT ...
  • 在社會上存在一種普遍的對培訓機構的學生一種歧視的現象,具體表現在,比如:當你去公司面試的時候,一旦你說了你是培訓機構出來的,那麼基本上你就涼了,那麼你瞞著不說,然後又通過了面試成功入職,但是以後一旦在公司被髮現有培訓經歷,可能會面臨被降薪,甚至被辭退,培訓機構出來的學生,在用人單位眼裡就是能力低下的 ...
  • from typing import List# 這道題看了大佬寫的代碼,經過自己的理解寫出來了。# 從最外圍的四周找有沒有為O的,如果有的話就進入深搜函數,然後深搜遍歷# 判斷上下左右的位置是否為Oclass Solution: def solve(self, board: List[List[s ...
  • import requests; import re; import os; # 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537.36 (KHTML, li ...
  • import requests; import re; import os; import parsel; 1.請求網頁 header = { "user-agent":'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_5) AppleWebKit/537. ...