摘要:本文從定義,作用,技術架構,安裝和使用等全方位帶你看懂。如圖中左邊紅框中和右邊的紅框中都唯一表示為同一個鏡像。最后,于開發者而言提供了一種開發環境的管理辦法,與測試人員而言保證了環境的同步,于運維人員提供了可移植的標準化部署流程。
Docker是啥?作者丨唐文廣:騰訊工程師,負責無線研發部地圖測試。
導語:Docker,近兩年才流行起來的超輕量級虛擬機,它可以讓你輕松完成持續集成、自動交付、自動部署,并且實現開發環境、測試環境、運維環境三方環境的真正同步。本文從Docker定義,作用,技術架構,安裝和使用等全方位帶你看懂Docker。
打開翻譯君輸入Docker 結果顯示碼頭工人,沒錯!碼頭工人搬運的是集裝箱,那么今天要講的Docker其操作的也是集裝箱,這個集裝箱就靜態而言就是一個應用鏡像文件,就動態而言,就是一個容器。蒙了吧?好吧,上圖解釋。
Docker從狹義上來講就是一個進程,從廣義上來講是一個虛擬容器,其實更專業的叫法是應用容器( Application Container ),Docker進程和普通的進程沒有任何區別,它就是一個普通的應用進程。不過是用來操作鏡像文件的。所以Docker進程+構建的應用鏡像文件就等于Docker容器。本文所有講的Docker都是指Docker容器哦。
再繼續下文之前我們首先要明確幾個docker重要的基本概念吧,鏡像,容器,倉庫。
鏡像Docker images,就類似于VM虛擬機里面的快照,但是可比快照輕量化多了。快照不懂?那可以把images直接理解成一個文件夾。我們可以通過ID或者易識別的名字+tag來確認唯一的目標鏡像。ImagesID是一個64位的字符,但是一般我們都是使用前面12位就足夠區別了。
如圖中左邊紅框中redis: lates和右邊的紅框中5f515359c7f8都唯一表示為同一個鏡像。所以我們一般的鏡像可以命名為類似centos:latest、centos:centos7.1.1503等等。
鏡像是分層的,有基礎鏡像,僅僅包含操作系統,比如centos鏡像;有中間件鏡像,比如redis等數據庫鏡像;最后是應用鏡像,就是指具體的應用服務了,應用鏡像可以非常豐富,隨時可以發布,這三者之間依次疊加。
所以當我們在使用 Docker構建鏡像的時候,每一個命令都會在前一個命令的基礎上形成一個新鏡像層。如下圖,基礎鏡像就是centos鏡像,中間件鏡像就是兩個紅色圈,應用鏡像就是紫色圈。其中redis+centos這樣疊加組合的中間件鏡像就可以供A服務或者B服務使用,這樣疊加組合更加靈活。仍和一種鏡像都可以從Docker hub公共倉庫中拉取。
容器Docker containers,你可以從鏡像中創建容器,這如同從快照中創建虛擬機,不過更輕量,啟動更快,秒啟。應用是在容器中運行的,打個比方,你首先下載了一個Ubuntu的鏡像,然后又安裝mysql和Django應用及其依賴,來完成對它Ubutun鏡像的修改,一個個人覺得非常完美應用鏡像生成了!就把這個鏡像分享給大家使用,大家通過這個鏡像就生成一個容器。容器啟動之后就會運行Django服務了。
上面也說到了,容器就是一個個獨立的封閉的集裝箱,但是也需要對外提供服務的,所以Docker允許公開容器的特定端口,在啟動Docker的時候,我們就可以將容器的特定端口映射到宿主機上面的任意一個端口,所以,如果幾個服務都需要80端口,那么容器的對外端口是80,但是映射到宿主機上面就是任意端口,就不會產生沖突,所以就不需要通過代理來解決沖突。容器對外端口與宿主機的端口映射可以通過下面的命令來完成。
啟動docker容器
docker run -d -p 2222:22 --name 容器名 鏡像名
-d 守護容器,就是后臺運行,退出命令窗口容器也不會停止
-it 交互式容器 退出命令窗口容器就停止運行了
-p宿主機端口和容器端口映射
8081:80 宿主機端口:容器公開的端口
倉庫Docker registeries,docker倉庫和存放集裝箱的倉庫是一樣的,不過docker使用來存放鏡像的。倉庫存在公有和私有之分,公有倉庫docker hub提供了非常多的鏡像文件,這些鏡像直接拉取下來就可以運行了,你也可以上傳自己的鏡像到docker hub上面。同時也可以自己搭建私有倉庫用于團隊項目管理。
結合前面介紹的基本概念,我們可以將docker的幾個概念使用大致串起來,他們之間是如何運作的,也就是Docker的生命周期。看下圖,主要是三步走。
1、 開發構建鏡像并將鏡像push到Docker倉庫
2、 測試或者運維從Docker倉庫拷貝一份鏡像到本地
3、 通過鏡像文件開啟Docker容器并提供服務
為啥要用Docker?這要從目前軟件行業的痛點來講起 1、軟件更新發布及部署低效,過程繁瑣且需要人工介入,2、環境一致性難以保證,3、不同環境之間遷移成本太高。有了Docker可以很大程度解決上面的問題。
首先,Docker的使用簡單至極,從開發的角度來看就是三步走:構建,運輸,運行。其中關鍵步驟就是構建環節,即打包鏡像文件。但是從測試和運維的角度來看,那就只有兩步:復制,運行。有了這個鏡像,那么想復制到哪運行都可以,完全和平臺無關了。同時Docker這種容器技術隔離出了獨立的運行空間,不會和其他應用爭用系統資源了以及還不需要考慮應用之間相互影響,想想就開心。
其次,因為在構建鏡像的時候就處理完了服務程序對于系統的所有依賴,所以在你使用的時候,你可以忽略掉原本程序的依賴以及開發語言。對測試和運維而言,更多專注于自己的業務內容上。
最后,Docker于開發者而言提供了一種開發環境的管理辦法,與測試人員而言保證了環境的同步,于運維人員提供了可移植的標準化部署流程。
所以, Docker 能干啥,總結如下:
構建容易分發簡單
隔離應用解除依賴
快速部署測完就銷
Docker是個進程級的輕量化虛擬機,和傳統虛擬機有啥區別呢?
Docker這個虛擬機超級輕量級,僅僅是一個進程而已。與傳統的虛擬機比如VM有著巨大的差別,區別看下圖:
我們來看一下二者的區別,因為 VM 的 Hypervisor 需要實現對硬件的虛擬化,并且還要搭載自己的操作系統,其中虛擬機操作系統占用內存是比較大的,一個操作系統有好幾個G,自然在啟動速度和資源利用率以及性能上有非常大的開銷,如果在本地,或者個人電腦,那么影響還不是那么大,但是在云端就是一個非常大的資源浪費。
咱們很多時候做事情的時候不會考慮與事情本身無關的問題,比如造飛機的不會考慮飛機是否要潛水,對于我們目前很多移動互聯網的應用來說,很少會涉及到對操作系統的部分,其實我們主要關心的是應用的本身,而VM虛擬機的上層是運行的運行時庫和應用,整個虛擬機的空間是非常的龐大,但是容器化技術Docker技術的出現后,省去了操作系統這一層,多個容器之間相互隔離且共用了宿主操作系統和運行時庫。
所以Docker 應用容器相對于 VM 有以下幾個優點:
啟動速度快,容器啟動本質就是一個開啟一個進程而已,因此都是秒啟,而 VM 通常要更久。
資源利用率高,一臺普通 PC 可以跑成百上千個容器,你跑十個 VM 試試。
性能開銷小, VM 通常需要額外的 CPU 和內存來完成 OS 的功能,這一部分占據了額外的資源。
所以很多移動互聯網的應用或者云計算的后端節點都可以用docker來替換物理機器或者虛擬機。比如騰訊地圖的很多后臺服務基本上都遷移docker部署了。
Docker是個啥架構?底層又是用的啥技術?前面說了那么多,始終還是霧里看花。下面就詳細介紹一下技術架構,底層又是用的啥技術來實現上述那么多優點的?
Docker技術架構圖:
從Docker依賴的底層技術來看,Docker原生態是不能直接在Windows平臺上運行的,只支持linux系統,原因是Docker依賴linux kernel三項最基本的技術,namespaces充當隔離的第一級,是對Docker容器進行隔離,讓容器擁有獨立的hostname,ip,pid,同時確保一個容器中運行一個進程而且不能看到或影響容器外的其它進程;Cgroups是容器對使用的宿主機資源進行核算并限制的關鍵功能。
比如CPU,內存,磁盤等,union FS主要是對鏡像也就是image這一塊作支持,采用copy-on-write技術,讓大家可以共用某一層,對于某些差異層的話就可以在差異的內存存儲,Libcontainer是一個庫,是對上面這三項技術做一個封裝。
Docker engine 用來控制容器container的運行,以及鏡像文件的拉取。
Docker咋裝呢?Docker怎么用呢?安裝之前,我們首先確保自己的linux系統內核版本高于3.10,并且系統是64位,才能體驗Docker哦。
通過uname -ir查看是否滿足要求。
Docker安裝
通過腳本的方式安裝docker,非常簡單。
1、 獲取最新的docker安裝包nicktang@nicktang-virtual-machine:~$ wget -qO- https://get.docker.com/ | sh
查看容器目錄結構,發現和物理機器的目錄結構完全一致,這就是為什么有的人稱docker容器也稱之為虛擬機的原因啦。Exit可以退出容器終端。
【刪】刪除容器,docker rm 容器ID,刪除多個容器就可以多個容器ID之間用空格隔開即可。
怎么用Docker完成持續集成、自動交付、自動部署?
這年頭見面不聊點自動化什么的,持續什么的,都不好意思。所以,咱們也要了解一下持續集成,自動交付,自動部署。但是上面說了這么多,沒發現Docker有那三樣功能啊,是的,Docker是沒有這個功能,但是你在完成上述三樣自動化的步驟都是依賴Docker的。Docker是這些流程實現的基礎,就如同軟件開發,軟件代碼才是根本,開發工具是輔助。所有搭建一個完整的自動化流程還需要github+jenkins+ registry三樣幫助。
持續集成和自動部署的原理如下圖所示:
RD推送代碼到git 倉庫或者svn等代碼服務器上面,git服務器就會通過hook通知jenkins。
jenkine 克隆git代碼到本地,并通過dockerFile文件進行編譯 。
打包生成一個新版本的鏡像并推送到倉庫 ,刪除當前容器 ,通過新版本鏡像重新運行。
而在整個過程中 RD只需要敲入三個命令Git add * ;Git commit –m “”;Git push即可完成持續集成、自動交付、自動部署。后面通過案例實際演示這個過程的神奇!
Docker還可以很方便的自動擴容哦,一般的自動擴容的兩種方式,一種就是docker容量擴大,另一種就是docker節點數擴充。第一種就修改配置文件即可,第二種通過簡單的拷貝,運行就完成了節點的擴容。
總結Docker雖好,可不要貪杯哦!雖然Docker具有超輕量化,但是不建議一臺機器上面部署太多的應用,同時部署的時候一定要差異化部署,什么意思呢,就是將大量計算的,和內存需要大的,IO操作頻繁的對系統資源需求不一致的部署到同一臺宿主機上。
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/7997.html
摘要:本文從定義,作用,技術架構,安裝和使用等全方位帶你看懂。最后,于開發者而言提供了一種開發環境的管理辦法,與測試人員而言保證了環境的同步,于運維人員提供了可移植的標準化部署流程。顯示上圖內容就表明安裝完成。 作者丨唐文廣:騰訊工程師,負責無線研發部地圖測試。 導語:Docker,近兩年才流行起來的超輕量級虛擬機,它可以讓你輕松完成持續集成、自動交付、自動部署,并且實現開發環境、測試環...
摘要:的屬性在瀏覽器的控制臺中,可以直接輸入來查看。可以在瀏覽器的控制臺中看出哪些是類型的,下帶綠色對勾的即是,如圖只要是類型的在控制臺通過是獲取不到的,也不能進行修改。當會話過期或被放棄后,服務器將終止該會話。在中,用取代了。 本文由云+社區發表 在前端面試中,有一個必問的問題:請你談談cookie和localStorage有什么區別啊? localStorage是H5中的一種瀏覽器本地存...
閱讀 1565·2021-10-25 09:44
閱讀 2925·2021-09-04 16:48
閱讀 1543·2019-08-30 15:44
閱讀 2474·2019-08-30 15:44
閱讀 1731·2019-08-30 15:44
閱讀 2815·2019-08-30 14:14
閱讀 2963·2019-08-30 13:00
閱讀 2143·2019-08-30 11:09