1. 程式人生 > >Docker學習筆記一:瞭解Docker

Docker學習筆記一:瞭解Docker

簡介:

Docker是一個作業系統級的虛擬化技術,是基於LXC技術構建的輕量級容器引擎。與傳統的虛擬化技術相比,Docker具有更高效的系統資源利用率、更快速的啟動時間、提供一致的執行環境、更輕鬆的遷移等眾多優勢。自2013年0.1版本釋出以來,圍繞Docker逐漸形成了繁榮的生態,迅速的成為國內外各大雲端計算廠商和開發者手中的利器,並得到大規模的實踐應用。

Docker的特性

在docker的官方網站上提到了docker的典型場景:

  1. 自動化打包與部署應用
  2. 建立輕量級、私密的PAAS環境
  3. 自動化測試和持續的整合/部署
  4. 部署與擴充套件webapp、資料庫和後臺服務

Docker 架構

Docker 使用客戶端-伺服器 (C/S) 架構模式,使用遠端API來管理和建立Docker容器。Docker 容器通過 Docker 映象來建立。容器與映象的關係類似於面向物件程式設計中的物件與類。

Docker採用 C/S架構 Docker daemon 作為服務端接受來自客戶的請求,並處理這些請求(建立、執行、分發容器)。 客戶端和服務端既可以執行在一個機器上,也可通過 socket 或者RESTful API 來進行通訊。

Docker daemon 一般在宿主主機後臺執行,等待接收來自客戶端的訊息。 Docker 客戶端則為使用者提供一系列可執行命令,使用者用這些命令實現跟 Docker daemon 互動。在這裡插入圖片描述

Docker與虛擬機器對比

虛擬化的核心是對資源進行抽象,目標往往是為了在同一個機器上執行多個系統或應用,從而提高系統資源的利用率。虛擬化分為很多型別,比如常見的硬體輔助虛擬化(VMware workstation、 KVM等)。Docker所代表的容器虛擬化技術屬於作業系統級虛擬化:核心通過建立多個虛擬的作業系統例項(核心和庫)來隔離不同的程序。

如下圖所示,傳統虛擬機器技術是虛擬出一套硬體後,在其上執行一個完整作業系統,在該系統上再執行所需應用程序;而容器內的應用程序直接運行於宿主的核心,容器內沒有自己的核心,而且也沒有進行硬體虛擬。因此容器要比傳統虛擬機器更為輕便。 在這裡插入圖片描述

Docker的優勢:

作為一種新興的虛擬化方式,Docker 跟傳統的虛擬化方式相比具有眾多的優勢。 更高效的利用系統資源

  1. 由於容器不需要進行硬體虛擬以及執行完整作業系統等額外開銷,Docker 對系統資源的利用率更高。無論是應用執行速度、記憶體損耗或者檔案儲存速度,都要比傳統虛擬機器技術更高效。因此,相比虛擬機器技術,一個相同配置的主機,往往可以執行更多數量的應用。 更快速的啟動時間:

  2. 傳統的虛擬機器技術啟動應用服務往往需要數分鐘,而 Docker 容器應用,由於直接運行於宿主核心,無需啟動完整的作業系統,因此可以做到秒級、甚至毫秒級的啟動時間。大大的節約了開發、測試、部署的時間。

  3. 一致的執行環境 開發過程中一個常見的問題是環境一致性問題。由於開發環境、測試環境、生產環境不一致,導致有些 bug 並未在開發過程中被發現。而 Docker 的映象提供了除核心外完整的執行時環境,確保了應用執行環境一致性,從而不會再出現 “這段程式碼在我機器上沒問題啊” 這類問題。

  4. 持續交付和部署 對開發和運維( DevOps) 人員來說,最希望的就是一次建立或配置,可以在任意地方正常執行。使用 Docker 可以通過定製應用映象來實現持續整合、持續交付、部署。開發人員可以通過 Dockerfile 來進行映象構建,並結合 持續整合(Continuous Integration) 系統進行整合測試,而運維人員則可以直接在生產環境中快速部署該映象,甚至結合持續部署(Continuous Delivery/Deployment) 系統進行自動部署。而且使用 Dockerfile 使映象構建透明化,不僅僅開發團隊可以理解應用執行環境,也方便運維團隊理解應用執行所需條件,幫助更好的生產環境中部署該映象。

  5. 更輕鬆的遷移 由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易。Docker 可以在很多平臺上執行,無論是物理機、虛擬機器、公有云、私有云,甚至是筆記本,其執行結果是一致的。因此使用者可以很輕易的將在一個平臺上執行的應用,遷移到另一個平臺上,而不用擔心執行環境的變化導致應用無法正常執行的情況。

  6. 更輕鬆的維護和擴充套件 Docker 使用的分層儲存以及映象的技術,使得應用重複部分的複用更為容易,也使得應用的維護更新更加簡單,基於基礎映象進一步擴充套件映象也變得非常簡單。此外,Docker 團隊同各個開源專案團隊一起維護了一大批高質量的官方映象,既可以直接在生產環境使用,又可以作為基礎進一步定製,大大的降低了應用服務的映象製作成本。

