天天看點

Understanding Docker

What is Docker?

  Docker 是一個開源的平台,設計目标是可以友善開發,友善部署和友善執行應用。使用docker可以快速分發開發好的應用。借助于Docker,你可以将開發平台 和應用分離開,并且像管理應用一樣管理開發平台。Docker可以幫助你快速開發應用,快速測試應用,快速部署應用,并且縮短開發代碼和執行代碼之間的周 期間隔。

  Docker 是憑借一個輕量級容器的虛拟化平台工作流和相關工具來達到上述功能的,并且使用這個輕量化容器來幫助你管理和部署應用。

  在Docker核心層,它提供了一種方式來讓各種應用運作在各個隔離的容器中。這種方式允許docker同一時間在同一台主機上面運作若幹個容器。這種輕量級的容器運作方式,幾乎沒有額外的運作開銷。這意味着你可以充分使用主句的硬體能力。

  使用Docker提供的工具和虛拟化平台,你可以完成以下事情:

  1、将你的應用或者元件部署到容器中。

  2、将你的容器分發給你的團隊進行下一步的開發或者測試

  3、将你開發的應用部署到釋出環境中,無論這些環境是本地模式或者雲模式。

What can I use Docker for?

    1、快速分發應用

  Docker可以幫助你把控開發各個周期。Docker允許你在本地的開發環境中進行代碼開發,然後将開發好的應用整合到團隊的開發流程中。

  比如:你可以再本地編寫代碼,當編寫完成後。 你将代碼開發堆棧資訊共享給團隊成員。當他們也編寫完成後,同樣共享開發堆棧資訊。然後再測試環境中,使用團隊共享的開發堆棧就可以進行所需要的測試了。 當完成測試後,團隊就可以将測試通過的docker鏡像(images)釋出到産品環境中。

  2、友善部署和易于管理

  Docker基于容器的機制可以很容易進行部署。Docker容器可以在本地主機上面執行,也可以在虛拟機中執行,不論這些虛拟機是在本地或者雲中。

  Docker快速部署和輕量級的特性也使得管理負載變得很容易。你可以快速啟動或者銷毀容器。這種時間幾乎是實時的。

  3、可以執行大量的工作負載

  因為Docker具有便于部署和快速啟停的方式,同時docker也提供了可行的,符合效益-成本的虛拟機管理機制。使得docker很适合負載要求高的環境。比如:将你的雲平台作為PAAS用途時,或者你要求你的環境具有高資源使用率時。

What are the major Docker components?

  Docker主要有兩個元件:

  Docker:開源的容器虛拟化平台

  Docker Hub:一個Software-as-a-Service平台,用來共享和管理docker容器。

What is Docker's architecture?

  Docker采取的C-S結構。Docker client同Docker daemon通訊,Docker daemon負責維護docker 容器的建構,運作和分發。

  Client和Daemon可以再同一台主機上面執行,也可以分開執行。本地的client可以連接配接遠端的daemon。Client可以通過socker或者REST API同daemon通訊。

  

Understanding Docker

  The Docker daemon

    如上圖所示,daemon在主機上面執行。使用者隻能通過client同daemon通訊。

  The Docker client

    Docker client是使用者與Docker之間的重要接口。它從使用者那裡接受指令,并且将daemon的傳回資料展現出來。

  Inside Docker

    為了深入了解docker的内部機制,需要了解以下三個元件:

    • Docker images.(鏡像)
    • Docker registries.(倉庫)
    • Docker containers.(容器)

    Docker images

    Docker image是一個隻讀類型的模闆。比如一個鏡像可以是一個包含apache和你的web應用的ubuntu作業系統。我們經常使用鏡像來建立容器。 Docker提供了一種快捷的方式來建構新鏡像或者更新鏡像,同時你也可以下載下傳其他人已經建立好的鏡像。Docker image是Docker結構中的建構元件。

    Docker Registries

    Docker registries用來儲存鏡像。它分為公開倉庫和私有倉庫,你可以從倉庫中上傳或者下載下傳鏡像。公開的Docker 倉庫稱之為"Docker Hub".它提供了你可以使用的非常多的鏡像。你可以自由的建立鏡像或者使用這裡面其他人已經建立好的鏡像。Docker registries屬于Docker中的分發元件。

    Docker containers

    Docker containers同目錄有幾分相似。Docker containers儲存了執行應用所需的所有資源。每一個Docker containers都是由image建立的。Docker containers可以run, started, stopped, moved, and deleted。需要注意的是,Docker containers之間是隔離的。Docker containers屬于Docker中的執行元件。

  So how does Docker work?

  目前為止,我們已經可以完成以下幾個工作:

  1、建立一個包含你需要執行應用的鏡像。

  2、根據這個鏡像,你可以建立一個容器。

  3、你可以将這個容器上傳到倉庫中提供給其他人使用。

  下面,我們看一下如何執行Docker。

  How does a Docker Image work?

  我們知道Docker containers啟動時是以來的Docker images其實是一個隻讀性質的模闆。每個模闆都包含若幹層。Docker采取了union file systems 的機制将這些曾聚合為一個image。Union file systems 允許實體隔離的檔案或者目錄,互相重疊覆寫,形成線性的檔案系統。

  Docker也正是基于上述層的實作方式而做 到了輕量級。當你修改一個image時,docker并沒有修改原有的image資料,而是建立了一個資料層。當你在docker中修改整個image或 者重建實體時,原有資料都沒有變化,隻是若幹層發生了變化。是以當image發生了變化時,不需要重新同步整個image,而隻要将發生變化的層同步一次 就可以。這樣就使docker image做的快速并且簡單。

  每個image都是從base image演變過來的。你可以建立你的base image。如果你有apache的image,就可以把這個鏡像作為你應用程式的base image。

  Note:Docker 一般都是從Dock Hub上面擷取base images。

  Docker通過一些很簡單的步驟就可以依據base images建立新的image。每執行一個步驟,新的image就會建立一個新層(layer)。基本的步驟如下:

    •   Run a command.
    •   Add a file or directory.
    •   Create an environment variable.
    •   What process to run when launching a container from this image.

   這些指令可以再Dockerfile中定義。當你需要建立一個image是,docker可以自動讀取Dockerfile中的指令,并且執行這些指令。最終生成一個新的image。

  How does a Docker registry work?

  Docker registry是用來儲存images的。當你建立好image後,就可以将image上傳到Dock Hub或者你私有的store中。

  借助于Docker client,你可以在Dock Hub檢索你所需的image,同時将這些image下載下傳到本地。

  同時Dock Hub也提供公開和私有兩種模式,處于公開模式下的image,所有人都可以下載下傳和使用這些image。而處于私有模式下的image,隻有本人或者經過授權後的人才能下載下傳并且使用這些image。

  How does a container work?

  一個标準容器包括:作業系統,使用者自定義的文 件和原資料。正如我們所知的那樣,每個容器都是由image所建立的。image告訴docker,這個容器運作時,應該有哪些程序和應該有哪些配置參 數。因為image是隻讀的,是以容器在運作時會在image原有層的基礎上面建立一些可讀可寫的新層。而你的應用運作所需的資料将會被記錄到這些資料層 中。

  What happens when you run a container?

  不論是使用docker程式或者API,docker client都會通知docker daemon如何操作容器。

  當我們執行如下指令時:

