優點+工具+實踐=DevOps&Docker的企業級落地

Markdown

識別二維碼報名活動mysql

8月19日,來自微軟、數人云、京東、噹噹網的四位IT老兵,《一塊兒吹響Container+集結號》,看Serverless、DevOps、微服務、CI/CD、分佈式調度任務等技術,在各個場景中與Container發生的碰撞與交互。nginx

數人云:DevOps&Docker已經逐步完成佈道階段,在愈來愈多的場景中應用而且得到顯著的效果,本文將闡述了二者結合在一塊兒的優點以及相關實踐。web

Docker經過模塊化、平臺獨立性、高效資源利用和快速安裝,顛覆了原有的應用部署交付等方法,幫助DevOps更好地落地,二者結合的優點有:sql

  • 快速交付docker

  • 實時更新應用數據庫

  • 版本可靠設計模式

  • 提升質量安全

  • 敏捷環境服務器

什麼是DevOps

敏捷開發基於適應性應用開發、持續改進、持續交付,所以DevOps的目標是在應用交付的各個團隊之間創建協做,並使應用交付過程自動化,從而不斷地測試、部署和監控新發布的版本。網絡

DevOps將開發和運維協調在一塊兒,尋求自動化過程以保證應用的質量,經過DevOps模式,Docker能夠構建從GitHub代碼倉庫到應用部署的一個持續交付的通道,從GitHub代碼倉庫到應用部署。

DevOps如何結合Docker

Docker容器經過鏡像運行,能夠在本地或者存儲庫(如Docker Hub)上使用,假設做爲一個用例,MySQL數據庫或其餘數據庫提供的新版本常用小BUG或補丁進行修復,如何在沒有延遲的狀況下爲終端用戶提供新版本?

Docker鏡像與代碼存儲庫相關聯——一個GitHub代碼倉庫或其餘一些存儲庫,如AWS coUNK mit,若開發人員從GitHub代碼倉庫構建Docker鏡像,並使其在Docker Hub到最終用戶,若是最終用戶將Docker鏡像部署爲容器,那麼會有如下幾個單獨運行的階段:

1)將GitHub代碼倉庫構建到Docker鏡像中(使用Docker構建命令)

2)測試Docker鏡像(使用Docker run命令)

3)上傳Docker鏡像到Docker
Hub(使用Docker推送命令)

4)終端用戶下載Docker鏡像(使用Docker pull命令)

5)終端用戶運行一個Docker容器(使用Docker run命令)

6)終端用戶部署一個應用(如,使用AWS彈性Beanstalk)

7)終端用戶監控應用

Markdown

當新的MySQL數據庫在短期內(可能僅僅一天),出現新的BUG,須要將過程重複。

但DevOps模式能夠用於Docker鏡像從GitHub到部署,且不須要用戶或管理員進行干預。

DevOps的設計模式

DevOps的設計模式以持續集成、持續測試、持續交付和持續部署爲中心,自動化、協做和持續監控是DevOps中使用的一些其餘設計模式。

【持續集成】

持續集成是不斷地將源代碼集成到一個新的構建或發佈的過程,源代碼能夠在本地存儲中,也能夠在GitHub或AWS CodeCommit中。

【持續測試】

連續測試新的構建或發佈即持續測試,Jenkins之類的工具爲持續測試提供了幾個特性:在Jenkins的每一個階段都有用戶去輸入,它提供了一些插件,如Docker構建步驟插件,分別測試每一個Docker應用階段:運行容器、上傳鏡像、中止容器。

【持續交付】

持續交付爲終端用戶提供新的構建,以便在生產中部署,對於Docker應用,持續交付包括在Docker Hub或Amazon EC2容器等存儲庫中提供Docker鏡像的每一個新版本/標記。

【持續部署】

持續部署是不斷地部署Docker鏡像的最新版本,每當一個Docker鏡像的新版本/標籤可用時,Docker鏡像就會被部署到生產環境中,Kubernetes 容器管理器已經提供了一些功能,如滾動更新,無需中斷便可將Docker鏡像升級到最新的服務,Jenkins滾動更新是自動化的,當Docker鏡像的新版本/標籤可用時,就會不斷更新。

【持續監控】

持續監控能夠監控正在運行應用的過程,相似於Sematext能夠監控Docker應用,部署Sematext Docker代理來監控Kubernetes的集羣指標並收集日誌。

【自動化】

對於Docker應用,能夠自動安裝一些如Kubernetes這種很是複雜的工具,在其1.4版本中包含了名爲Kubeadm的新工具,能夠在Ubuntu和CentOS上自動安裝Kubernetes上,但CoreOS上不支持Kubeadm工具。

【協做】

協做涉及到跨團隊的工做和資源共享,如不一樣的開發團隊能夠在GitHub庫中開發Docker鏡像的不一樣版本代碼,全部的Docker鏡像標籤都被構建並不斷上傳至Docker Hub,Jenkins提供了許多分支渠道項目,用於從GitHub存儲庫等存儲庫的多個分支中構建代碼。

DevOps的工具

Jenkins

Markdown

