Docker概述

Docker概述123

Docker的概念

Docker是一個開源平臺,它包含容器引擎和Docker Hub註冊服務器。linux

  • Docker容器引擎:該引擎可讓開發者打包它們的應用和依賴包到一個可移植的容器中,而後將其發佈到任何流行的Linux機器上。
  • Docker Hub註冊服務器:用戶能夠在該服務器上建立本身的鏡像庫來存儲、管理和分享鏡像。利用Docker,可實現軟件的一次配置,到處運行。

Docker引擎能夠將任何應用打包成一個輕量的、易移植的、隔離的容器。git

經過標準的操做系統接口使得應用能夠在各類運行環境下保持一致。docker

容器和虛擬機

Docker是容器的一種,容器是一種輕量級的虛擬技術,和容器對應的更爲重量級的虛擬技術是虛擬機。數據庫

虛擬機是一種基於硬件的虛擬技術,它採用指令級的虛擬,徹底虛擬一整套物理主機,包含CPU、內存、磁盤、網卡等設備,給用戶呈現的就是一個物理主機的特性。用戶能夠在虛擬機裏安裝各類各樣的操做系統,一切操做都看起來和真機同樣。(第一類虛擬機管理程序,如Virtualbox和VMWare Workstation,它運行在操做系統之上。第一類虛擬機管理程序,如Xen,它直接運行在裸機上。後端

容器是一種基於操做系統的虛擬技術,它運行在操做系統之上的用戶空間,全部的容器都共用一個系統內核,甚至是公共庫,容器引擎提供進程級別的隔離,讓每個容器都想運行在單獨的系統之上,但又能共享不少底層資源。比起虛擬機,容器更爲輕量、快速、易於管理。安全

除了Docker,常見的容器還有Solaris Zone、BSD jails、OpenVZ和LXC等。
虛擬機與Docker容器的對比服務器

更爲詳細的對好比下表:網絡

虛擬機與容器對比表

Docker與容器

Docker早期是基於LXC(Linux Containers,LXC)4容器的,可是其具備不少LXC這類容器所沒有的新特性。架構

  • 跨平臺的可移植性。Docker定義了一種統一標準的打包格式,將應用及其依賴打包進單個鏡像中,該鏡像能夠在任何Docker可運行的機器間便攜傳輸,而且在不一樣機器上,Docker隔離了應用與平臺的直接聯繫,對配置進行了抽象,使得在任何平臺上應用的運行環境都同樣。LXC的配置卻不是可移植的,它依賴於某臺具體的機器。
  • 面向應用。Docker是爲優化應用部署而誕生的,LXC則是面向機器的,這是二者設計哲學上的不一樣。Docker面向應用的哲學體如今API、用戶接口以及文檔等各個方面,Docker都是爲了更簡單地作事。而LXC則是更關注於使用更少地CPU、更少地RAM,成爲一個更輕量地機器。
  • 版本控制。Docker地版本控制和git工具很是相似,Docker能夠跟蹤一個容器地版本信息,查看版本差別,提交和回滾版本等。全部地版本信息都將被記錄,這樣能夠清晰地看到一個應用服務器地更改歷史。
  • 組建複用。Docker容器以組件式搭建,能夠利用一個基礎鏡像構建更多的應用容器。
  • 共享性。Docker用於一個公共的註冊服務器。開發者上傳它們的鏡像,咱們能夠經過這些共享的鏡像來進一步定製本身的鏡像。Docker的註冊服務器自己也是一個開源項目,因此任何人均可如下載源碼後在本身的網絡中部署本身的註冊服務器。
  • 工具生態系統。Docker提供了API以供自動化建立和部署容器,而愈來愈多的工具加入到Docker之中來擴展它的能力,Docker已經造成了本身的軟件工具生態圈。

Docker的組件

Docker採用的是C/S架構,Docker客戶端,即Docker可執行程序,能夠經過命令行和API的形式與Docker守護程序進行通訊,Docker守護程序提供Docker服務。
Docker的C/S架構分佈式

Docker包含三大核心組件——鏡像、容器和庫。

  • 鏡像:是一個只讀的靜態模板。它保存着容器須要的環境和應用的執行代碼,能夠把鏡像看做容器的代碼,當代碼運行起來後就成了容器。鏡像採用分層機制,每一層鏡像都是隻讀的,可是能夠將寫數據的層經過聯合文件系統附加到原有的鏡像上。
  • 容器:是一個運行時環境,它是一個鏡像的運行狀態,相對於靜態的鏡像而言。容器是鏡像執行的動態表現,用戶能夠在容器中運行所想要的程序和服務,容器也不在意你在什麼樣的環境下運行它。
  • :Docker採用註冊服務器來存儲和共享用戶的鏡像,庫是某個特定用戶存儲鏡像的目錄。

Docker應用開發和部署

下圖是經過Docker進行應用開發和部署的案例流程,首先,在開發主機上構建容器A,構建方法能夠是手工構建,也能夠經過Dockerfile自動構建。容器A的構建必須基於一個已有的基礎鏡像,並在它上面執行一系列操做。鏡像A是容器的靜態形式,容器是鏡像的運行態。將容器A保存爲鏡像A,而後推送到Docker庫中進行共享。這時候,另外一端能夠經過Docker庫來得到鏡像A,並將其拉取到本地,最後在產品集羣中運行容器A,其中產品集羣中通常會同時運行多個容器,這些容器互不影響,相互隔離。

使用Docker進行開發和部署的流程

Docker的特性

Docker是利用容器技術實現的一種輕量級的虛擬技術。

  • 隔離性:Docker採用libcontainer做爲默認容器,取代了以前的LXC。libcontainer的隔離性主要是內核的命名空間來實現的,具體有pid、net、mnt和uts等命名空間,它們將容器的線程、網絡、消息、文件系統和主機名進行隔離。
  • 可度量性:在Docker中,主要經過cgroups(控制組)來控制資源的度量和分配。
  • 移植性:Docker利用AUFS來實現對容器的快速更新。AUFS是一種支持將不一樣目錄掛載到同一虛擬文件系統下的文件系統,支持對每一個目錄的讀寫權限管理。另外,AFUS具備層的概念,每一次修改都是在已有的只寫層進行增量修改,修改內容將造成新的文件層,而不會影響原有的層。採用AUFS做爲Docker容器的文件系統,具備以下好處
    • 節省存儲空間:多個容器能夠共享一個基礎鏡像存儲
    • 快速部署
    • 升級方便
    • 增量修改
  • 安全性

Docker的安裝

能夠參照官方給出的文檔

Docker的應用場景

  • 加速本地開發。
  • 自動打包和部署應用
  • 建立輕量、私有的PaaS環境
  • 自動化測試和持續集成/部署
  • 部署並擴展Web應用、數據庫和後端服務器
  • 建立安全沙盒
  • 輕量級的桌面虛擬化

因爲Docker並不是使用虛擬化技術,容器必須與主機的內核一致——Windows Server的容器只能在Windows Server的主機上運行,64爲Linux的容器只能在64位的Linux主機上運行。

微服務5是容器最主要的用例,也是容器興起的最大推進力。

微服務是一種軟件系統開發和構成形式,由小而獨立的組件構成,這些組件經過網絡互相鏈接溝通。這與傳統的單一架構(monolith)軟件開發模式相反,後者只有一個龐大的程序。當須要擴展一個單一架構的軟件時,縱向擴展(scale up)每每是惟一選擇,也就是說,須要把機器升級,增長內存和使用更強大的CPU,才能應付更多的負載。相反,微服務則設計成橫向擴展(scale out),爲了知足增加的需求,只需部署多臺機器分攤負載便可。

容器雲

容器雲以容器爲資源分割和調度的基本單位,封裝整個軟件運行時環境,爲開發者和系統管理員提供用於構建、發佈和運行分佈式應用的平臺。當容器雲專一於資源共享與隔離、容器編排與部署時,它更接近傳統的IaaS;當容器雲滲透到應用支撐與運行時環境時,它更接近傳統的PaaS。

容器雲並不只僅限於Docker,基於rkt容器的CoreOS項目也是容器雲。


  1. 曾金龍, 肖新華, 劉清. Docker開發實踐[M]. 人民郵電出版社, 2015.
  2. Adrian Mouat. Docker開發指南[M]. 人民郵電出版社, 2017.
  3. 浙江大學. Docker 容器與容器雲[M]. 人民郵電出版社, 2015.
  4. 2008年,Linux容器(Linux Containers,LXC)項目啓動,它把CGroup、內核命名空間以及chroot等技術融合,提供了一套完整的容器方案。最後,Docker於2013年補充了當時容器化技術的不足,將容器技術帶入主流
  5. SamNewman, 紐曼, 崔力強,等. 微服務設計[M]. 人民郵電出版社, 2016.
相關文章
相關標籤/搜索