1.docker概述及其歷史

盛開的太陽發表於2021-09-16

一. 為什麼會出現docker?

不用說, 肯定是時代進步的產物. 那麼, 他為什麼能火?? 一定是解決了痛點問題. docker也不是一下子就火起來了, 他的火也是有一個過程的, 我們先來看看為什麼會出現docker, 他解決了什麼樣的問題.

第一種情況: 解決環境不一致的問題

通常, 程式設計師開發的時候是在開發環境, 提測階段部署到測試環境. 那麼常常會遇到一個現象, 在開發環境執行的好好的, 怎麼一部署到測試環境就有問題了呢? 開始各種排查, 最後發現, 可能是機器配置不一樣, 導致tomcat啟動超時等等等. 這種問題必須排查, 但是特別耗時, 仔細想想, 並不是特別需要. 如果能避免, 也給開發和運維節省了不少時間.

第二種情況: 解決叢集環境, 伺服器繁多複雜的問題

通常我們會有三套環境, 開發環境, 測試環境,線上環境. 每一套環境都是一個叢集.

一個叢集裡, 各種各樣的軟體, jdk, nginx, mysql,  mongodb, redis......有很多. 以前運維老師是怎麼幹的? 搭建一個新的環境, 一臺伺服器一臺伺服器的安裝. 像mysql還有配置環境, 一個伺服器一個伺服器的配置, 累的半死.

這種重複造輪子的工作, 在java程式碼中是儘量避免的. 那麼在運維環境是否也可以避免呢? 有想法,那麼就會有實踐. docker的實用場景之一就是一次部署, 到處使用

怎麼個到處實用法呢? 舉個例子

搬家, 我們以前搬家都是怎麼搬的? 我要從A地搬到B地了. 僱一個把家公司, 把家裡的傢俱全部都搬走, 搬到另一個地方, 一團亂, 然後慢慢收拾

如果很牛逼的話, 找一個省事的辦法. 我直接吧A地的房子咔嚓, 直接把房子搬到B地. 房子裡的東西原來放哪裡,現在還放哪裡. 這是不是就省了不少的事.

從搬家--->搬房子, 不得不說是一個思想的進步.

對運維來說,也是如此, 如果能夠將環境一起打包, 然後在各個機器上一件安裝, 的確可以節省不少時間.

二. docker的理念

docker的思想來源於集裝箱. 原來我們在專案中, 如果想要有一個通用的模組給到其他各個服務使用, 我們可以打成jar包, 但打jar存在的問題是什麼? jar包衝突, 第一個jar引入了一個依賴, 第二個jar包也引入了這個依賴, 他們的版本還不相同, 就會有衝突. 因為jar包和jar包之前是相互交叉.

docker剛好相反, docker是隔離的, 隔離是docker的核心.   隔離就可以理解為集裝箱的打包裝箱. 每一個箱子都是互相隔離的. 使用docker, 我們就不用擔心衝突問題了, 也不用擔心環境問題了. 我們可以直接通過docker來進行部署.

有了隔離機制, 如果一個出了問題, 不會影響其他的. 另一個好處就是, 可以將伺服器壓榨到極致. 我們平時跑專案的時候, 要啟動mysql, redis, tomcat等全部跑起來很浪費記憶體空間. 而docker由於相互之間是隔離的, 那麼可以利用起來很小的空間, 將伺服器壓榨到極致.

docker還有一個好處, 就是將記憶體空間壓榨到極致.

docker是基於go語言實現的雲開源專案

docker的主要目標是: "Build, ship and Run Any App, Anywhere", 即: 構建,分發,部署,執行等, 一次操作, 在各個app,各個地方都可以執行. 做到:"一次封裝, 到處執行"

彙總一句話: 解決了執行環境和配置問題軟體容器, 方便做持續整合並有助於整體釋出的容器虛擬化技術.

三. docker的歷史

  1. 2010年, 幾個年輕的美國人成立了一家公司叫做dotCloud,這家公司主要做pass雲端計算服務,其底層技術上,dotCloud 平臺利用了 Linux 容器技術,他們將自己的的技術命名為docker.

  2. docker剛誕生的時候, 並沒有引起行業的注意, dotCloud公司越來越難, 經濟效益也不景氣, 後來就要活不下去了, 他們有強烈的願望, 希望能活下去. 於是, 想了一個辦法, 將docker開源.

  3. 2013年, docker開源了. 並且他們也將公司正式改名為Docker. docker受到越來越多的人關注. 漸漸的docker就火了. 活了以後, docker每個月就會更新一個版本. 2014年.4.9 docker1.0釋出.

