成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Docker 快速部署代碼之道

云計(jì)算
使用 Docker 面對(duì)的一個(gè)挑戰(zhàn)是,盡管我們只是對(duì)我們的代碼做了一個(gè)小小的變更,我們都必須要走一遍構(gòu)建一個(gè)新容器的過程,把它拉取(pull)到我們的服務(wù)器,并替代正在運(yùn)行的版本。

在 Ionic,我們是 Docker 的鐵桿粉絲。我們的代碼以及代碼的依賴全部運(yùn)行在 Docker 中,Docker 讓我們的產(chǎn)品更充分地利用計(jì)算資源,比如 Ionic Creator,以及即將到來的 Ionic.io 服務(wù)。

使用 Docker 面對(duì)的一個(gè)挑戰(zhàn)是,盡管我們只是對(duì)我們的代碼做了一個(gè)小小的變更,我們都必須要走一遍構(gòu)建一個(gè)新容器的過程,把它拉取(pull)到我們的服務(wù)器,并替代正在運(yùn)行的版本。

我們所有的代碼都存儲(chǔ)在 GitHub,使用 Docker Registry(這里推薦下國內(nèi)的 docker.cn,速度比官方的快很多,不用擔(dān)心“你懂的”問題) 來自動(dòng)構(gòu)建和存儲(chǔ)我們的代碼,并使用 Ansible 來管理和部署我們的容器到我們的服務(wù)器上。即使是一個(gè)完全自動(dòng)化的過程,部署一個(gè)小變更都可能需要花費(fèi)我們 20 分鐘或者更多的時(shí)間。經(jīng)過頭腦風(fēng)暴,我們意識(shí)到我們有一個(gè)更好的方法來利用 Docker。

在最初的容器構(gòu)建之后,99% 的變更都是純代碼。我們不需要添加任何依賴,或者是改變?nèi)魏未a運(yùn)行所必需的東西。Docker 實(shí)際上只是一種封裝基礎(chǔ)架構(gòu)的方式,要求我們的代碼運(yùn)行在一個(gè)自包含的包中。因?yàn)槲覀?99% 的變更都是代碼,不是基礎(chǔ)架構(gòu),我們意識(shí)我們不需要在每次變更的時(shí)候都努力重新構(gòu)建我們的基礎(chǔ)架構(gòu)。

讓我們解決這個(gè)問題的是 Docker 的殺手級(jí)特性 volumes。在我們 Docker files 的***次迭代中,我們從 GitHub 拉取代碼,并直接構(gòu)建進(jìn)容器中。現(xiàn)在,我們故意把代碼放在容器外面,并在容器啟動(dòng)的時(shí)候,通過加載一個(gè)主機(jī)卷(host volume) 來代替。當(dāng)我們想做一個(gè)新發(fā)布,Ansible 從 GitHub 上拉取 master 分支到我們服務(wù)器的 app 目錄。這時(shí),它通過檢查來確保相關(guān)聯(lián)的容器正在運(yùn)行,如果沒有在運(yùn)行,它將啟動(dòng)這個(gè)容器并把 app 代碼映射進(jìn)容器。

使得我們的工作更便捷的另外一個(gè)組件是 uWSGI,因?yàn)槲覀兊拇蟛糠?app 是 Python 的(Django),所以我們?cè)?Docker 容器中使用 uWSGI 提供服務(wù)。uWSGI 有一個(gè) touch reload 特性,可以監(jiān)控指定的文件,當(dāng)該文件被 touch 的時(shí)候,會(huì)重載 uWSGI 服務(wù)。在 Ansible 從 GitHub 拉取我們的變更之后,我們使用 Ansible 來 touch uwsgi.ini 文件,這會(huì)觸發(fā)正在運(yùn)行的容器中的 uWSGI 重載。我們就是這樣來運(yùn)行我們代碼的更新版本的!