$ docker run -i -t ubuntu /bin/bash      

  docker client會啟動,然後使用後面的run參數來通知docker daemon啟動一個新容器。這個簡短的指令将會通知docker daemon以下資訊:

  1、容器所需的image在哪裡,這裡image名稱是ubuntu,是一個base image。

  2、當容器啟動時,你想讓容器初始化的動作,這裡我們需要容器啟動時自動切換到/bin/bash下面。

  是以當我們敲下回車後,docker将會如何處理呢?

    • Pulls the 

      ubuntu

       image:   Docker 檢測image是否存在,如果本地不存在,則預設從Dock Hub下載下傳。如果本地存在,則使用本地的image啟動容器。
    • Creates a new container:   Docker加載image,然後建立容器。
    • Allocates a filesystem and mounts a read-write layer:容器開始建立檔案系統,并且在image上面添加可讀可寫的資料層。
    • Allocates a network / bridge interface:  Docker開始建立網絡接口,并且允許容器同主機進行關聯。
    • Sets up an IP address:   Docker從IP資源池中挑選一個配置設定給容器。
    • Executes a process that you specify:   Docker開始執行指定的應用或者指令
    • Captures and provides application output:   Docker将執行過程當中的輸出或者錯誤資訊傳回給Client。讓使用者可以知道目前應用執行的情況。

  以上是容器的執行過程,下面我們将開始描述如何管理容器,包括:結束,停止和移除。

 The underlying technology

   Docker 底層使用的是Linux核心中的虛拟化技術,來呈現我們剛才所看到的一切功能。

  Namespaces

  Docker采用了稱之為"Namespaces"的技術解決方案來隔離不同的workspace(也就是上面所定義的容器)。當你執行一個容器時,docker會為這個容器建立一系列的namespace。

  以下是docker所建立的namespace:

    • The 

      pid

       namespace: 用來隔離程序。(PID就是process id)
    • net

       namespace: 用來管理網絡接口
    • ipc

       namespace: 用來控制IPC資源的通路。
    • mnt

       namespace: 用來管理挂載點(mnt是 mount point)
    • uts

       namespace: 用來隔離核心和版本資訊(UTS,分時複用系統 Unix Timesharing System)

  Control groups

   Docker同時也采用了一種稱之 為"cgroups"的技術來控制group。不同應用之間隔離的關鍵在于,每個應用隻能通路屬于自己的資源。這樣才能確定主機上面同時存在多個使用者。 Cgroups可以確定docker将可用的硬體資源共享給所有容器,并且可以在必要時間,對容器限制硬體資源。例如可以限制每個容器可以通路的記憶體容 量。

  Union file systems

   Union file systems 或者稱為"UnionFS"是docker在建立層時采用的檔案系統。這種檔案系統使docker變得很輕量級并且執行速度很快。Docker使用 UnionFS為容器提供相對應的資料塊(data blocks)。Docker可以使用多種類型的UnionFS,比如:AUFS, btrfs, vfs, and DeviceMapper.

  Container format

   Docker将上面我們所描述的各種元件封裝成container資料類型(我們就稱其為容器)。預設的容器類型是libcontainer。 Docker同樣也支援傳統Linux使用LXC實作的容器類型。再未來,Docker也将支援其他類型的容器,比如:BSD Jails 或者Solaris Zones 版本的容器類型。

歡迎關注微信公衆号:大資料從業者