對於開發人員而言,他們的最終目標是擁有本身的數據中心(data center),使他們可以在貼近真實狀況的副本上測試他們的服務。然而,開發人員的開發過程當中卻充滿了妥協。由於,數據要麼是個簡化集,要麼被匿名,這加大了開發人員的開發難度。而且公司也尚未準備好爲每一位開發人員搭建一個數據中心。git
今天,我將提供一個過程摘要來闡明如何使用Rancher和本地計算機減小開發人員在開發時的妥協。咱們的目標是爲開發人員提供儘量具備表明性的環境,以致於其可被用於真實的生產環境中,咱們將使用Docker和Rancher來作到這一點。github
若是您遇到過下列任何一項煩惱:docker
共享的開發環境因多個問題而崩潰服務器
測試數據不一致網絡
網絡問題拖延開發進度負載均衡
我但願可以提供給您一些解決這些問題的想法。ssh
一個全部服務都在裸機上運行的數據中心,沒法將其複製到筆記本上。選擇使用虛機方式遷移則有助於這個過程,部分緣由在於虛擬化可讓用戶運行多個(agent)服務。這樣一來,硬件環境隨即成爲問題的關鍵所在。不管是磁盤的輸入輸出不足以支持服務仍是沒有足夠的內存,都會使得搭建一個產品級的生產環境副本以失敗了結。然而Docker和Rancher卻能夠幫您解決這些難題。Docker幫您快速啓動容器,Rancher幫您解決編排、網絡和負載均衡等一系列問題。工具
經過這種組合,在您的筆記本電腦上運行數據中心逐漸變爲可能。這個想法在最近的六個月來變得很是受歡迎,由於許多大型機構已經開始爲開發人員提供一個完整的docker management layer以讓數據中心可以在本地運行。許多公司正在進行這項投資,由於他們可以得到各類各樣的好處,其中包括:測試
開發人員在看到問題時更熟悉如何使用工具解決url
開發人員在交付代碼以前可以找出問題
開發人員可以獨立工做,甚至離線工做
新的開發者能夠在幾分鐘內進行工做,而不須要花費幾天或是幾周來適應開發環境
DevOps工做的主機永遠不會宕機。
那麼,咱們該如何作呢?出於寫這個博客的目的,我會假設正在Mac或Windows上使用Docker Toolbox。下載安裝和說明文件能夠在這裏找到https://www.docker.com/produc...。
首先,讓咱們來看看它長什麼樣子:
咱們將運行兩個虛擬機,一個虛擬機只運行Rancher Server,另外一個虛擬機做爲主機運行並運行應用程序堆棧。用這樣的配置有幾個緣由。首先,它對於真正的情形比較有表明性。其次,一旦出現問題,您的應用程序沒法使Rancher因資源不足而發生飢餓現象。
因此,首先第一件事,讓咱們建立一個具備512 GB和8 GB磁盤的VirtualBox虛擬機。
docker-machine create rancher --driver virtualbox --virtualbox-cpu-count "-1" --virtualbox-disk-size "8000" --virtualbox-memory "512" --virtualbox-boot2docker-url=https://github.com/boot2docker/boot2docker/releases/download/v1.10.3/boot2docker.iso
咱們指定的URL指向的是Rancher可以運行的Docker v1.10.3版本。
Docker Toolbox是在本地運行Docker的理想選擇,但運行它確實有一些挑戰性。緣由之一是它使用了DHCP協議,若是你不想託管靜態服務的話,這將是一個不錯的選擇。可是,要繞開這個ssh協議鏈接到Rancher虛擬機的話,加上下面的這一行代碼到/var/lib/boot2docker/profile:
sudo cat /var/run/udhcpc.eth1.pid | xargs sudo killsudo ifconfig eth1 <ip address to assign> netmask <subnet mask> broadcast <broadcast address> up
此時,您將在docker-machine中出現一個關於IP地址不匹配的錯誤。您能夠在主機操做系統上運行如下命令來解決這個問題:
docker-machine regenerate-certs rancher -f
這將給咱們的Rancher服務器分配一個靜態IP地址。 而後,您能夠運行:
docker run -d --restart=always -p 8080:8080 rancher/server
幾分鐘後,將有一個Rancher服務器在您指定的IP地址的8080端口上運行。保持Rancher服務器的IP地址不變很重要,由於這是咱們部署的任何主機代理都須要訪問的地方。
登陸到Rancher服務器以後,轉到「添加主機(add host)」並生成自定義代理命令。複製這個命令並保留它,由於咱們將使用這個命令來添加主機。
如今讓咱們建立第二個虛擬機。使用與上述相同的命令,您能夠自行調整虛擬機的名稱、內存和磁盤空間,以知足您的開發需求。
等待虛擬機再一次啓動後,您能夠進入併爲其分配一個靜態IP地址。
如今,咱們遇到了boot2docker虛擬機的另外一個限制:其數據持久性的限制。
若是咱們向主機添加一個Rancher代理,它會建立一個/var/lib/rancher文件夾並在其中存儲一些信息。若是從新啓動虛擬機,這些信息將被銷燬。所以,當代理再次出現時,主機會認爲它是一個新的服務器,以前的服務器信息在那時就所有丟失了。
幸運的是,面對這樣的窘境有一個解決方法。在運行Rancher代理腳本日誌到主機上以前,運行如下命令:
sudo mkdir /mnt/sda1/var/lib/rancher
這將建立一個文件夾,這個文件夾在從新啓動時能被保留下來。如今,在每次啓動時,我須要將此文件夾映射到/var/lib/rancher。所以,咱們須要再次編輯/var/lib/boot2docker/profile並添加如下內容:
sudo mkdir /var/lib/ranchersudo mount -r /mnt/sda1/var/lib/rancher /var/lib/rancher
這將確保咱們的代理狀態在從新啓動之間能被保留。
經過ssh協議鏈接到機器,並運行您從Rancher服務器得到的自定義代理字符串。
如今您已經有了一個Rancher服務器,它的主機徹底在本地運行,它的應用程序棧準備完畢等待您的部署。
在此,是否將它提升到一個新的水平取決於您本身。但如今,您有了一個可運轉的Rancher / Docker環境。您可以從外部存儲庫拉取數據,編寫腳本在本地構建應用程序或者運行目錄中的條目。
雖然這種開發方式並不完美,但對於大多數狀況來講是「足夠好」的了,而且這樣的開發方式值得分析參考,並以此做爲繼續改進開發的方法。