從這裡, 我們可以學到什麼?

沒有誰的成功是一帆風順的, 如果不是因為dotCloud公司效益不景氣, 如果不是大家齊心協力想要活下去, 可能docker會更晚和我們見面. 遇到問題, 沒關係, 一定要想辦法克服困難, 克服了的困難就不是困難了.

四. docker和虛擬機器的區別

虛擬機器: 在windows中安裝一個vmware, 通過這個軟體我們可以虛擬查來一臺或者多臺電腦,

虛擬機器屬於虛擬化技術, docker容器是一種容器技術, 他也是一種虛擬化技術.

對虛擬機器而言, 我們需要關注軟體和硬體, 而docker容器,我們更多的是關注其軟體.

舉例: 在vm上安裝linux centos原生映象, 這就是安裝一個獨立的電腦, 好處是和其他主機/虛擬機器相互隔離.

在docker上也可以安裝linux映象, 這個映象和vm上安裝的映象是不一樣的. 在docker上安裝的映象通常只有4M, 就夠了, 這裡只需要安裝linux centos的核心, 他的核心就是一些操作命令+開機啟動等. docker上的映象是十分小巧的.

docker的一個最大的優勢就是, 輕量, 小巧!

要了解docker和虛擬機器的區別. 我們首先要知道虛擬機器是什麼原理, docker是怎麼個原理,然後對比二者的異同~

4.1 虛擬機器

我們基本都使用過虛擬機器, 常用的虛擬機器是Vmware. 為什麼會使用虛擬機器呢? 通常我使用的是windows電腦, 我想要模擬一臺linux伺服器, 方便部署應用. 或者我現在使用的mac, 但是很多應用都習慣了使用windows, 所以 在mac上安裝了一臺虛擬機器, 這樣, 想用mac就用mac, 想用windows就可以用windows了.

  • 基礎設施(Infrastructure)。它可以是你的個人電腦,資料中心的伺服器,或者是雲主機。
  • 主作業系統(Host Operating System)。你的個人電腦之上,執行的可能是MacOS,Windows或者某個Linux發行版。
  • 虛擬機器管理系統(Hypervisor)。利用Hypervisor,可以在主作業系統之上執行多個不同的從作業系統。型別1的Hypervisor有支援MacOS的HyperKit,支援Windows的Hyper-V以及支援Linux的KVM。型別2的Hypervisor有VirtualBox和VMWare。
  • 子作業系統(Guest Operating System)。假設你需要執行3個相互隔離的應用,則需要使用Hypervisor啟動3個子作業系統,也就是3個虛擬機器。這些虛擬機器都非常大,也許有700MB,這就意味著它們將佔用2.1GB的磁碟空間。更糟糕的是,它們還會消耗很多CPU和記憶體.

上面是從虛擬機器和主機之間的角度來分析瞭解虛擬機器是如何搭建的, 通過上圖, 我們可以看出, 一臺主機上可以安裝一個或者多個虛擬機器, 但是每個虛擬機器都比較耗費資源. 為什麼會耗費很多的資源呢, 我們再從虛擬機器自己的結構來說明, 如下圖:

我們知道, 虛擬機器就是虛擬的和主機一樣功能的機器, 所以主機需要什麼, 虛擬機器也需要什麼.

  1. 首先要有核心, 一臺伺服器, 他的核心是很小的.

2.各種lib庫, 每一個虛擬機器都擁有自己的lib庫,

  1. 然後,我們可以在虛擬機器上安裝各種應用. 這些應用依賴於lib庫. 由於共享同一份lib庫, 那麼就可能會出現衝突問題, 比如埠, 一個埠只能被一個應用使用.

我們每次建立一臺虛擬機器, 都要為其分配核心, 各種lib庫. 並且每次建立都要重複建立這些東西. 這樣耗費資源就會很多, 冗餘步驟很多, 由於本身又比較笨重, 啟動速度會比較慢.