Docker的基本概念

 映象( Image)  容器( Container)  倉庫( Repository)

Docker 映象

我們都知道,作業系統分為核心和使用者空間。對於 Linux 而言,核心啟動後,會掛載 root 檔案系統為其提供使用者空間支援。而Docker 映象(Image),就相當於是一個 root檔案系統。比如官方映象 ubuntu:14.04 就包含了完整的一套Ubuntu 14.04 最小系統的 root 檔案系統。

Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數( 如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變。

Docker容器

映象( Image) 和容器( Container)的關係,就像是面向物件程式設計中的類和例項一樣,映象是靜態的定義,容器是映象執行時的實體。容器可以被建立、啟動、停止、刪除、暫停等。

容器的實質是程序,但與直接在宿主執行的程序不同,容器程序運行於屬於自己的獨立的名稱空間。因此容器可以擁有自己的 root 檔案系統、自己的網路配置、自己的程序空間,甚至自己的使用者 ID 空間。容器內的程序是執行在一個隔離的環境裡,使用起來,就好像是在一個獨立於宿主的系統下操作一樣。這種特性使得容器封裝的應用比直接在宿主執行更加安全。

Docker Registry

倉庫(Repository)是集中存放映象的地方。另外一個非常相似的單詞Registry是註冊伺服器(例如Docker Hub就是一個官方的Registry)。註冊伺服器是管理倉庫的具體伺服器,每個伺服器上可以有多個倉庫,而每個倉庫下面有多個映象。

從這方面來說,倉庫可以被認為是一個具體的專案或目錄。例如對於倉庫地址dl.dockerpool.com/ubuntu來說,dl.dockerpool.com 是註冊伺服器地址,ubuntu 是倉庫名。(一般而言,一個倉庫會存放同一種類型的映象,例如ubuntu的倉庫。)

一個 Docker Registry 中可以包含多個倉庫(Repository);每個倉庫可以包含多個標籤(Tag);每個標籤對應一個映象。通常,一個倉庫會包含同一個軟體不同版本的映象會,而標籤就常用於對應該軟體的各個版本。我們可以通過 <倉庫名>:<標籤> 的格式來指定具體是這個軟體哪個版本的映象。如果不給出標籤,將以 latest 作為預設標籤。

以 Ubuntu 映象為例, ubuntu是倉庫的名字,其內包含有不同的版本標籤,比如,14.04 , 16.04 。我們可以通過 ubuntu:14.04 ,或者 ubuntu:16.04來具體指定所需哪個版本的映象。如果忽略了標籤,比如ubuntu ,那將視為ubuntu:latest 。

倉庫名經常以兩段式路徑形式出現,比如training/webapp,前者往往意味著 Docker Registry 多使用者環境下的使用者名稱,後者則往往是對應的軟體名。