1.什么是Docker
Docker最初是dotCloud公司創始人Solomon Hykes在法國期間發起的一個公司內部項目,於2013年3月以Apache 2.0授權協議開源,主要項目代碼在GitHub上進行維護.
Docker使用Google公司推出的Go語言進行開發實現.
Docker是linux容器的一種封裝,提供簡單易用的容器使用接口.它是最流行的Linux容器解決方案.
Docker的接口相當簡單,用戶可以方便的創建、銷毀容器.
Docker將應用程序與程序的依賴,打包在一個文件里面.運行這個文件就會生成一個虛擬容器.
程序運行在虛擬容器里,如同在真實物理機上運行一樣,有了docker,就不用擔心環境問題了.
2.Docker應用場景
web應用的自動化打包和發布
自動化測試和持續集成、發布
在服務型環境中部署和調整數據庫或其他應用
3.為什么要用Docker?
我們先看看很久很久以前,服務器是怎么部署應用的!
由於物理機的諸多問題,后來出現了虛擬機!
但是虛擬化也是有局限性的,每一個虛擬機都是一個完整的操作系統,要分配系統資源,虛擬機多道一定程度時,操作系統本身資源也就消耗殆盡,或者說必須擴容.
4.Docker與虛擬機的區別
Docker VS 傳統虛擬機
特性 容器 虛擬機
啟動 秒級 分鍾級
硬盤使用 一般為 MB 一般為 GB
性能 接近原生 弱
系統支持量 單機支持上千個容器 一般幾十個
4.1物理機是這樣的
4.2 虛擬機是這樣的
4.3 容器是這樣的
5.環境配置的難題
讓開發人員最頭疼的麻煩事之一就是環境配置了,每台計算機的環境都不相同,應該如何確保自己的程序換一台機器能運行起來呢?
用戶必須確保的是:
操作系統的相同
各種平台庫和組件的安裝
例如:python依賴包,環境變量等.
如何一些低版本的依賴模塊和當前環境不兼容,那就頭疼了...
如果環境配置這么痛苦的話,換一台機器,就得重新配置一下,那么在安裝軟件的時候,帶着原始環境一模一樣的復制過來.
5.1解決方案-虛擬機
虛擬機也可以制作模板,基於模板創建虛擬機,保證環境問題一致
虛擬機(virtual machine)就是帶環境安裝的一種解決方案.
它可以在一種操作系統里面運行另一種操作系統,比如在Windows系統里面運行Linux系統.
應用程序對此毫無感知,因為虛擬機看上去跟真實系統一模一樣.
而對於底層系統來說,虛擬機就是一個普通文件,不需要了就刪掉,對其他部分毫無影響.
雖然用戶可以通過虛擬機還原軟件的原始環境.
缺點
(1)資源占用多
虛擬機會獨占一部分內存和硬盤空間.
它運行的時候,其他程序就不能使用這些資源了.
哪怕虛擬機里面的應用程序,真正使用的內存只有1MB,
虛擬機依然需要幾百MB的內存才能運行.
(2)冗余步驟多
虛擬機是完整的操作系統,一些系統級別的操作步驟,往往無法跳過,比如用戶登錄.
(3)啟動慢
啟動操作系統需要多久,啟動虛擬機就需要多久.可能要等幾分鍾,應用程序才能真正運行.優點
(1)資源池 - 一個物理機的資源分配到了不同的虛擬機里
(2)很容易擴展 - 加物理機器或加虛擬機
(3)很容易雲化 - 亞馬遜AWS, 阿里雲等
5.2解決方案二-Linux容器
現在:自從用上docker容器后,可以實現開發、測試和生產環境的統一化和標准化.
鏡像作為標准的交付件,可在開發、測試和生產環境上以容器來運行,最終實現三套環境上的應用以及運行所依賴內容的完全一致.
由於虛擬機的諸多問題,Linux發展出了另一種虛擬化技術:Linux容器(Linux Containers,縮寫LXC).
Linux容器不是模擬一個完整的操作系統,而是對進程進行隔離.在正常進程的外面套了一個保護層,對於容器里面進程來說,它接觸的資源都是虛擬的,從而實現和底層系統的隔離.
(1)啟動快
容器里面的應用,直接就是底層系統的一個進程,而不是虛擬機內部的進程.所以,啟動容器相當於啟動本機的一個進程,而不是啟動一個操作系統,速度就快很多.
(2)資源占用少
容器只占用需要的資源,不占用那些沒有用到的資源.虛擬機由於是完整的操作系統,不可避免要占用所有資源.另外,多個容器可以共享資源,虛擬機都是獨享資源.
(3)體積小
容器只要包含用到的組件即可,而虛擬機是整個操作系統的打包,所以容器文件比虛擬機文件要小很多.
總之,容器有點像輕量級的虛擬機,能夠提供虛擬化的環境,但是成本開銷小得多.
6.Docker容器的優勢
更高效的利用系統資源
由於容器不需要進行硬件虛擬以及運行完整操作系統等額外開銷,Docker對系統資源的利用率更高.
無論是應用執行速度、內存損耗或者文件存儲速度,都要比傳統虛擬機技術更高效.因此,相比虛擬機技術,一個相同配置的主機,往往可以運行更多數量的應用.
6.1更快速的啟動時間
傳統的虛擬機技術啟動應用服務往往需要數分鍾,而Docker容器應用,由於直接運行於宿主內核,無需啟動完整的操作系統,因此可以做到秒級、甚至毫秒級的啟動時間.大>大的節約了開發、測試、部署的時間.
6.2一致的運行環境
開發過程中一個常見的問題是環境一致性問題.由於開發環境、測試環境、生產環境不一致,導致有些bug並未在開發過程中被發現.
而Docker的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現這段代碼在我機器上沒問題啊
這類問題.
6.3持續交付和部署
對開發和運維(DevOps)人員來說,最希望的就是一次創建或配置,可以在任意地方正常運行.
使用Docker可以通過定制應用鏡像來實現持續集成、持續交付、部署.開發人員可以通過Dockerfile來進行鏡像構建,並結合持續集成(Continuous Integration)系統進行集成測試,
而運維人員則可以直接在生產環境中快速部署該鏡像,甚至結合持續部署(Continuous Delivery/Deployment)系統進行自動部署.
而且使用Dockerfile使鏡像構建透明化,不僅僅開發團隊可以理解應用運行環境,也方便運維團隊理解應用運行所需條件,幫助更好的生產環境中部署該鏡像.
6.4更輕松的遷移
由於Docker確保了執行環境的一致性,使得應用的遷移更加容易.Docker可以在很多平台上運行,無論是物理機、虛擬機、公有雲、私有雲,甚至是筆記本,其運行結果是一致的.
因此用戶可以很輕易的將在一個平台上運行的應用,遷移到另一個平台上,而不用擔心運行環境的變化導致應用無法正常運行的情況.
7.Docker三大概念
容器三大基本概念
鏡像 image
容器 container
倉庫 repository
docker整個生命周期就是這三個概念.
7.1Docker鏡像
Docker鏡像就是一個只讀的模板.
例如:一個鏡像可以包含一個完整的CentOS操作系統環境,里面僅安裝了Apache或用戶需要的其他應用程序.
鏡像可以用來創建Docker容器.
Docker提供了一個很簡單的機制來創建鏡像或者更新現有的鏡像,用戶甚至可以直接從其他人那里下載一個已經做好的鏡像來直接使用.
7.2image的分層存儲
因為鏡像包含完整的root文件系統,體積是非常龐大的,因此docker在設計時按照Union FS的技術,將其設計為分層存儲的架構.
鏡像不是ISO那種完整的打包文件,鏡像只是一個虛擬的概念,他不是一個完整的文件,而是由一組文件組成,或者多組文件系統聯合組成.
7.3Docker容器(container)
image和container的關系,就像面向對象程序設計中的類和實例一樣,鏡像是靜態的定義(class),容器是鏡像運行時的實體(object).
容器可以被創建、啟動、停止、刪除、暫停
Docker利用容器來運行應用.
容器是從鏡像創建的運行實例.它可以被啟動、開始、停止、刪除。每個容器都是相互隔離的,保證安全的平台.
可以把容器看做是一個簡易版的Linux環境(包括root用戶權限、進程空間、用戶空間和網絡空間等)和運行在其中的應用程序.
注意:鏡像是只讀的,容器在啟動的時候創建一層可寫層作為最上層.
7.4Docker倉庫(repository)
倉庫是集中存放鏡像文件的場所.有時候把倉庫和倉庫注冊服務器(Registry)混為一談,並不嚴格區分.實際上,倉庫注冊服務器上往往存放着多個倉庫,每個倉庫中又包含了多個鏡像,每個鏡像有不同的標簽(tag).
倉庫分為公開倉庫(Public)和私有倉庫(Private)兩種形式.
最大的公開倉庫是Docker Hub,存放了數量龐大的鏡像供用戶下載.國內的公開倉庫包括Docker Pool等,可以提供大陸用戶更穩定快讀的訪問.
當用戶創建了自己的鏡像之后就可以使用push命令將它上傳到公有或者私有倉庫,這樣下載在另外一台機器上使用這個鏡像時候,只需需要從倉庫上pull下來就可以了.
注意:Docker倉庫的概念跟Git類似,注冊服務器可以理解為GitHub這樣的托管服務.
8.Docker Registry
Docker Registry公開服務是開放給用戶使用、允許用戶管理鏡像的Registry服務.
一般這類公開服務允許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像.
最常使用的Registry公開服務是官方的Docker Hub,這也是默認的Registry,並擁有大量的高質量的官方鏡像.
除此以外,還有CoreOS的Quay.io,CoreOS相關的鏡像存儲在這里;
Google的Google Container Registry,Kubernetes的鏡像使用的就是這個服務.
由於某些原因,在國內訪問這些服務可能會比較慢.
國內的一些雲服務商提供了針對Docker Hub的鏡像服務(Registry Mirror),這些鏡像服務被稱為加速器.
常見的有阿里雲加速器、DaoCloud 加速器、靈雀雲加速器等.
使用加速器會直接從國內的地址下載 Docker Hub 的鏡像,比直接從官方網站下載速度會提高很多.
國內也有一些雲服務商提供類似於Docker Hub的公開服務.比如時速雲鏡像倉庫、網易雲鏡像服務、DaoCloud鏡像市場、阿里雲鏡像庫等.