1. 程式人生 > >Docker學習總結(7)——雲端基於Docker的微服務與持續交付實踐

Docker學習總結(7)——雲端基於Docker的微服務與持續交付實踐

本文根據〖2016 全球運維大會•深圳站〗現場演講嘉賓分享內容整理而成

講師簡介

易立

畢業於北京大學,獲得學士學位和碩士學位;目前負責阿里雲容器技術相關的產品的研發工作。

加入阿里之前,曾在IBM中國開發中心工作14年,擔任資深技術專員,負責IBM企業平臺雲產品線PureApplication System的研發工作;還負責和參與了一系列IBM在Web 2.0,SOA中介軟體的研發和創新,也曾為全球客戶提供SOA技術諮詢和專案實施。

日程

大家好,我演講的主題是《雲端基於Docker的微服務與持續交付實踐》,我主要分幾點來介紹:

Docker與微服務

雲端生產環境部署

應用Docker化改造

持續交付流程實踐

雲端基於Docker的微服務與持續交付實踐

交付方式變革改變了全球經濟格局

很多人都是拿集裝箱的故事開始的,我也不例外。一百年前,一個叫做集裝箱的東西,改變了全球定律,現在在跨國貿易的90%的貨物都是通過集裝箱來運輸的。

一個不起眼的單,一個交付上的改變,就可以改變整個經濟。

Docker在這個時代就是改變整個軟體交付的變革,現在幾乎在所有的運維或者架構上都在用Docker進行交付,為什麼?

雲端基於Docker的微服務與持續交付實踐

Docker in Alibaba

阿里巴巴Docker的使用無處不在,2011年,淘寶開始採用容器技術,配合阿里內部自身的一些架構,極大地提高了開發和運維的效率,使得整個開發效率變得更高。在“雙11”這樣的大促中,發揮了巨大的作用。

雲端基於Docker的微服務與持續交付實踐

阿里百川是一個面向移動平臺的電商PaaS,它利用Docker可以支援不同的程式設計環境,讓使用者可以快速應用軟體在線上執行。

基於阿里的實踐,我們從去年開始在公共雲端計算平臺上推行了容器服務,大家可以不用關心Docker底層的技術,網路儲存、資源管理等等不用關心,大家只用關心自己Docker的應用部署就可以了。

同時,Docker在很多領域都會發揮著巨大的作用

比如前一段時間谷歌的AlphaGo,其實背後計算很重要的一個框架就是深度學習框架,搭建一個深度學習框架是一個非常複雜的學習,你要配置相應的深入計算框架的各個軟體。

可是在阿里提供給客戶的服務,大家只要用Docker映象就可以快速地在一組HPC的機器搭建起來,你可以按需地獲得深度學習所需要的計算能力,也許你也有一天可以開發一款進行PK。

其實Docker在阿里巴巴的使用無所不在,你能想象,像阿里這麼龐大的一個系統,包含了虛擬化、資料庫、大資料、網路,這麼龐大的系統,幾百個元件,我們現在對它Docker處理,加速它開發運維以及輸出的速度。

我們可以把整個阿里雲在幾個小時之內就搭建起來。所以說,Docker已經徹底地改變了我們對軟體交付和運維的一些場景。

為什麼Docker這麼重要?

加速應用交付,縮短夢想距離

我們談網際網路公司,網際網路公司的核心競爭力是什麼?

就是效率,就是看你能不能最快速度地推出產品,最低的成本,最快的地迭代。

雲端基於Docker的微服務與持續交付實踐

而在十年前我們的軟體開發是什麼樣的?

我們的應用是一個整體式的應用,它是由大的團隊來開發,這個團隊分為開發團隊和運維團隊,開發團隊有前端團隊、後端團隊、資料庫團隊,這些團隊可能因為業務需求互相扯皮,到最後使整個軟體開發迭代的速度極為緩慢。

