天天看點

docker一:基礎原理

docker的體系結構

docker使用c/s架構,docker daemon(守護程序)作為server端接受client的請求,并處理(建立、運作、分發容器)他們可以運作在一個機器上,也通過sockerts或者RESTful API通信。

docker client  host

docker pull docker daemon

docker run container1

docker  container2

docker有三個内部元件

docker images

docker registries 登記 

docker container

docker images就是一個隻讀的模闆。比如:一個image可以包含一個Ubuntu的操作烯烴,裡面安裝了apache或者你需要的應用程式。images可以用來建立docker containers,docker提供了一個很簡單的機制來建立images或者更新現有的images,你甚至可以直接其他人那裡下載下傳一個已經做好的images

Docker registries(登記)

Docker registries也叫docker倉庫,它有公有倉庫和私有倉庫2種形式,他們都可以用來讓你上傳和下載下傳images。公有的倉庫也叫Docker Hub。它提供了一個巨大的image庫可以讓你下載下傳,你也可以在自己的區域網路内建一個自己的私有倉庫。

Docker containers

Docker containers也叫docker容器,容器是從image鏡像建立的。它可以被啟動、開始、停止、删除。每個容器都是互相隔離的、安全的平台。

2、Docker image的工作原理

每個docker都有很多層次構成,docker使用union file systems将這些不同的層結合個image中去。

AUFS(AnotherUnionFS)是一種Union FS,簡單來說就是支援将不同目錄挂載到同一個虛拟檔案系統下(unite serveral directories into a single virtual filesystem)的檔案系統,更進一步的了解,AUFS支援為每一個成員目錄(類似Git Branch)設定readonly、readwrite和whiteout-able權限,同時AUFS裡有一個類似分層的概念,對readonly權限的branch可以邏輯上進行修改(增量地,不影響readonly部分的)通常union fs有兩個用途,一方面可以實作實作部建築LVM、RAID将多個第三課挂到同一個目錄下,另一個更常用的就是将一個readonly的branch和一個writeable的branch聯合在一起,live cd正是基于此方法可以允許在os image不改變的基礎上允許使用者在其上進行一些寫操作。Docker 在AUFS上建構的container image也正是如此。

3、docker倉庫

docker倉庫用來儲存我們的images,當我們建立了自己的image之後我們就可以使用push指令将它上傳到公有或者私有倉庫,這樣下次要在另一台機器上使用這個image時候,隻需要從倉庫上pull下來就可以了。

4、Docker容器

當我們運作docker run -i -t ubuntu /bin/bash指令是,docker在背景運作的操作如下:

如果本地有ubuntu這個image就從它建立容器,否則從公有倉庫下載下傳,從image建立容器,配置設定一個檔案系統,并在隻讀的image層外面挂載一層可讀寫的層,從宿主主機配置的網橋接口中橋接一個虛拟接口到容器中去,從位址池配置一個ip位址給容器,執行你個指定的程式,在這裡啟動/bin/bash程序,-i -t指定标準标準和輸出

5、docker底層技術

docker底層的2個核心技術分别是namespaces和control groups

1),pid namespace

不同使用者的程序就是通過pid namespace(命名空間)隔離開的,且不同namespace中可以有相同pid。所有的LXC程序在docker中的父程序為docker程序,每個lxc進行具有不同的namespace。同時由于允許嵌套,是以可以很友善的實作docker in docker。

pid     namespace :linux通過命名空間管理程序pid,對于同一程序(同一個task_struct),在不同的命名空間中,看到的pid号不相同,每個pid命名空間有一套自己的pid管理方法,是以在不同的命名空間中調用getpid(),看到的pid号是不同的。pid命名空間是一個父子關系的結構,系統初始隻有一個pid命名空間,後面如果在fork程序的時候,加上建立pid命名空間的選項,那麼這個新的命名空間的父命名空間就是初始的那個命名空間,在這個命名空間fork出的程序,在子命名空間和父命名空間都有一個pid号相對應到這個task_struct上。 task_struct任務結構 

LXC為Linux Container的簡寫。Linux Container容器是一種核心虛拟化技術,可以提供輕量級的虛拟化,以便隔離程序和資源,而且不需要提供指令解釋機制以及全虛拟化的其他複雜性。相當于C++中的NameSpace。容器有效地将由單個作業系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有沖突的資源使用需求。

2),net namespace

有了pid namespace,每個namespace中的pid能夠互相隔離,但是網絡端口還是共享host的端口。網絡隔離是通過net namespace實作的,每個net namespace有獨立的network devices,IP

addresses,IP routing tables,/proc/net目錄。這樣每個container的網絡就能隔離開來。docker預設采用veth的方式将container中的虛拟網卡同host的一個docker bridge:docker()連結在一起。

3)ipc namespace

container中程序互動還是采用Linux常見的程序間互動方法(interprocess communication-IPC),包括常見的信号量、消息隊列和共享記憶體。然而同VM不同的是,container的程序間互動實際上還是host上具有相同pid namespace中的程序間互動,是以需要在IPC資源申請時加入namespace資訊-每個IPC資源有一個唯一的32位ID。

4)mnt namespace

一個特定的目錄執行。mnt namespace 允許不同namespace的程序看到的檔案結構不同,這樣每個namespace中的程序所看到的檔案目錄就被隔離開了。同chroot不同,每個namespace中的conrainer在/proc/mounts的資訊隻包含所在namespace的mount point(挂載點)

5)uts namespace

UTS("UNIX Time-sharing system")namespace允許每個container擁有獨立的hostname和domain 

name,使其在網絡上可以被視作一個獨立的節點而非host上的一個程序。

6)user namesapce

每個container可以有不同的user和group id,也就是說可以在container内部用container内部想的使用者執行程式而非host上的使用者。

control groups主要用來隔離各個容器和宿主主機的資源利用。

本文轉自 吃草的青蛙 51CTO部落格,原文連結:http://blog.51cto.com/tlinux/1748891,如需轉載請自行聯系原作者