在生產環境中安全有效地的運行Docker容器會有不少複雜的挑戰。許多複雜性挑戰都是在跨多主機間運行容器產生的。這些跨主機的容器可能須要保持或共享狀態,也可能須要相互通訊,還可能會隨時消失。爲了高容錯性和可用性,你須要一個自動化的基礎平臺來關注存儲、網絡、容器調度和負載均衡等。
在這篇文章裏,我將會描述一個基於Apache Mesos的Docker架構。我認爲,做爲一個爲Docker容器提供跨主機間運行的平臺,Mesos在性能和成熟度方面已經通過了嚴格的測試。這篇文 章的目的是經過快速地開始和實踐來升級Docker在生產中的架構。在這裏,我不會深刻解釋全部(魔鬼)腳本,大部分腳本只需簡單地用Vagrant啓動 虛擬機就能夠了。若是你在技術實現上有任何問題請留下你的評論。
咱們首先來看看整體架構。
nginx
Docker registry: 保證每一個Docker鏡像的來源
Nginx: 爲Docker容器提供負責均衡
Apache Mesos: 做爲開啓Docker任務的集羣調度器
Mesosphere Marathon: 負責全部Docker容器的生命週期
Consul(-template): 爲發現和動態配置提供服務
Registrator: 爲發現Docker容器提供服務
laravel
我已經建立了一個Vagrant安裝配置,它能夠在你的本地電腦上運行全部的棧。爲了使它可以成功運行,你須要把下面的入口添加到本地的hosts文件中:
git
192.168.33.11 mm1.localdomain mm1 192.168.33.12 mm2.localdomain mm2 192.168.33.13 mm3.localdomain mm3 192.168.33.14 ms1.localdomain ms1 192.168.33.15 ms2.localdomain ms2 192.168.33.16 ms3.localdomain ms3 192.168.33.21 ms4.localdomain ms4 192.168.33.20 app-test app-production
下一步,你須要複製個人GitHub庫得到全部必要的腳本,設置和輔助文件。下面的全部命令都是在這個庫的根目錄下進行的。
腳本用於提供配置虛擬機,它只會在第一次建立虛擬機時才運行。若是因爲某些緣由腳本沒有運行成功你能夠經過下面的命令觸發它:vagrant provision {{vm name}}
注意因爲須要下載不少安裝包和Docker鏡像,有時爲了等待腳本運行完,這條命令運行須要一些時間。
Docker倉庫
首先,咱們須要一個私人的Docker倉庫,所以咱們就能夠確保Docker鏡像的來源。這個Docker倉庫將會在容器內運行,它將會經過一個永久的容器數據庫本地存儲這些鏡像。vagrant up registry
這個倉庫會在IP地址爲192.168.33.19上可用。我就能夠在不採起任何安全措施下使用這個倉庫。雖然在生產環境中這顯然是一個錯誤的作法,可是對於本地測試環境使用這會是一個很好的選擇。爲了使用不安全的倉庫你須要在你的docker daemon中添加一些選項:--insecure-registry 192.168.33.19:5000
對於boot2docker或Docker機器來講,你能夠在/var/lib/boot2docker/profile (ssh into the vm first)找到daemon選項。
Nginx 負載均衡
接下來,咱們須要一些負責均衡器來路由流入後臺容器的流量。爲此,咱們會用一個定製的Nginx容器來完成,爲了動態更新和重載配置,Nginx容器會運行consul-template。
github
cd Docker/Nginx docker build -t 192.168.33.19:5000/nginx . docker push 192.168.33.19:5000/nginx
看看github倉庫上的鏡像配置。基本上,consul-template會一直監聽Consul中任何應用服務的改變和相應地從新加載Nginx的配置。
建立兩臺準備運行Nginx容器的虛擬機:vagrant up lb1 lb2
這兩臺負載均衡器會經過vrrp協議彼此通訊,除非其中一個掉線了,不然虛擬IP將不會失效。運行的負載均衡器在IP地址爲192.168.33.20和前面添加應用測試或應用生產記錄的本地hosts文件中的IP上可用。
Mesos: masters and slaves
咱們至少須要3個Mesos master節點來確保徹底控制集羣。正如上面架構圖所示,master服務器上也會運行Consul服務器,Marathon框架,ZooKeeper和Registrator容器。相對於http://www.ivoverberk.nl/towar ... esos/目 前Zookeeper做爲Mesos的的先決條件,我更傾向於用Consul做爲發現須要的服務,由於Consul提供了不少好的優點以及consul- tempate會是一個額外的好工具。對於master節點,Registrator並非嚴格必須的;可是爲了一致性我在Mesos的master節點 和slave節點上都添加了它。Marathon framework會幫咱們管理Docker容器的生命週期。開啓Master節點:vagrant up mm1 mm2 mm3
它 會按序地開啓虛擬機。若是單獨地同時在不一樣的終端上建立這些虛擬機速度會快不少。運行實際的Docker容器時須要一些Mesos slave節點。咱們已經建立了4個slave節點。其中的兩個(ms1和ms2)在測試環境中使用,其餘兩個(ms3和ms4)在生產環境中使用。 Registrator能夠添加或刪除Consul服務目錄中的任何容器。開啓第一個slave節點:vagrant up ms1
在第一個slave節點安裝完成後,開啓剩下的節點:vagrant up ms2 ms3 m4
第一個slave節點充當NFS服務器,它是其餘slave節點成功完成它們的腳本運行的前提條件。我選擇用NFS做爲介紹分佈式文件系統的簡單方式。
你也能夠考慮其餘選擇好比GlusterFS、Ceph等文件系統。若是它們更適合你的環境,你也能夠跳過使用本地分佈式存儲系統而去尋找基於雲的解決方案。
web
好了,到目前爲止,咱們已經在咱們的本地機器上擁有了一個完整的Mesos棧。如今,咱們能夠看看這些組成部分是怎麼樣相互協做建立生產平臺的Docker。經過下面的URL可使用基於web的GUI接口:
http://mm1.localdomain:5050 (Mesos)
http://mm1.localdomain:8080 (Marathon)
http://mm1.localdomain:8500 (Consul)
在Mesos的接口上,你應該能夠看到4個運行的slave節點和一個運行的Marathon框架。對於Consul應該只有兩個入口和Marathon應該提供了一個空應用概述。
sql
在裏面,我已經包含了一個小的演示應用(Notejam)能夠測試咱們框架。Notejam是一個簡單的記筆記應用,它建立了一個登錄會話和在sqlite3數據庫上建立了一個存儲信息的文件。創建一個Docker鏡像咱們纔可以部署:
docker
cd Docker/App docker build -t 192.168.33.19:5000/app . docker push 192.168.33.19:5000/app
看看github倉庫上的鏡像配置。把咱們剛剛創建的鏡像部署到集羣中的測試slave節點上:
數據庫
cd Docker/App APP_VERSION=latest APP_ENV=test ./deploy.sh
檢查Marathon接口看看部署是否是已經開始了。因爲鏡像須要從slave節點上拉取下來,第一次運行可能須要一些時間。若是這三個容器已經開啓了你能夠跳到: http://app-test。這個應用應該可見。在頁面底部應該有一個狀態線,這代表這個環境中的應用是在運行的和環境中的容器是在被服務的,刷新這個頁面將會展示這個應用是被多個後臺提供服務的。
如今咱們升級咱們的應用到集羣中的生產節點上:
apache
cd Docker/App APP_VERSION=latest APP_ENV=production ./deploy.sh
這個應用如今應該能夠在http://app-production上訪問的到。我但願你能看到把這個步驟應用到自動化部署是很是容易的。在這個架構概覽中,你能夠找到必要組成部分。
你能夠經過Marathon接口添加或減小後臺容器的數量。負載均衡器會隨着容器的變化自動更新。
安全
雖然這篇博客中描述的安裝配置是一個可靠的,很是簡單的初級的預生產Docker架構,可是,在某些領域還有一些未解決的問題好比存儲,網絡和管理。接下來一系列博客文章將會專一於深刻探索這些領域。