說docker必需要要說容器,因此咱們須要首先來講一下容器的概念。linux
其實容器就是一工具,泛指能夠容納其餘的物品工具,能夠用來存儲、運輸物品;物品能夠放在容器中的,而容器能夠保護物品。nginx
常見的容器:算法
瓶子docker
籃子apache
碗ubuntu
集裝箱windows
櫃子後端
說容器,就必須對比容器和虛擬化技術,首先就說虛擬化技術。centos
咱們實現虛擬化技術主要有兩種tomcat
方式1:主機虛擬化
這裏所虛擬化的是整個硬件平臺,好比vmware、virtual box,他們所虛擬出來的是一個完整的裸機,咱們能夠再這個裸機上隨意的安裝os和軟件。
主機虛擬化是分爲兩類的
l type-I(類型1的虛擬化)
l type-ii(類型2的虛擬化)
程序運行在虛擬機中,確定比運行在物理機中性能差,那麼爲何還要將其運行在虛擬機中?
複用:好比須要運行兩個tomcat,讓其工做在虛擬機中,就能夠實現8080套接字不衝突了
隔離:一個進程在虛擬機中作任何操做,對於其餘虛擬機中的進程和物理機中的進程都是沒有影響的
那麼咱們怎麼即實現隔離,又不影響性能呢?
一個主機在運行起來以後,分爲內核空間和用戶空間,在用戶空間中就是運行用戶空間進程。
默認全部的用戶進程都是在同一個用戶空間的,那麼此時咱們要想隔離多個進程的運行環境,就能夠建立多個用戶空間,並且多個用戶空間是互相隔離的
這裏一個一個性對獨立的用戶空間就是咱們所謂的linux 容器。
使用容器,目的是爲了建立一個隔離的環境,在這個隔離環境環境中,應該至少包括隔離以下幾個層面
UTS:主機名和域名
Mount:工做目錄,也稱之爲安裝樹
IPC:ipc是必需要進行隔離的,若是不隔離IPC,那麼多個進程就能夠互相通訊,那麼就不存在隔離了
PID:隔離PID也是必須的
user 和group:在容器中也要有獨立的用戶,好比都要有root ,可是這個root確定不能都是真正的root,由於若是是真root用戶的話,就有權限刪除其餘容器中的內容了。
network:隔離網絡是最爲重要的,由於一個容器做爲一個獨立的單元工做,那麼就須要爲每一個容器準備一個網卡、接口、tcp/IP協議棧。
這裏有個概念就是namespaces(名稱空間)
linux的內核原生就支持了6種名稱空間,在構建容器的時候,就是從這6個名稱空間中抽取出來一部分構成一個容器。
各類名稱空間與所支持的內核版本
從這裏能夠看到,若是想更好的使用容器技術,centos6就不適合了。
所謂的LXC,其實就是linux Container,這是一種基於模板的方式實現容器技術應用的解決方案 ,在LXC中包含了一組工具
lxc-create:快速建立容器的命令
其實docker就是lxc的二次封裝發行版,他是用lxc做爲容器引擎,同時使用鏡像技術,將一個操做類型容器所須要的文件提取安裝好,並打成一個包
當建立容器的時候,只須要將這個包複製N份並啓動容器,這樣就行了,速度很快。
當用docker建立容器的時候,其實就是用lxc create來建立一個容器。
docker極大的下降了容器的使用難度
用來存放鏡像的服務器,咱們稱之爲docker倉庫,在這個倉庫中有咱們幾乎能想到的所有的容器
docker使用了一種更爲精巧的設計,那就是每一個容器中僅僅運行一個進程。
好比在一個容器中僅僅運行nginx,若是要用apache,就須要下載另外一個容器了,此時的nginx和apache就可會經過容器間的通訊邏輯進行通訊。
這裏讓每一個進程運行在一個獨立的容器中,並且咱們也知道容器是一個隔離的環境,那麼這樣一來,一個進程出現了問題,對於其餘的進程是不會受到影響的。
使用docker另個一好處:真正的實現的一次編寫,處處運行了
如今咱們的生成環境中,都是多版本並行的,如同時用着centos5 6 7,同時還用着windows、ubuntu等系統,若是這個時候要開發一個程序在全部的平臺都能運行,這個時候每每是須要有好幾個團隊分別開發面向不一樣系統的版本。
而有了docker之後,就只須要開發一個版本,並將這個軟件作到一個docker鏡像中,這樣只須要將這個鏡像放到任意的平臺上,只要這個平臺有docker,那麼就能夠運行這個鏡像,同時這個程序也就能夠開始運行了,因此,軟件開發的難度大大下降了。
再來講docker鏡像的構建方式
docker鏡像的構建方式是很特殊的,稱之爲:分層構建、聯合掛載
以構建nginx鏡像爲例解釋一下
先作一個最底層、純淨的系統,好比最小化的centos6系統
在這個centos系統的基礎上安裝一個nginx就構成了鏡像
注意,構建的鏡像只包含nginx自己,而不包含centos操做系統內容
這個鏡像就包含了兩層,這兩層共同構成了運行在了linux上的centos
當啓動容器的時候,須要將這兩層都掛載上去就能夠用了,這就是分層構建、聯合掛載,
若是須要啓動多個鏡像,其中有nginx、tomcat、apache等,如都是基於centos的,因此在下載的時候,只須要下載一個centos,再分別下載須要層就能夠了。
爲什麼能實現多個上層應用公用底層系統?
是由於底層的centos和tomcat都是隻讀的。
當用戶在所建立的容器中執行寫操做的時候,底層是隻讀沒法修改
因此,這個時候就會底層的資源複製一份上來,而後在複製的這層中進行修改,這種機制稱之爲:寫時複製。
關於容器編排工具
好比咱們有100個主機能夠運行docker,當須要啓動容器的時候,只須要編排工具發送指令,這個編排工具根據算法從後端的這幾種找一個來啓動docker
再好比,咱們要運行amp的環境,這裏三個程序就是三個容器,這三個容器的啓動順序是有關係的,因此就須要設置啓動的順序,這樣編排工具還須要能夠根據順序依次啓動。
編排有不少:
第一個:docker本身的編排工具:這裏實際上是三個工具的組合,machine+swarm+compose
第二個:ASF的,meos+marathon
第三個:google的,kubbernets,簡稱k8s,這是由於k和s間有8個字母
kvm:基於硬件虛擬化技術,是須要cpu支持的,是虛擬出來一個虛擬機,虛擬機管理器是須要佔用額外的系統資源的,也就是即便不跑任何虛擬機,都須要佔用6%左右的系統資源
docker:基於內核虛擬化技術,沒有虛擬任何東西,可是是經過隔離技術實現的,因此不會對系統帶來額外的開銷。
真正的docker是不該該當作虛擬機用的(雖然能夠)
整個架構分爲了三個部分
l 1:客戶端:cient
l 2:服務器端:docker_hosts
l 3:倉庫端:registery
l 各個部分之間通訊是基於http或者https進行通訊的
docker_host部分
服務器端就是靠運行docker daemon來運行在守護進程模式的下的,此時的docker就會監聽在一個套接字之上了,並且docker是支持三種套接字的
l ipv4套接字
l ipv6套接字
l unix socket套接字:也就是監聽在一個本地文件上。
docker倉庫
首先docker的registery中提供了docker鏡像的存儲功能,並且還提供了用戶登陸下載鏡像時候的認證功能。
另外docker的registery中,還包括repository,一個repository就是一個目錄,在一個目錄中只存儲一個應該程序的鏡像,好比要建立的nginx的鏡像,那麼就建立一個目錄,這個目錄名就是nginx,全部的nginx的鏡像都是放在同一個目錄下。
由於如今有多個鏡像,那麼若是想惟一的標識一個鏡像,就須要藉助於 tag(標籤),好比第一個1.9 1.11 1.23,這樣經過repo名稱和標籤名的組合,就能夠惟一的標識一個鏡像。
docker官方提供有docker倉庫,可是其實也有第三方提供的,並且也能夠本身作docker倉庫。
1.簡化配置
工做中的環境有生產環境、測試環境、開發環境測試環境又分爲功能測試、性能測試;生產環境又分爲預生產環境和生成環境。
這麼多的環境,環境不一樣,配置也就不一樣,若是配置不一樣,那麼就可能會致使上線失敗,使用docker就能夠簡化配置,作一個鏡像,使用這個鏡像就能夠完成部署上線。
2.代碼流水線管理
開發人員在開發完成之後,將代碼傳遞到服務器上,而後測試人員能夠從服務器上拉去代碼進行測試,測試完成之後,開始進行發佈,首先就是進行灰度發佈,而後纔是正事發布。
3.開發效率
新員工入職後配置各類環境,這個過程就每每是比較麻煩的,那麼這裏,咱們就能夠用docker作個容器輕鬆來實現。
4.應用隔離
各個應用之間互相是隔離的。
5.服務器整合
也就是說一個服務器能夠跑多個容器實例
6.調試能力
處理bug的能力
7.多租戶
8.快速部署
docker是秒級的,啓動速度極其快。
好比以前說過,春晚的微信搶紅包,用的是docker,說是能夠1秒啓動1000個docker程序。
大中型公司選擇docker的理由
l 技術儲備
l 跟上節奏,提高自身技術
l 符和當前業務需求
(目前廣泛都是第二個,根本都不是第一個和第三個)