轉自:http://www.cnblogs.com/vikings-blog/p/3958091.html
Docker學習總結之docker入門
Understanding Docker
以下均翻譯自Docker官方文檔 ,轉載請注明:Vikings翻譯。
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通訊。
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。讓用戶可以知道當前應用執行的情況。
- Pulls the
以上是容器的執行過程,下面我們將開始描述如何管理容器,包括:結束,停止和移除。
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)
- The
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 版本的容器類型。