4.2 docker

  • 基礎設施(Infrastructure)。它可以是你的個人電腦,資料中心的伺服器,或者是雲主機。
  • 主作業系統(Host Operating System)。所有主流的Linux發行版都可以執行Docker。對於MacOS和Windows,也可以執行Docker。
  • Docker守護程式(Docker Daemon) 。Docker守護程式取代了Hypervisor,它是執行在作業系統之上的後臺程式,負責管理Docker容器
  • 各種依賴。對於Docker,應用的所有依賴都打包在Docker映象中,Docker容器是基於Docker映象建立的。
  • 應用。應用的原始碼與它的依賴都打包在Docker映象中,不同的應用需要不同的Docker映象。不同的應用執行在不同的Docker容器中,它們是相互隔離的。

以上是從一臺主機的角度來分析docker, 下面從docker容器的角度來看看:

我們的計算機是有一個Kernel核心, 容器共享了主機的核心, 在核心上執行很多個容器, 每個容器有自己的lib庫, 容器和容器之間是相互隔離的, 就算容器A和容器B都可以使用8080埠. 和虛擬機器相比, 我們發現容器比虛擬機器輕量了很多很多. 少了核心, 少了硬體, 只有必須的lib庫.

4.3 兩者的區別

虛擬機器技術的缺點:

  • 資源佔用十分多
  • 用於步驟很多
  • 啟動速度慢

docker與虛擬機器的不同

  • 傳統虛擬機器, 虛擬出一條硬體,執行完整的作業系統, 然後在這個作業系統上安裝和執行軟體
  • 容器內的應用直接安裝在主機的核心上, 容器沒有自己的核心, 也沒有虛擬的硬體, 所以就輕便了.由於沒有臃腫的子作業系統,Docker可以節省大量的磁碟空間以及其他系統資源。
  • 每個容器間是相互隔離的, 每個容器都有自己的檔案系統, 互不影響.
  • 容器的啟動速度很快, 一般在幾毫秒~幾十毫秒

Docker有很多優勢,但是也不能替代虛擬機器技術,因為兩者有不同的使用場景。

  • 虛擬機器更擅長於徹底隔離整個執行環境.例如,雲服務提供商通常採用虛擬機器技術隔離不同的使用者。Docker通常用於隔離不同的應用,例如前端,後端以及資料庫。
  • 容器和虛擬機器都可以獲取整個網路連結。
  • 容器執行的是不完整的作業系統(儘管它們可以),虛擬機器必須執行完整的。
  • 容器和虛擬機器相比, 可以更多的利用起來小塊的閒置資源,它們不執行完整的作業系統。
  • 容器需要毫秒分配,虛擬機器需要幾分鐘。所以,你可以另配、重新平衡、釋放以及使用容器比虛擬機器的迭代更加迅速。
  • 離目標程式越遠,隔離會變得更昂貴。虛擬機器是偉大的,它通過抽象來增加並行,服務於多作業系統的使用情況以及業界最好的安全性。但對於隔離,它們相當的昂貴,容器提供的隔離就便宜。

我們需要根據不同的應用場景和需求採用不同的方式使用Docker技術或使用伺服器虛擬化技術。例如一個典型的Docker應用場景是當主機上的Docker例項屬於單一使用者的情況下,在保證安全的同時可以充分發揮Docker的技術優勢。對於隔離要求較高的環境如混合使用者環境,就可以使用伺服器虛擬化技術。

五. 容器在DevOps(開發,運維)中的作用

  • 應用更快速的交付和部署

傳統: 每臺伺服器要安裝哪些應用, 配置哪些環境變數, 安裝順序, 都會一一記錄到幫助文件

docker: 打包映象, 一鍵執行.

  • 更便捷的升級和擴縮容

傳統: 需要安裝軟體, 部署, 重複工作

docker: 部署應用就像搭積木, 專案打包為一個映象, 擴充套件伺服器非常方便.

  • 更簡單的系統運維

在容易化部署之後, 我們的開發, 測試環境都是高度一致的, 不會出現在開發耗時, 部署到測試,線上不好使的情況

  • 更高效的利用計算機資源

docker是核心級別的虛擬化, 可以在一個物理機上執行很多個容器例項, 伺服器的效能可以被壓榨到極致.

通常, 一臺主機只能同時執行2-3個虛擬機器, 但是可以同時執行20-30個容器

六. docker學習資源

  1. docker官網: https://www.docker.com

  2. docker文件: https://docs.docker.com/   docker的文件非常詳細

  3. docker倉庫: https://hub.docker.com/

七. 我們來看一下各大佬公司是如何使用docker的

1. 新浪微博

1.docker概述及其歷史

這裡注意一個重點你:docker使大規模動態排程成為可能, 因為他可以彈性的擴縮容

2. 美團

3.蘑菇街

相關文章