国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Docker 快速部署代碼之道

魏憲會 / 2153人閱讀

摘要:在最初的容器構(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/testapp
Ansible

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

相關(guān)文章

  • Docker 快速部署代碼之道

    摘要:在最初的容器構(gòu)建之后,的變更是純代碼。發(fā)現(xiàn)任何舊容器正在運行的實例并停止它們。我們已經(jīng)創(chuàng)建了來直接部署我們的每個服務,因此部署僅僅是一個運行正確的問題。總結(jié)因為主要的一個方式是封裝基礎架構(gòu)到一個自包含的,可部署的包。 在 Ionic,我們是 Docker 的鐵桿粉絲。我們的代碼以及代碼的依賴全部運行在 Docker 中,Docker 讓我們的產(chǎn)品更充分地利用計算資源,比如 Ionic ...

    shengguo 評論0 收藏0
  • 企業(yè)互聯(lián)網(wǎng)應用高性能解決之道

    摘要:本文介紹了企業(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)...

    Alan 評論0 收藏0
  • container-as-a-service-0x02 -- 項目構(gòu)建&部署之道

    container-as-a-service-0x02 -- 項目構(gòu)建&部署之道 By 蘇依蜀黍 . 2016.06.08 分析 之前寫了兩篇,算是比較完善的稱述了就目前的業(yè)務,容器服務在我司的應用,但是沒有比較具體的講如何構(gòu)建以及部署,所以這一篇主要講如何對項目進行容器化以及如何部署,對我司業(yè)務分類以后可以有以下幾種類型: python應用 node.js應用 php應用 nginx服務 ...

    arashicage 評論0 收藏0
  • 服務器部署工具 - 收藏集 - 掘金

    摘要:基本入門前端掘金作者本文屬于翻譯文章,原文鏈接為。如果如何把應用放在容器中運行掘金本文適合零基礎,且希望使用運行應用的人士。后端掘金使用構(gòu)建網(wǎng)站。 nginx 基本入門 - 前端 - 掘金作者:villainthr 本文屬于翻譯文章,原文鏈接為 nginx Beginner’s Guide。是至今為止見過最好的 nginx 入門文章。額。。。沒有之一。 這篇教程簡單介紹了 nginx ...

    Shonim 評論0 收藏0
  • 如何用 Docker 實現(xiàn) PHP 命令行程序的 CI/CD

    摘要:數(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è)界...

    Pink 評論0 收藏0

發(fā)表評論

0條評論

最新活動
閱讀需要支付1元查看
<