持續交付系列(二):使用Docker、Mesos實現持續交付

yye7 10年前發布 | 72K 次閱讀 Docker

本文主要介紹Mesos和Marathon的搭建以及如何完成整個持續交付過程,以及后續還可以做哪些改進和加強。整個系統搭建完成后,應用代碼的改變會 自動觸發Jenkins構建流程,幾秒鐘后,改變就會通過Jenkins、Docker Hub和Marathon傳遞到Mesos中部署上線,是不是很酷?

第一部分中文翻譯)我們介紹了如何Docker化一個Node.js應用,如何使用Fig部署Jenkins和Docker Registry,以及如何實現Node.js應用的持續集成。

本文是第二部分,將繼續介紹Mesos和Marathon的搭建以及如何完成整個持續交付過程。

持續交付系列(二):使用Docker、Mesos實現持續交付

如果你不了解Mesos或者Marathon,可以參考如下文章: 文章1文章2文章3

現在,我們有了功能性開發和持續集成的環境,可以開始搭建Mesos集群了。

如下是包含系統所有部分的fig.yml文件。在之前配置好的Jenkins和Docker Registry基礎之上,我們還有Mesos master、Mesos slave、Mesosphere Marathon和負責內部Mesos通信的Zookeeper。

# Zookeeper: -p 2181:2181 -p 2888:2888 -p 3888:3888
zookeeper:
image: jplock/zookeeper:3.4.5
ports:
- "2181"
master:
image: redjack/mesos-master:0.21.0
hostname: master
links:
- zookeeper:zookeeper
environment:
- MESOS_ZK=zk://zookeeper:2181/mesos
- MESOS_QUORUM=1
- MESOS_WORK_DIR=/var/lib/mesos
- MESOS_LOG_DIR=/var/log
ports:
- "5050:5050"
marathon:

image: garland/mesosphere-docker-marathon

image: mesosphere/marathon links: - zookeeper:zookeeper ports: - "8080:8080"

 this image does not respect MARATHON_ env variables, so adding the params via command

command: --master zk://zookeeper:2181/mesos --zk zk://zookeeper:2181/marathon slave: image: redjack/mesos-slave:0.21.0 links: - zookeeper:zookeeper - master:master environment: - MESOS_MASTER=zk://zookeeper:2181/mesos - MESOS_EXECUTOR_REGISTRATION_TIMEOUT=5mins - MESOS_CONTAINERIZERS=docker,mesos - MESOS_ISOLATOR=cgroups/cpu,cgroups/mem - MESOS_LOG_DIR=/var/log volumes: - /var/run/docker.sock:/run/docker.sock - /usr/bin/docker:/usr/bin/docker - /sys:/sys:ro - mesosslace-stuff:/var/log expose: - "5051" jenkins: image: containersol/jenkins_with_docker links:  - marathon:marathon volumes: - jenkins-stuff:/var/jenkins_home - .:/var/jenkins_data - /var/run/docker.sock:/var/run/docker.sock - /usr/bin/docker:/usr/bin/docker ports:  - "8081:8080" registry: image: registry environment: - STORAGE_PATH=/registry volumes: - registry-stuff:/registry ports:  - "5000:5000"</pre>
fig.yml不多做解釋。所有環境參數都是參考Docker Hub上對應鏡像的使用介紹。

Mesos slave容器還使用了掛載socket的技巧,不過不需要做別的,因為slave是用root用戶運行的,有訪問socket的權限。

要注意Jenkins容器連接到了Marathon。這就要求能夠從Jenkins容器發送請求到Marathon容器里。我們在下一章介紹部署的時候會詳細說明。

現在重啟系統,可以看到系統開始運行:

$ fig up
Creating cddemo_registry_1...
Recreating cddemo_zookeeper_1...
Creating cddemo_master_1...
Creating cddemo_slave_1...
Recreating cddemo_marathon_1...
Creating cddemo_jenkins_1...

容器啟動非常快,但是要等所有服務都上線大概花了30秒(在MacBook Air上的Ubuntu虛擬機里)。

Mesos在http://localhost:5050。如下截圖里可以看到一個活動的slave。該slave在本次配置下沒有暴露任何端口。

持續交付系列(二):使用Docker、Mesos實現持續交付

