1.docker概述及其歷史


一. 為什么會出現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. 新浪微博

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

2. 美團

3.蘑菇街


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM