摘要:在最初的容器構(gòu)建之后,的變更是純代碼。發(fā)現(xiàn)任何舊容器正在運行的實例并停止它們。我們已經(jīng)創(chuàng)建了來直接部署我們的每個服務,因此部署僅僅是一個運行正確的問題。總結(jié)因為主要的一個方式是封裝基礎架構(gòu)到一個自包含的,可部署的包。
在 Ionic,我們是 Docker 的鐵桿粉絲。我們的代碼以及代碼的依賴全部運行在 Docker 中,Docker 讓我們的產(chǎn)品更充分地利用計算資源,比如 Ionic Creator,以及即將到來的 Ionic.io 服務。
使用 Docker 面對的一個挑戰(zhàn)是,盡管我們只是對我們的代碼做了一個小小的變更,我們都必須要走一遍構(gòu)建一個新容器的過程,把它拉取(pull)到我們的服務器,并替代正在運行的版本。
我們所有的代碼都存儲在 GitHub,使用 Docker Registry(這里推薦下國內(nèi)的 docker.cn,速度比官方的快很多,不用擔心“你懂的”問題) 來自動構(gòu)建和存儲我們的代碼,并使用 Ansible 來管理和部署我們的容器到我們的服務器上。即使是一個完全自動化的過程,部署一個小變更都可能花費我們 20 分鐘或者更多的時間。經(jīng)過頭腦風暴,我們意識到我們有一個更好的方法來利用 Docker。
在最初的容器構(gòu)建之后,99% 的變更是純代碼。我們不需要添加任何依賴,或者是改變?nèi)魏未a運行所必需的東西。Docker 實際上只是一種封裝基礎架構(gòu)的方式,要求我們的代碼運行在一個自包含的包中。因為我們 99% 的變更都是代碼,不是基礎架構(gòu),我們意識我們不需要在每次變更的時候都努力重新構(gòu)建我們的基礎架構(gòu)。
讓我們解決這個問題的是 Docker 的殺手級特性 volumes。在我們 Docker files 的第一次迭代中,我們從 GitHub 拉取代碼,并直接構(gòu)建進容器中。現(xiàn)在,我們故意把代碼放在容器外面,并在容器啟動的時候,通過加載一個主機卷(host volume) 來代替。當我們想做一個新發(fā)布,Ansible 從 GitHub 上拉取 master 分支到我們服務器上的 app 目錄。這時,它通過檢查來確保相關(guān)聯(lián)的容器正在運行,如果沒有在運行,它將啟動這個容器并把 app 代碼映射進容器。
使得我們的工作更便捷的另外一個組件是因為我們的大部分 app 是 Python 的(Django),我們在 Docker 容器中使用 uWSGI 提供服務。uWSGI 有一個 touch reload 特性,可以監(jiān)控指定的文件,當該文件被 touch 的時候,會重載 uWSGI 服務。在 Ansible 從 GitHub 拉取我們的變更之后,我們使用 Ansible 來 touch uwsgi.ini 文件,這會觸發(fā)正在運行的容器中的 uWSGI 重載。我們就是這樣來運行我們代碼的更新版本的!
這是什么意思,簡單地說,花費我們 20+ 分鐘的部署過程是這樣的:
提交(Commit)和 推送(push)變更到 GitHub。
Docker Registry 拉取(pulls)變更和構(gòu)建一個新容器。
Ansible 連接到我們的服務器并拉取(pulls)這個新容器 。
Ansible 發(fā)現(xiàn)任何舊容器正在運行的實例并停止它們。
Ansible 啟動該容器的新實例。
類似的 10 秒的過程是這樣的:
提交(Commit)和 推送(push)變更到 GitHub。
Ansible 連接到我們的服務器,從 GitHub 拉取最新的 master。
Ansible touches 該 app 的 uwsgi.ini 文件來觸發(fā) UWSGI 的重載。
步驟分解 Supervisor / uWSGI我們在 Docker 容器中使用 Supervisor 來啟動容器中的進程運行。我們的 supervisord.conf 文件看起來像下面這樣:
[supervisord] nodaemon=true [program:uwsgi] command = /usr/local/bin/uwsgi --touch-reload=/path/to/code/in/container/uwsgi.ini --ini /path/to/code/in/container/uwsgi.ini
我們通過 --touch-reload 選項來把 uwsgi.ini 文件作為觸發(fā)文件。
Docker當我們啟動我們的容器,我們添加一個包含我們 app 代碼的主機卷(host volume),該主機卷被映射到容器中的一個 app 路徑,uWSGI 將從這個路徑加載 app。
docker run -d -P -v /path/to/code/on/host:/path/to/code/in/container --name=container_name driftyco/testappAnsible
Ansible 負責從 GitHub 克隆(clone)我們應用程序的代碼到我們主機的 app 目錄,確保 Docker 容器正在運行以及 touch 配置的 uWSGI touch-reload 文件。我們已經(jīng)創(chuàng)建了 playbooks 來直接部署我們的每個服務,因此部署僅僅是一個運行正確的問題。
對于一個快速代碼部署,我們運行一個包含這些任務的 playbook,并只需要幾秒來運行:
- set_fact: host_volume="/path/to/code/on/host" - name: Git pull the latest code git: repo=git@github.com:{{ org }}/{{ container }}.git dest={{ host_volume }} accept_hostkey=yes force=yes - name: Gracefully reload uwsgi file: path={{ touch_file }} state=touch
如果我們需要重啟整個容器或者是更新我們的系統(tǒng)包,我們可以做一個容器部署,這將花費幾分鐘,使用這些任務:
- name: Add app dir if it doesn"t yet exist file: path={{ host_volume }} owner=nobody group=docker recurse=yes state=directory sudo: yes - name: Pull Docker image command: "{{ item }}" ignore_errors: yes with_items: - docker pull {{ org }}/{{ container }} - docker stop {{ container }} - docker rm {{ container }} - name: Run Docker image with app volumes command: docker run -d -P -v {{ host_volume }}:{{ container_volume }} --name={{ container }} {{ extra_params }} {{ org }}/{{ container }}
對于一個全量部署,我們按順序運行這兩個 playbooks;這是非常簡單的。
總結(jié)因為 Docker 主要的一個方式是封裝基礎架構(gòu)到一個自包含的,可部署的包。這不需要重新構(gòu)建整個容器僅僅只是為了幾個代碼變更。通過在 Docker 中利用卷(volumes),我們從容器中移除了代碼,使得代碼能獨立于容器更新。最后,我們可以使用 UWSGI 的 touch reload 特性在容器中重啟 UWSGI,并從卷(volume)中加載更新的代碼。
注:本文作者是 Joel Weirauch,本文原文是 Fast code deployments with Docker
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/26372.html
摘要:在最初的容器構(gòu)建之后,的變更是純代碼。發(fā)現(xiàn)任何舊容器正在運行的實例并停止它們。我們已經(jīng)創(chuàng)建了來直接部署我們的每個服務,因此部署僅僅是一個運行正確的問題。總結(jié)因為主要的一個方式是封裝基礎架構(gòu)到一個自包含的,可部署的包。 在 Ionic,我們是 Docker 的鐵桿粉絲。我們的代碼以及代碼的依賴全部運行在 Docker 中,Docker 讓我們的產(chǎn)品更充分地利用計算資源,比如 Ionic ...
摘要:本文介紹了企業(yè)互聯(lián)網(wǎng)開發(fā)及運維的一些實踐,深入剖析了互聯(lián)網(wǎng)項目開發(fā)及上線過程中的各種痛點及解決之道。線上出錯,我們通過收集服務器端應用性能數(shù)據(jù)的方式,實時展示應用的調(diào)用拓撲圖,并根據(jù)出現(xiàn)異常的請求,進行下鉆,定位出具體出現(xiàn)問題的代碼。 本文介紹了企業(yè)互聯(lián)網(wǎng)開發(fā)及運維的一些實踐,深入剖析了互聯(lián)網(wǎng)項目開發(fā)及上線過程中的各種痛點及解決之道。一個互聯(lián)網(wǎng)項目的上線并不是那么容易,需要經(jīng)過很多的環(huán)...
container-as-a-service-0x02 -- 項目構(gòu)建&部署之道 By 蘇依蜀黍 . 2016.06.08 分析 之前寫了兩篇,算是比較完善的稱述了就目前的業(yè)務,容器服務在我司的應用,但是沒有比較具體的講如何構(gòu)建以及部署,所以這一篇主要講如何對項目進行容器化以及如何部署,對我司業(yè)務分類以后可以有以下幾種類型: python應用 node.js應用 php應用 nginx服務 ...
摘要:基本入門前端掘金作者本文屬于翻譯文章,原文鏈接為。如果如何把應用放在容器中運行掘金本文適合零基礎,且希望使用運行應用的人士。后端掘金使用構(gòu)建網(wǎng)站。 nginx 基本入門 - 前端 - 掘金作者:villainthr 本文屬于翻譯文章,原文鏈接為 nginx Beginner’s Guide。是至今為止見過最好的 nginx 入門文章。額。。。沒有之一。 這篇教程簡單介紹了 nginx ...
摘要:數(shù)人云今天帶來的文章將分享如何用實現(xiàn)命令行程序的過程中整體思路以及需要注意哪些問題。月日,超越傳統(tǒng)運維之道的話題將在北京延續(xù),四位業(yè)界大牛技術(shù)齊聚,結(jié)合傳統(tǒng)運維現(xiàn)狀及實踐案例,講述的超越之道。 數(shù)人云今天帶來的文章將分享如何用Docker實現(xiàn)PHP命令行程序的CI/CD過程中整體思路以及需要注意哪些問題。 6月10日,《DevOps&SRE超越傳統(tǒng)運維之道》的話題將在北京延續(xù),四位業(yè)界...
閱讀 3492·2023-04-26 02:44
閱讀 1629·2021-11-25 09:43
閱讀 1519·2021-11-08 13:27
閱讀 1885·2021-09-09 09:33
閱讀 903·2019-08-30 15:53
閱讀 1765·2019-08-30 15:53
閱讀 2778·2019-08-30 15:53
閱讀 3109·2019-08-30 15:44