Jenkins是一種經常使用的自動化和持續交付工具,可用於不斷地構建、測試和交付Docker鏡像,Jenkins提供了幾個能夠與Docker一塊兒使用的插件,如Docker插件,Docker構建步驟插件,Amazon EC2插件。

  • 使用Amazon EC2插件,可使用雲配置爲Jenkins的代理服務器動態提供實例。

  • Docker插件能夠用來配置雲,在Docker容器中運行Jenkins項目。

  • Docker構建步驟插件用於測試Docker鏡像的各個階段:構建鏡像、運行容器、將鏡像Push到 Docker Hub中止並刪除Docker。

CodeCommit & CodeBuild & Elastic Beanstalk

Markdown

AWS提供了一些DevOps工具:

CodeCommit是一個相似於GitHub的版本控制服務,用來存儲和管理源代碼文件,AWS CodeBuild用於構建和測試代碼的DevOps工具,須要構建的代碼能夠從GitHub或coUNK mit持續集成,從CodeBuild中輸出的Docker鏡像能夠上傳到Docker Hub,也能夠在構建完成時上傳到Amazon EC2容器註冊中心。

CodeBuild提供持續且自動化的過程用於構建、測試、交付階段。

Elastic Beanstalk用於在雲端部署和擴展Docker應用,提供了自動容量供應、負載均衡、容縮和監控,Beanstalk應用和環境能夠從一個打包爲ZIP文件的Dockerfile建立,該文件包含其餘應用資源,或僅僅來自一個未打包的Dockerfile,或能夠在Dockerrun.aws中制定Docker應用的配置,包括Docker鏡像和環境變量。Json文件是Dockerrun.aws的例子,列出了多個容器的配置,其中一個用於MySQL數據庫,另外一個用戶Nginx服務器:

{
  "AWSEBDockerrunVersion": 2,
  "volumes": [
    {
      "name": "mysql-app",
      "host": {
        "sourcePath": "/var/app/current/mysql-app"
      }
    },
    {
      "name": "nginx-proxy-conf",
      "host": {
        "sourcePath": "/var/app/current/proxy/conf.d"
      }
    }
  ],
  "containerDefinitions": [
    {
      "name": "mysql-app",
      "image": "mysql",
      "environment": [
        {
            "name": "MYSQL_ROOT_PASSWORD",
            "value": "mysql"
        },
        {
            "name": "MYSQL_ALLOW_EMPTY_PASSWORD",
            "value": "yes"
        },
        {
            "name": "MYSQL_DATABASE",
            "value": "mysqldb"
        },
        {
            "name": "MYSQL_PASSWORD",
            "value": "mysql"
        }
    ],
      "essential": true,
      "memory": 128,
      "mountPoints": [
        {
          "sourceVolume": "mysql-app",
          "containerPath": "/var/mysql",
          "readOnly": true
        }
      ]
    },
    {
      "name": "nginx-proxy",
      "image": "nginx",
      "essential": true,
      "memory": 128,
      "portMappings": [
        {
          "hostPort": 80,
          "containerPort": 80
        }
      ],
      "links": [
        "mysql-app"
      ],
      "mountPoints": [
        {
          "sourceVolume": "mysql-app",
          "containerPath": "/var/mysql",
          "readOnly": true
        },
        {
          "sourceVolume": "nginx-proxy-conf",
          "containerPath": "/etc/nginx/conf.d",
          "readOnly": true
        }
      ]
    }
  ]
}

Beanstalk應用程序部署的監控:
Markdown

DevOps&Docker的實踐

Docker Datacenter提供讓企業更容易創建內部CaaS環境,有助於企業應用交付。

Docker Datacenter(DDC)爲企業提供了一種方法:可讓開發者輕鬆地部署應用,而沒必要擔憂從開發到生產的過程當中產生的問題。

CaaS平臺提供容器和集羣編排,經過爲DDC構建雲端模板,開發者和IT操做人員能夠將Dockerzed應用遷移到雲端。

DDC包括Docker Universal Control Plane(UCP)、The Docker Trusted Registry (DTR) , 和The Commercially Supported (CS) Docker Engine 。

Markdown

The Universal Control Plane

UCP是集羣管理解決方案,能夠安裝在本地或虛擬私有云上,UCP公開了標準的Docker API,能夠繼續使用已知的工具管理集羣,如仍然可使用docker info 命令來查看集羣的狀態:

Containers: 15
Images: 10
ServerVersion: swarm/1.1.3
Role: primary
Strategy: spread
Filters: health, port, dependency, affinity, constraint
Nodes: 2
 ucp: <UCP_IP>:<PORT>
   └ Status: Healthy
   └ Containers: 20
 ucp-replica: <UCP_REPLICA>:<PORT>
   └ Status: Healthy
   └ Containers: 10

使用Docker UCP,仍然能夠管理基礎設施的節點:應用、容器、網絡、鏡像等,Docker UCP有內置身份驗證機制,支持LDAP和Active Directory及基於角色的訪問控制(RBAC),確保只有受權用戶可以訪問並對集羣進行更改。

Markdown

UCP是一個容器化的應用,容許管理一組同一Docker集羣的節點,UCP的核心組件是名爲UCP代理的全局調度服務,運行後將使用其餘CUP組件部署容器。

