您好,登錄后才能下訂單哦!
說docker必須要要說容器,所以我們需要首先來說一下容器的概念。
其實容器就是一工具,泛指可以容納其他的物品工具,可以用來存儲、運輸物品;物品可以放在容器中的,而容器可以保護物品。
常見的容器:
瓶子
籃子
碗
集裝箱
柜子
說容器,就必須對比容器和虛擬化技術,首先就說虛擬化技術。
我們實現虛擬化技術主要有兩種
方式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?符和當前業務需求
? ??(目前普遍都是第二個,根本都不是第一個和第三個)
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。