這是什么意思呢?簡(jiǎn)單地說,花費(fèi)我們 20+ 分鐘的部署過程是這樣的:

  1. 提交(Commit)和 推送(push)變更到 GitHub。
  2. Docker Registry 拉取(pulls)變更和構(gòu)建一個(gè)新容器。
  3. Ansible 連接到我們的服務(wù)器并拉取(pulls)這個(gè)新容器 。
  4. Ansible 發(fā)現(xiàn)任何舊容器正在運(yùn)行的實(shí)例并停止它們。
  5. Ansible 啟動(dòng)該容器的新實(shí)例。

類似的 10 秒的過程是這樣的:

  1. 提交(Commit)和 推送(push)變更到 GitHub。
  2. Ansible 連接到我們的服務(wù)器,從 GitHub 拉取***的 master。
  3. Ansible touches 該 app 的 uwsgi.ini 文件來觸發(fā) UWSGI 的重載。

步驟分解

 

 

Supervisor / uWSGI

我們?cè)?Docker 容器中使用 Supervisor 來啟動(dòng)容器中的進(jìn)程運(yùn)行。我們的 supervisord.conf 文件看起來像下面這樣:

  1. [supervisord] nodaemon=true 
  2. [program:uwsgi] 
  3. command = /usr/local/bin/uwsgi --touch-reload=/path/to/code/in/container/uwsgi.ini --ini /path/to/code/in/container/uwsgi.ini 

我們通過 --touch-reload 選項(xiàng)來把 uwsgi.ini 文件作為觸發(fā)文件。

Docker

當(dāng)我們啟動(dòng)我們的容器,我們添加一個(gè)包含我們 app 代碼的主機(jī)卷(host volume),該主機(jī)卷被映射到容器中的一個(gè) app 路徑,uWSGI 將從這個(gè)路徑加載 app。

  1. docker run -d -P -v /path/to/code/on/host:/path/to/code/in/container --name=container_name driftyco/testapp 

Ansible

Ansible 負(fù)責(zé)從 GitHub 克隆(clone)我們應(yīng)用程序的代碼到我們主機(jī)的 app 目錄,確保 Docker 容器正在運(yùn)行以及 touch 配置的 uWSGI touch-reload 文件。我們已經(jīng)創(chuàng)建了 playbooks 來直接部署我們的每個(gè)服務(wù),因此部署僅僅是一個(gè)運(yùn)行正確的問題。

對(duì)于一個(gè)快速代碼部署,我們運(yùn)行一個(gè)包含這些任務(wù)的 playbook,并只需要幾秒來運(yùn)行:

  1. - set_fact: host_volume="/path/to/code/on/host" - name: Git pull the latest code 
  2. git: repo=git@github.com:{{ org }}/{{ container }}.git 對(duì)于一個(gè)全量部署,我們按順序運(yùn)行這兩個(gè) playbooks;這是非常簡(jiǎn)單的。

    總結(jié)
    因?yàn)?Docker 主要的一個(gè)方式是封裝基礎(chǔ)架構(gòu)到一個(gè)自包含的,可部署的包。這不需要重新構(gòu)建整個(gè)容器僅僅只是為了幾個(gè)代碼變更。通過在 Docker 中利用卷(volumes),我們從容器中移除了代碼,使得代碼能獨(dú)立于容器更新。***,我們可以使用 UWSGI 的 touch reload 特性在容器中重啟 UWSGI,并從卷(volume)中加載更新的代碼。

    注:本文作者是 Joel Weirauch,本文原文是 Fast code deployments with Docker

  3. dest={{ host_volume }} 
  4. accept_hostkey=yes 
  5. force=yes 
  6. - name: Gracefully reload uwsgi 
  7. file: path={{ touch_file }} state=touch 