The Docker Trusted Registry

安全性是開發者在企業採用Docker所面臨的最大挑戰之一,認識到這一挑戰以及企業須要繼續在整個網絡中簡化安全性,Docker引入了Docker Trusted Registry(DTR)。

DTR使用的身份驗證機制和Docker UCP相同將其內置,還支持RBAC,容許在必要時實現個性化的訪問控制策略。

部署Docker Datacenter

運行DDC主要有兩種選擇:部署整個堆棧,包括UCP和DTR在AWS上生成模板,或在Linux服務器上手動操做,在本案例中,將使用Docker CaaS(容器做爲服務)提供的第二個選擇。

CaaS選項基本上是一個託管的SaaS解決方案,Docker引擎、UCP和DTR由Docker操做,容器節在服務器上運行,本文將連接到AWS環境做爲案例,但其實也能夠在本地環境中運行。

在AWS上部署節點集羣

登陸到您的DDC帳戶(能夠註冊試用Docer Datacenter版本)並在左側菜單中尋找雲設置選項,以下圖所示,包含能夠連接的支持公有云應用列表,用於建立和託管節點,可用Docker Datacenter進行管理。

Markdown

選擇AWS做爲提供商,單擊Plug-and-Play圖表後,會出現對話框,須要進入Role Delegation ARN(請參閱:https://docs.docker.com/docke...

節點集羣設置

連接到AWS環境後,進行基礎設施設置,以下圖所示:

Markdown

點擊建立後,將被重定向到配置頁面——會被要求輸入集羣的配置參數:

Markdown

集羣名稱沒有限制,也適用於標籤字段,容許提供關於想要建立集羣的額外描述。

建議列表也隨後出現,做爲提供者,必須選擇與自身帳戶連接的那個,字段自己只須要一個選擇,並且不侷限於建立託管在不一樣提供者的節點集羣。

繼續選擇AWS區域和網絡(VPC),若是將VPC默認設置爲「Auto」那麼全部的集羣節點都將部署在一個新的自動建立的VPC中。

Type/Size字段用於配置每一個節點的CPU和RAM數量,IAM角色能夠不受影響,並保存默認值「None」剩下要配置的最後兩個字段是磁盤大小和節點數量,本文中,設置了10G的磁盤空間並建立了3個節點。

Markdown

點擊啓動節點集羣后,將重定向到節點集羣概覽界面,能夠跟蹤集羣的狀態,成功部署節點集羣,部署的狀態就會出如今節點集羣的名稱下。

再次點擊啓動節點集羣,能看到雲提供商發生更改,由於已經與Docker Datacenter相連,全部建立的節點都將在那裏託管,能夠在雲平臺上用支持的方式進行監控。(參見Logz.io Docker日誌收集器用於集中監控Docker環境的方法:https://logz.io/blog/logz-io-...

跨節點集羣部署服務

接下來會詳細介紹如何跨節點集羣部署服務,本文中將使用Nginx:

Markdown

點擊左側菜單欄中的「服務」,將顯示主視圖的服務面板,然後點擊右上角的「Create」按鈕,將被重定向到部署獲取權鏡像的方式。

除了Jumpstart部分和公共鏡像,還有一部分能夠定義本身的存儲庫,從中提取鏡像,這裏將使用公開可用的鏡像。

Markdown

在搜索Docker Hub區域內的文本框中輸入「Nginx」Enter後將看到與之匹配的可用鏡像列表,選擇第一項。

單擊列表項中的「Select」按鈕後,將重定向到Settings頁面,部署策略對如下事情很是重要:

  • 跨節點之間的負載均衡

  • 當容器崩潰時的選項:自動重啓和自動銷燬

  • 終止容器時的策略(此操做實際在終止時會破壞全部數據)

  • 自動從新部署選項:當新鏡像被推送或構建時自動從新部署服務

Markdown

爲其餘面板與端口添加運行命令、內存限制和CPU有關限制,本文實例中保留默認值便可。

然後是Ports部分,能夠在這裏選擇發佈哪些端口,並對外部公開(以及哪些不公開),本案例中使用的是80和443。

Markdown

接下來配置環境變量、和其餘服務的連接,如把API做爲單獨的服務部署,NGINX服務器將請求重定向到API服務時,這些連接是有用的。

完成後,能夠點擊「建立和部署「按鈕,將會重定向到服務概覽頁面,能夠看到部署狀態,前面步驟中輸入的配置概述、容器、連接、環境變量,以及用於訪問NGINX服務器的DSN節點等等。

Markdown

若是單擊節點中提供的連接,則會看到Nginx歡迎頁面。
如前所述,除了鏈接AWS帳戶外,還支持內部節點,但都須要安裝支持的操做系統,單擊「在節點集羣中自帶節點」按鈕,並在服務器中鍵入命令(在模式窗口內提供),並在數據中心內執行相似節點的操做。

Markdown

原文做者:
Deepak Vohra、Daniel Berman

原文連接:
http://logz.io/blog/docker-da...
https://www.toadworld.com/pla...

相關文章
相關標籤/搜索