使用Docker和Codeship來裝運Node.js應用
本文翻譯自RisingStack網站Gergely Nemeth撰寫的《Shipping Node.js Applications with Docker and Codeship》一文,感謝景莊對該文章的翻譯。
如今設置Node.js應用 持續部署 環境已經變得比以前簡單多了。我們有Jenkis, Strider, Travis或者Codeship這樣的工具。 在本文中我們將要討論的是使用 Codeship和Docker 來部署我們的Node.js應用。
在深入討論之前,有一點原則是我想要聲明的——不可變的基礎結構(infrastructures),那么它具體指的是什么? 以及它是如何讓你的生活變得更加簡單的?
不可變的基礎結構
所謂不可變的基礎結構通常包括數據和其他相關的東西。所謂其他相關的東西取決于部署階段的替代物。 不僅僅是安全不定,或者是在生產系統中的配置變化。為了達成這一點,我們需要在兩種途徑中選擇: 基于機器的或是基于容器的方案。
基于機器的 Machine-based
基于機器的基礎結構大概可以這樣描述:每次部署的時候你需要設置完全新的EC2機器,并且在上面部署它們。 如果所有的事情都正常的話,你只需要簡單的修改你的負載均衡配置來指向你的新機器。然后,你可以刪除舊的機器。
基于容器的 Container-based
你可以認為 基于容器 的方案是對基于機器方案的改進: 在單臺機器上你可以運行多個容器。Docker讓這件事情變得非常的簡單。Docker是一個開放平臺, 能夠讓開發者和系統管理員構建、部署和運行分布式的應用程序。
當然,你可以使用VMWare或者VirtualBox來實現基于容器的方案。但是, Docker 讓你只需要幾秒鐘就完成任務,而后者可能需要十幾分鐘。
不可變的基礎結構的優點
為了能夠盡可能的利用這個方法,你需要配置 持續交付 管道, 并且需要相應的測試和編制(orchestration)。
主要的優點包括:
- 回退到舊版本非常的簡單
- 在隔離環境中測試新基礎結構成為可能
- 簡化變化管理,因為服務器從不退化(rot)
持續集成、持續交付、持續部署
持續集成
持續集成一般指的是將開發分支一天多次合并到主干上的過程(通常是自動進行的)。這有助于:
- 盡早的發現錯誤
- 避免“集成地獄”
持續交付
顧名思義,持續交付指的是將代碼交付到指定環境中的過程,無論是QA小組或者是客戶,都可以審查代碼。 當變動被通過后,它們將被交付到生產環境中。
持續部署
你可以認為持續部署是持續交付的下一個環節,也就是說,當代碼變更通過自動化測試后能夠自動的部署到生產環境中。 持續部署高度依賴于基礎設施的在測試、繼承和部署等方面的自動化能力。一個簡單的持續部署的過程如下圖所示:
更多關于持續部署有關的實踐,可以參考 這篇文章 。
Docker實踐
是時候來動手了。我們將會創建和部署一個Hello Docker & Codeship的應用。
首先,我們將要使用 https://github.com/RisingStack/docker-codeship-project 這個倉庫。 它是一個非常簡單的應用,能夠通過HTTP返回“We <3 Docker & Codeship”。
下面是我們接下來需要做的事:
- 當某個開發者push代碼到master分支時,Github會觸發在Codeship上的構建工作
- 如果一切運行正常的話,Codeship會觸發在Docker Hub上的一次構建
- 當新的Docker鏡像準備好后(pushed),Docker會觸發一次webhook
- Ansible將最新的鏡像推送到應用服務器上(Docker部署者)
創建一個Docker Hub賬號
什么是Docker Hub
去 Docker Hub 注冊。
設置Docker倉庫
注冊完后,在Docker Hub中綁定你的Github賬號,去 My Profile > My Repositories > Add repositories, 然后點擊Automated build。
在設置完倉庫后,開啟構建觸發器(enable Build triggers)。這類似于執行了如下命令:
$ curl --data "build=true" -X POST <a >https://registry.hub.docker.com/u/gergelyke/docker-codeship-project/trigger/TOKE
其次,也要確保在自動構建下禁用了Github提交鉤子(commit hook),Codeship將會監聽git倉庫的提交行為。
就是這樣,你的Docker Hub已經可以被Codeship所使用。
獲取一個Codeship賬號
去Codeship獲取一個賬號。
在Codeship中設置你的倉庫
你可以在Codeship中連接到你的Github/BitBucket帳戶。當你連接完成后,你會在Codeship中看到你的倉庫列表。 然后選擇我們需要的倉庫,選擇“Save and go to my dashboard”。
修改你的部署命令
在部署設置下,小啊U你這自定義腳本,將前面在Docker Hub中生成的curl命令剪貼到這里。
Docker部署者
這部分的內容并非是現成的。你必須手動實現一個小型的API服務器,用于監聽Docker Hub webhook。 當端點(endpoint)被調用時,它會運行Ansible,然后將最新的可用的Docker鏡像拉到應用服務器中。
當然,你也可以不使用Ansible,而是選用其他的替代服務。
小結
正如你看到的那樣,使用不變的基礎設施設置一個持續交付管道非常的簡單,它不僅僅可以用于你的生產環境中, 也可以用于開發或預發環境中。
原文鏈接: Shipping Node.js Applications with Docker and Codeship