在傳統企業迭代的週期在半年到一年,這個速度遠遠不能滿足業務方的需求,同時更苦逼的是我們運維人員,直到最後一刻,軟體人員講解馬上要上線,把一堆安裝指令碼給運維人員,讓運維人員去安裝和部署,去保證它的高可用。

大家能想象嗎?這樣的事情怎麼可能發生!

所以說,大家頂著一個巨大的挑戰:

  • 第一個就是變化緩慢,在網際網路時代誰變得慢,誰就死得快;

  • 第二,為了保證這樣大型的整體應用,它非常難伸縮,通常為了適應大的流量,我們只能增加新的CPU等方法來擴充套件。

大家都知道,如果要保證線性計算效能的增長,可能需要花費的代價更高。另外,整個系統持續運營能力也是不好的,越大越不穩定,其中一個元件壞掉,就會產生雪崩效應,整個系統就會宕掉。

這個過程非常痛苦,阿里經過這樣的過程,現在的網際網路公司包括阿里都已經演變成如下的結構。

底層是一個基於雲服務或者虛擬化的計算架構,每個業務比如電商,可以有使用者管理、商品管理,我們的購物車、導購、廣告。

這些都是不同的模組,每個模組是由一個小組,每個圖片都可以獨立部署,元件之間是通過標準化的協議互相通訊。

只有這樣才能保證速度,才能保證在競爭中我們能夠活下來。

Docker 與虛擬化技術

Docker的出現進一步地推動這件事,Docker是一種輕量級的作業系統虛擬化方案,更加敏捷地進行交付。

Docker本身具有良好的可移植性,這一點更為重要,我們能夠在開發、測試、生產中用統一的方法、統一的介質來交付軟體。

想象一下,如果是在一個混合雲場景,比如說“雙11大促”,很多現在的計算力已經移到公有云上,因為是按需分配,很快地可以把應用擴充套件到整個資料中心。

雲端基於Docker的微服務與持續交付實踐

結合Docker容器和虛擬化技術

很多人說“Docker革了虛擬化的命”,我們認為Docker和虛擬化在很多程度上也是互補的。

Docker技術依然有本身的限制,比如Docker在系統的安全隔離方面做得並不好,像虛擬化這些Docker不能做,目前一個最成熟的方案是把虛擬化的技術和容器技術結合在一起。

在公有云上非常不建議大家採用多租戶的方式,因為有大量的安全漏洞。

Cloud Native Computing

隨著微服務和容器技術的發展,在去年穀歌牽頭成立了一個Cloud Native Computing基金會。

它定義了未來的原生應用的一些基本要素和框架,以微服務架構以容器方式交付,支援DevOps,這個平臺是動態自己管理的,不是手動的。

雲端基於Docker的微服務與持續交付實踐

為什麼做這件事?

我們要以持續發展的眼光來看,單體應用早晚會碰到天花板,它的複雜性、可伸縮性一定撞到牆。

所以,我們才採用微服務,微服務不是免費的午餐,它帶來好處的時候也帶來複雜性,以前我運維一個應用,現在要運維幾十個服務。

以前也有同事跟我說是二十個服務,分解成微服務之後是將近四百個,他的管理數量多了一個量極。

如何讓服務和服務之間監控它的健康狀況?

一旦一個服務掛掉,我們要對它進行隔離、熔斷、降級,然後我們怎麼對這個微服務進行版本更新,保證以前的產品不會受到中斷?

這些都是巨大的影響。

這些事情如果讓人手動來做的話,肯定不行,一定要用平臺、用自動化的方式。所以,這就是為什麼大家在強調需要一個平臺來支撐。

雲端漫步:開始 Docker 之旅

其實在雲上使用伺服器並不複雜,大家已經非常習慣於在自己的開發、測試、資料中心使用Docker技術,但是在雲上大家為什麼不呢?

大家覺得要虛擬機器、配各種東西很麻煩,但是其實不是這樣的。

雲端基於Docker的微服務與持續交付實踐

Docker在2014年底推出了Docker Machine,利用Docker Machine就可以快速地在雲上建立一個Docker的雲環境。

要做的事情很簡單,下載Docker Machine之後尋找雲的供應商的驅動,比如現在的阿里雲、亞馬遜、Aure這樣的一些Driver,通過Driver,通過命令列就可以在上面部署我的容器化應用,非常簡單。

生產環境中使用Docker

但是如果真的在雲上、在生長環境選Docker,你要面臨的挑戰遠不僅如此。

一個Docker的實力肯定不夠,一定是一個叢集,這個叢集怎麼管理,網路怎麼橋接,儲存怎麼辦,如何進行資源排程,怎麼安排,這是一個非常複雜的事情。

為了這件事,很多網際網路企業都提供了所謂的產品,我找幾個給大家介紹一下。

  • Docker Cloud,Docker在去年11月收購了tutum.co在今年2月份推出了Docker Cloud,它基本上提供了Docker自身原生的一個編排的API。

  • 亞馬遜在2014年11月份推出了 EC2 Container Service,它最早是基於一個自己的私有API提供了容器描述的服務,但是在去年逐漸開始支援更加廣泛的Docker,來描述一個組合的容器化應用。

雲端基於Docker的微服務與持續交付實踐

  • 谷歌的Compose template,它也是在2014年7月開源的,它是集成了以前的很多思想,相應的一些排程的很多歷史。推出來之後得到很大的歡迎,但是它提供了一套自己特有的對容器化應用抽象。

容器叢集管理 - Docker Swarm

為了更好地闡述我們的一些內容,我今天會介紹一下阿里容器服務。阿里容器服務為了解決使用者在開發、測試環境無縫遷移,我們完全相容了Docker原生編排方案。

Docker原生編排方案包括哪些內容?

  • 首先是Docker Swarm,它是一個很精巧的設計,我能不能把一組Docker engine變成一個虛擬的Docker engine,我都向這一個虛擬的Docker engine下發指令,由它的控制節點真正調動到一個實際的節點來執行。

雲端基於Docker的微服務與持續交付實踐

  • 它的架構非常簡單,在每臺節點上只需要一個Docker engine之後再安裝一個Agent就好了,Agent通過上報就能夠實現一個機器的自動註冊,通過這個功能上面有一個節點能夠發現裡面的節點資訊,就能夠自動地構建叢集。

  • 它是一個非常精巧的抽象,因為它幾乎99%地支援了所有Docker原生的API。

它帶來兩個好處

它可以和現在三方所有和Docker連線的工具整合在一起,不做任何改變;

它有另外一個好處是提供了一個可以插拔的架構,比如說它的排程器、儲存和網路都可以非常容易地進行擴充套件。

另外它有一個很大的缺點

Swarm和Docker一樣,它本身的抽象基本單位是容器,並沒有站在服務的角度去思考。

容器編排 - Docker Compose

Docker Compose源於Docker的一次收購,Docker Compose是描述如何將一組容器和這個容器相關的資源組合在一起。

比如我們拿Wordpress來舉例,然後Mysql,一個簡單的編排模板就可以把它描述出來,通過Wordpress映象在一起,通過連結連線到Mysql,通過volume來建立。

通過這種方式可以非常優雅地描述一組容器是怎麼關聯工作在一起的,而且通過一鍵就可以把整個應用站啟動起來。如果我們對它進行一些伸縮的話,也非常簡單。

雲端基於Docker的微服務與持續交付實踐

優點

  • 簡單好用,便於開發。它是一個非常好的開發工具,在Docker的開發社群中已經有超過70% 的人在使用Docker Compose進行映象開發。

  • 擴充套件了對網路、儲存的支援。不但可以描述和容器,還可以描述容器和它對應的基礎資源的一些關聯。

不足

面向開發和部署,不支援自動化運維。比如說,怎麼跟運維進行監控,是不是能夠進行彈性收縮,它都沒有做,因為它本身就是一個開發工具。

阿里容器服務

我們理想中的一個容器開發平臺是什麼呢?

我們的阿里雲容器服務提供的一個能力,首先底層是公共雲端計算平臺或者企業的專有云。在此之上是容器層,除了Docker之外,Docker倉庫,還有相應的儲存和網路。

雲端基於Docker的微服務與持續交付實踐

原生的Docker是遠遠不夠的,它提供了相應的機制,我們也建議這種機制把雲端的塊儲存、物件儲存、網路儲存都能夠非常容易地整合進來。

在容器層之上就是叢集管理和排程層,我們做了大量的優化和改進,比如說剛才大家談到一個應用,我們要保證它的遷移,我們要做那麼多事情,我們不能保證它不宕掉,我們能夠保證什麼呢?

我們能夠保證資源排程,哪怕一個數據中心斷電,一個地區的資料中心斷電,也可以保證資源排程。

另外,在容器編排的角度,我們怎麼很容易地把一個服務暴露出去,很容易地對容器進行日誌採集和監控?我們做了大量的擴充套件,依然可以做到非常好的容器應用的管控。

在此之上就是我們的服務層,阿里本身的微服務架構做了很久,在開源界是非常流行的,我們把這些經驗都內化到我們的支援能力中來。

其中的一個很大關鍵是如何做服務的發現、服務的路由,我們擴充套件了很多,通過BNS發現,通過負載均衡來實現服務節點之間的動態的負載均衡,通過這些東西,讓您的微服務做得很好。

在服務層之上就是接入層,讓Web應用可以非常容易地接入到你的自身應用上。

這是我們整個容器平臺的核心,但是大家知道,一個不開放的平臺是遠遠不夠的,因為容器不能解決所有的問題,容器一定要跟現有企業的應用或者雲服務打通。

我們做了很好的整合能力,能夠非常容易地跟雲服務整合,我們能夠跟第三方工具整合,把容器這個技術融合到您自己開發的流程中,同時我們提供雲管控。

管控能力,除了自身接入我們的雲監控日誌之外,實際上我們整個系統裡所有的管控框架都是可以隨便擴充套件的,因為我們認為一個不夠開放的平臺基本上就是耍流氓,容器不是你的資訊孤島,一定要跟現有的IT管控結合在一起。

我們也提供了很多範例怎麼利用開源的框架,迅速地搭建一個您自己需要的雲監控的能力,這些我們在後面的文件中有一些示例,大家可以去看。

什麼應用可以執行在容器中

講了這麼多,實際上大家一定會關心:

我的應用怎麼跑在容器裡?

我哪些應用可以被容器化?

大家都會問這些問題。

雲端基於Docker的微服務與持續交付實踐

這是我節選的一個很著名的分類方法,它可以幫助大家去挑選什麼樣的應用適合在容器裡跑、什麼樣的應用不適合。

它是根據兩個維度:

一個維度是長壽還是短命的應用;

另外一個是看它是有狀態還是無狀態。

  • 容器化的應用最擅長的使用就是左面的短命且無狀態的應用,因為這樣的應用最容易部署。

比如一個Web應用,我們可以很容易地快速把它幹掉,我們不在乎它,可以非常快速地部署一個Web應用。

  • 另外一個維度就是那些短命,像高效能運算、批處理。

對一個視訊進行渲染一定是大量有狀態的資訊,但是這些資訊可以通過Web物件儲存來儲存,這樣的計算密集型任務也非常適合在上面去做,因為我們可以快速地識別一大組叢集,通過這樣的容器來跑這樣的任務。

  • 還有一類是長壽但是無狀態的,比如說我們的開發測試環境一直在用或者我們的監控,它會一直跑在那裡,但是它本身的狀態依賴度是非常小的,這樣的應用我們也可以考慮。

  • 只有左下角這個維度一般來講是最有挑戰的,它是有狀態的服務,一般有狀態的服務需要一些調整,包括對儲存調整、對網路調整,大家依然需要DBA做很複雜的工作,也不完全做到自動化。

對於這樣的一些應用,我們的建議是在測試與開發中可以使用容器技術,但是在生產上非常不建議使用這樣的技術。

Docker化應用實戰: Ghost 部落格

接下來就拿一個特別喜聞樂見的例子跟大家解釋怎麼樣把一個應用容器化。

Ghost 部落格是我非常喜歡的一個部落格應用,非常簡單,非常輕,映象也非常好用,用很簡單的方式就可以把Ghost映象起來。

雲端基於Docker的微服務與持續交付實踐

但是還有很多問題:

  • 不是可伸縮;

  • 不是高可用的。

它所有的資料是儲存在本地的Database裡面的,如果虛擬機器節點宕掉之後,遷移到另外一個節點之上,資料狀態都丟掉了。

我們怎麼解決?

其實大家可以去參考THE TWELVE-FACTOR規範,這個規範得到了居多廠商的支援,它是現在很重要的一個程式設計規則。

它有幾個核心原則

  • 應用要和執行的環境解耦

  • 應用要和外部呼叫服務解耦

  • 應用要和配置解耦

通過這些解耦我們才能有一些應用變成無狀態的,能夠快速在雲上進行部署和運營。

相關推薦

Docker學習總結7——雲端基於Docker服務持續交付實踐

本文根據〖2016 全球運維大會•深圳站〗現場演講嘉賓分享內容整理而成 講師簡介 易立 畢業於北京大學,獲得學士學位和碩士學位;目前負責阿里雲容器技術相關的產品的研發工作。 加入阿

Docker學習總結5——超實用Docker入門學習教程

Docker是什麼 Docker是一種容器技術,它可以將應用和環境等進行打包,形成一個獨立的,類似於iOS的APP形式的“應用”,這個應用可以直接被分發到任意一個支援Docker的環境中,

Spring Cloud服務學習總結1——Spring Cloud及服務入門