http://localhost:8080可以訪問Marathon。

持續交付系列(二):使用Docker、Mesos實現持續交付

部署

最后一步是將我們用Marathon在Mesos上新構建的Docker鏡像部署好。

持續交付系列(二):使用Docker、Mesos實現持續交付

首先需要創建配置文件將應用安排到Marathon上,如下app_marathon.json:

{
"id": "app", 
"container": {
  "docker": {
    "image": "localhost:5000/containersol/nodejs_app:latest",
    "network": "BRIDGE",
    "portMappings": [
      {"containerPort": 8000, "servicePort": 8000}
    ]
  }
},
"cpus": 0.2,
"mem": 512.0,
"instances": 1
}

這里也有一些需要注意的地方。比如,沒有提到健康檢查,需要告訴Marathon應用運行和不運行的時間。

一旦我們發布了這個JSON文件,就可以在deploy.sh里添加最新的腳本,移除最近運行的應用,并且用新的鏡像重新部署它。當然有更好的升級策略,不過不在這里討論。

#!/bin/bash

if [ -z "${1}" ]; then version="latest" marathon="localhost" else version="${1}" marathon=${MARATHON_PORT_8080_TCP_ADDR} fi

 destroy old application

curl -X DELETE -H "Content-Type: application/json" http://${marathon}:8080/v2/apps/app&nbsp;

 I know this one is ugly. But it works for now.

sleep 1

 these lines will create a copy of app_marathon.json and update the image version

cp -f app_marathon.json app_marathon.json.tmp sed -i "s/latest/${version}/g" app_marathon.json.tmp

 post the application to Marathon

curl -X POST -H "Content-Type: application/json" http://${marathon}:8080/v2/apps -d@app_marathon.json.tmp</pre>
最后一步是將deploy.sh添加到Jenkins的配置中并運行構建。

持續交付系列(二):使用Docker、Mesos實現持續交付

成功構建之后,可以看到應用運行在Marathon上:

持續交付系列(二):使用Docker、Mesos實現持續交付

http://localhost:31000可以訪問我們自己的應用:

持續交付系列(二):使用Docker、Mesos實現持續交付

現在可以試著改變應用并且觸發Jenkins去構建build。幾秒鐘后,這個改變就會通過Jenkins、Docker Hub和Marathon傳遞到Mesos里!

改進

要想改進這個系統有兩個大方向:添加更多的功能以及提升搭建質量(deepening the quality of the setup)。可能的擴展有很多,我們只列了幾個例子:

  • 將HelloWorld示例擴展為一個標準Web應用
  • 多語言支持
  • 多層次的自動化測試(單元測試、系統測試、性能測試等等。)
  • 用Git hook自動觸發Jenkins build
  • 部署到公有云里,比如GCE、AWS等
  • 在多主機上運行
  • HAProxy搭建
  • 用Jmeter實現負載模擬下的自動擴展
  • 部署一個基于微服務的系統
  • 使用Flocker做持久化存儲
  • 使用Weave作為網絡容器
  • 使用Consul實現自動服務發現
  • 添加系統監控
  • 添加集中式日志

我的下一步想使系統可以面向外部用戶,添加HAProxy和自動擴展的能力,如下圖所示:

持續交付系列(二):使用Docker、Mesos實現持續交付

最后的話

一開始搭建這個系統主要是想幫助開發和運維人員學習如何在持續交付領域使用Docker和Mesos。在幾個月的過程中我發現完整的系統很復雜,很難解釋,更難搭建和使用。
我們請 Marta marszal創建了本文的圖表,以讓文章更容易理解。

如果有改進本示例系統的建議,請一定告訴我們。本文的圖表也可以隨意下載和使用,不過請注明出處。 CD_with_Mesos_Docker

所有資源都可以在 GitHub上找到。
===========================
譯者介紹
崔婧雯,現就職于VMware,高級軟件工程師,負責桌面虛擬化產品的質量保證工作。曾在IBM WebSphere業務流程管理軟件擔任多年系統測試工作。對虛擬化,中間件技術有濃厚的興趣。

原文鏈接:Continuous Delivery with Docker on Mesos in less than a minute – Part 2(翻譯:崔婧雯 校對:李穎杰)

來自:http://dockerone.com/article/242

 本文由用戶 yye7 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!