如果我們需要重啟整個(gè)容器或者是更新我們的系統(tǒng)包,我們可以做一個(gè)容器部署,這將花費(fèi)幾分鐘,使用這些任務(wù):

  1. - name: Add app dir if it doesn't yet exist file: path={{ host_volume }} owner=nobody group=docker recurse=yes state=directory 
  2. sudo: yes 
  3. - name: Pull Docker image 
  4. command: "{{ item }}" 
  5. ignore_errors: yes 
  6. with_items: 
  7. - docker pull {{ org }}/{{ container }} 
  8. - docker stop {{ container }} 
  9. - docker rm {{ container }} 
  10. - name: Run Docker image with app volumes 
  11. command: docker run -d -P -v {{ host_volume }}:{{ container_volume }} --name={{ container }} {{ extra_params }} {{ org }}/{{ container }} 

對(duì)于一個(gè)全量部署,我們按順序運(yùn)行這兩個(gè) playbooks;這是非常簡(jiǎn)單的。

總結(jié)

因?yàn)?Docker 主要的一個(gè)方式是封裝基礎(chǔ)架構(gòu)到一個(gè)自包含的,可部署的包。這不需要重新構(gòu)建整個(gè)容器僅僅只是為了幾個(gè)代碼變更。通過在 Docker 中利用卷(volumes),我們從容器中移除了代碼,使得代碼能獨(dú)立于容器更新。***,我們可以使用 UWSGI 的 touch reload 特性在容器中重啟 UWSGI,并從卷(volume)中加載更新的代碼。

:本文作者是 Joel Weirauch,原文地址:http://ionicframework.com/blog/docker-hot-code-deploys/

本文出自:http://dockerone.com/article/86

責(zé)任編輯:Ophira 來源: dockerone
相關(guān)推薦

2024-10-28 15:40:26

2020-10-30 10:49:37

DockerGPULinux

2012-08-01 09:38:17

代碼整潔

2024-03-26 00:00:01

2024-01-04 07:39:53

LinuxCentOS 8Docker

2013-04-08 10:11:27

2022-08-31 12:15:09

JavaScript代碼優(yōu)化

2012-08-01 09:23:31

代碼

2021-01-06 14:42:09

前端Typescript代碼

2014-09-12 14:50:07

運(yùn)維Docker

2024-01-10 14:24:32

Docker容器Kafka

2021-03-07 09:19:31

React代碼整潔代碼的實(shí)踐

2023-09-26 07:34:24

Docker部署依賴包

2023-04-06 07:18:14

2023-06-26 00:07:14

2023-05-29 07:39:49

2023-05-14 23:30:38

PrestoHadoop函數(shù)

2023-11-27 00:18:38

2025-05-22 10:00:00

DockerRedis容器

2017-10-24 15:28:27

PHP代碼簡(jiǎn)潔SOLID原則
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

主站蜘蛛池模板: 日韩欧美在 | 成人高清视频在线观看 | 久久久久国产成人精品亚洲午夜 | 亚洲一区在线播放 | 日韩中文字幕在线不卡 | 国产不卡一区在线观看 | 亚洲欧美精品国产一级在线 | 中国大陆高清aⅴ毛片 | 日本三级全黄三级三级三级口周 | 国产精品www | 国产成人精品久久二区二区91 | 99re视频在线观看 | 精品伊人久久 | 妖精视频一区二区三区 | 久久国产成人 | 久久人人网 | 黄色一级毛片免费看 | 日本网站免费在线观看 | av黄色免费 | 欧美国产日韩在线观看 | 午夜精品久久久久久久 | 欧美jizzhd精品欧美巨大免费 | 黄色一级视频免费 | 亚洲另类自拍 | 亚洲精品视频免费 | 综合二区 | 国产91色在线 | 亚洲 | 一级大片网站 | 欧美日韩电影一区二区 | 欧美激情视频一区二区三区免费 | 久久久久国产一区二区三区 | 一区二区三区韩国 | 国产欧美一区二区精品忘忧草 | 国精品一区二区 | 天天操妹子| 亚洲一区二区在线免费观看 | 精品国产乱码久久久久久88av | 久久精品这里 | 国产高清视频一区二区 | 亚洲第一女人av | 亚洲成人一区 |