一、Spring Cloud是什麼鬼? Spring Cloud為開發者提供了快速建立一些常見的模式在分散式系統的工具(如配置管理、服務發現、斷路器、智慧路由、微代理,控制匯流排,一次性令牌,全球鎖,領

Docker學習總結14——從程式碼到上線, 雲端Docker持續交付實踐

2016雲棲大會·北京峰會於8月9號在國家會議中心拉開帷幕,在雲棲社群開發者技術專場中,來自阿里雲技術專家羅晶(瑤靖)為在場的聽眾帶來《從程式碼到上線,雲端Docker化持續交付實踐》精彩分享。

Java Web學習總結7JSP

sco runt util 註意細節 服務 private tin 多行 cnblogs 一,JSP基礎語法 1,JSP模板元素 JSP頁面中的HTML內容稱之為JSP模版元素。 JSP模版元素定義了網頁的基本骨架,即定義了頁面的結構和外觀。 2,JSP腳本

Docker學習總結31——使用Maven外掛構建docker映象

Maven是一個強大的專案管理與構建工具。如果可以使用Maven構建Docker映象,以下幾款Maven的Docker外掛比較常用。外掛名稱官方地址docker-maven-pluginhttps://github.com/spotify/docker-maven-plugindocker-maven-plu

Docker學習總結21——Docke網路bridge詳解

Docker 安裝時會建立一個 命名為 docker0的 linux bridge。如果不指定--network,建立的容器預設都會掛到docker0上。 當前 docker0 上沒有任何其他網路

Docker學習總結22——Docke run命令詳解

在Docker中,run應該是使用者使用最多的命令了,很多讀者反饋不是很明白run命令的用法,而且相關的書籍、中文資料中對run命令的描述也不是非常完整,所以DockerOne組織翻譯了Docker官方的文件,以饗讀者。注意,本文基於最新的Docker 1.4文件翻譯。Docker會在隔離的容器中執行程序。當

Docker學習總結13——從零開始搭建Jenkins+Docker自動化整合環境

本文只簡單標記下大概的步驟,具體搭建各個部分的細節,還請自行搜尋。第一、二部分只是對Jenkins和Docker的簡單介紹,熟悉的同學請直接跳到第三部分。 一、關於Jenkins Jenk

Docker學習總結41——三個技巧,將Docker映象體積減小90%

一、前言 在構建Docker容器時,應該儘量想辦法獲得體積更小的映象,因為傳輸和部署體積較小的映象速度更快。但RUN語句總是會建立一個新層,而且在生成映象之前還需要使用很多中間檔案,在這種情況下,該如何獲得體積更小的映象呢?你可能已經注意到了,大多數Dockerfiles都

Spring Boot學習總結7——SpringBoot之於Spring優勢

一、Spring在Java EE開發中是實際意義上的標準,但我們在開發Spring的時候可能會遇到以下令人頭疼的問題:(1)大量配置檔案的定義;(2)與第三方軟體整合的技術問題,Spring每個新版本的

Docker學習總結10——10分鐘玩轉Docker

1、前言 進入雲端計算的時代,各大雲提供商AWS,阿里雲紛紛推出針對Docker的服務,現在Docker是十分火爆,那麼Docker到底是什麼,讓我們來體驗一下。 2、Docker是什麼 Dock

Docker學習總結29——Docker核心技術實現原理

提到虛擬化技術,我們首先想到的一定是 Docker,經過四年的快速發展 Docker 已經成為了很多公司的標配,也不再是一個只能在開發階段使用的玩具了。作為在生產環境中廣泛應用的產品,Docker 有著非常成熟的社群以及大量的使用者,程式碼庫中的內容也變得非常龐大。同樣,由於

Docker學習總結33——Docker環境下搭建 MySQL 主從複製

搭建環境Centos 7.2 64位MySQL 5.7.13Docker 1.13.1接下來,我們將會在一臺伺服器上安裝docker,並使用docker執行三個MySQL容器,分別為一主兩從。安裝doc

Docker學習總結19——Google開源的容器叢集管理系統Kubernetes介紹

Kubernetes是Google開源的容器叢集管理系統。它構建Ddocker技術之上,為容器化的應用提供資源排程、部署執行、服務發現、擴容縮容等整一套功能,本質上可看作是基於容器技術的mini-P

Docker學習總結3——Docker實戰之入門以及Dockerfile

應用映象 csphere/wordpress:4.2 # cd docker-training/wordpress/ # ls -a . license.txt wp-config-sample.php wp-login.

Docker學習總結12——非常詳細的 Docker 學習筆記

Usage of docker: --api-enable-cors=false Enable CORS headers in the remote API # 遠端 API 中開啟 CORS 頭 -b, --bridge=""

Docker學習總結23——Docker搭建大規模測試環境的實踐

內容來源:2017年4月8日,第四正規化資深測試開發工程師孫高飛在“餓了麼技術沙龍【第四彈】北京研發中心測試專場”進行《docker搭建大規模測試環境的實踐》演講分享。IT大咖說作為獨家視訊合作方,經主辦方和講者審閱授權釋出。 摘要 Docker是一個開源的應用容器

Docker學習總結42——Docker Compose 入門學習

一、Docker Compose介紹 Compose 是 Docker 公司推出的一個工具軟體,可以管理多個 Docker 容器組成一個應用(稱為一個 project,即專案)。Compose 定位是“Define and run multi-container applications w

Docker學習總結17——學會使用Dockerfile

Docker、Dockerfile、Docker映象、容器這些都是什麼鳥? 老生常談,再再再……普及一下: Docker: 最早是dotCloud公司出品的一套容器管理工具,但後來Docker慢慢火