Docker學習總結之docker入門

  Understanding Docker

      如下均翻譯自Docker官方文檔 ,轉載請註明:Vikings翻譯。web

What is Docker?

  Docker 是一個開源的平臺,設計目標是能夠方便開發,方便部署和方便執行應用。使用docker能夠快速分發開發好的應用。藉助於Docker,你能夠將開發平臺和應用分離開,而且像管理應用同樣管理開發平臺。Docker能夠幫助你快速開發應用,快速測試應用,快速部署應用,而且縮短開發代碼和執行代碼之間的週期間隔。docker

  Docker 是憑藉一個輕量級容器的虛擬化平臺工做流和相關工具來達到上述功能的,而且使用這個輕量化容器來幫助你管理和部署應用。apache

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

  使用Docker提供的工具和虛擬化平臺,你能夠完成如下事情:bash

  一、將你的應用或者組件部署到容器中。網絡

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

  三、將你開發的應用部署到發佈環境中,不管這些環境是本地模式或者雲模式。ide

What can I use Docker for?

    一、快速分發應用工具

  Docker能夠幫助你把控開發各個週期。Docker容許你在本地的開發環境中進行代碼開發,而後將開發好的應用整合到團隊的開發流程中。測試

  好比:你能夠再本地編寫代碼,當編寫完成後。你將代碼開發堆棧信息共享給團隊成員。當他們也編寫完成後,一樣共享開發堆棧信息。而後再測試環境中,使用團隊共享的開發堆棧就能夠進行所須要的測試了。當完成測試後,團隊就能夠將測試經過的docker鏡像(images)發佈到產品環境中。

  二、方便部署和易於管理

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

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

  三、能夠執行大量的工做負載

  由於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通信。

 

  

  

  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?

  目前爲止,咱們已經能夠完成如下幾個工做:

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

  二、根據這個鏡像,你能夠建立一個容器。

  三、你能夠將這個容器上傳到倉庫中提供給其餘人使用。

  下面,咱們看一下如何執行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如下信息:

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

  二、當容器啓動時,你想讓容器初始化的動做,這裏咱們須要容器啓動時自動切換到/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)
    • The net namespace: 用來管理網絡接口
    • The ipc namespace: 用來控制IPC資源的訪問。
    • The mnt namespace: 用來管理掛載點(mnt是 mount point)
    • The 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 版本的容器類型。

相關文章
相關標籤/搜索