摘要:接下來,我們來看一個更酷的工作流程,即通過引入來實現(xiàn)項目的持續(xù)集成。是一個持續(xù)集成發(fā)布平臺,支持對容器進(jìn)行測試。取消對的選中狀態(tài)。
借助Docker,我們可以更容易地進(jìn)行web應(yīng)用部署,而同時不必頭疼于項目依賴、環(huán)境變量以及各種配置問題,Docker可以快捷、高效地處理好這一切。
而這也是本教程所要實現(xiàn)的主要目的。
首先我們來學(xué)習(xí)使用Docker容器運行一個Python Flask應(yīng)用,然后逐步介紹一套更酷的開發(fā)流程,其中涵蓋了應(yīng)用的持續(xù)集成與發(fā)布…
我(Michael Herman)最初是在2015年2月8日的PyTennessee上介紹了這一工作流程,如果感興趣的話,你可以直接瀏覽我當(dāng)時使用的幻燈片。
流程在本地功能分支上完成應(yīng)用代碼。2. 在Github上發(fā)起一個到master分支的Pull Request。3. 在Docker容器上運行自動測試。4. 如果測試通過,手動將這個PR merge進(jìn)master分支。5. 一旦merge成功,再次運行自動測試。6. 如果第二次測試也通過,就在Docker Hub上對應(yīng)用進(jìn)行構(gòu)建。7. 一旦構(gòu)建完成,自動化地部署到生產(chǎn)環(huán)境。
本教程基于Mac OS X,在開始前需要保證以下工具已正確安裝配置:Python v2.7.9, Flask v0.10.1, Docker v1.4.1, Docker Compose, v1.0.0, boot2docker 1.4.1, Redis v2.8.19
好了,讓我們開始吧。
首先來介紹一些Docker中的基本概念:
Dockerfile中包括了一系列語句,用于對鏡像的行為進(jìn)行描述。
鏡像是一個模板,用來保存環(huán)境狀態(tài)并創(chuàng)建容器。
容器可以理解為實例化的鏡像,并會在其中運行一系列進(jìn)程。
如果對Dockerfile、鏡像和容器的具體細(xì)節(jié)感興趣,那么可以從Docker的官方文檔獲取更多詳細(xì)信息。
為什么是Docker?使用Docker意味著你能在開發(fā)機上完美地模擬生產(chǎn)環(huán)境,而不用再為任何由兩者環(huán)境、配置差異所造成的問題而擔(dān)心,除此之外Docker帶給我們的還有:
良好的版本控制。2. 隨時便捷地發(fā)布/重建整個開發(fā)環(huán)境。3. 一次構(gòu)建,隨處運行,就是這么神奇!
配置Docker由于Darwin(OS X內(nèi)核)缺少運行Docker容器的一些Linux內(nèi)核功能,所以我們需要借助boot2docker,一個用于運行Docker的輕量級Linux發(fā)行版(啟動一個專門為運行Docker定制過的小型虛擬機)。
首先為我們的Flask項目創(chuàng)建一個名為“fitter-happier-docker”的目錄。
接下來遵照官方文檔的步驟來完成Docker和boot2docker的安裝。
我們可以通過以下命令來驗證安裝是否正確:
$ boot2docker version
Boot2Docker-cli version: v1.4.1
Git commit: 43241cb
Docker Compose是官方提供的容器業(yè)務(wù)流程框架(譯注:曾經(jīng)的項目名稱是Fig,甚至在本譯文的初稿時依然是,進(jìn)化速度之快可見一斑),只需通過簡單的.yml配置文件,就能完成多個容器服務(wù)的構(gòu)建和運行。
使用pip來安裝Docker Compose,并通過如下命令來確認(rèn)安裝正確:
$ pip install docker-compose $ docker-compose --version docker-compose 1.1.0
現(xiàn)在來啟動我們的Flask+Redis應(yīng)用(你可以從這個repo來獲取項目的全部源代碼),首先在項目根目錄下新建docker-compose.yml文件:
web: build: web volumes: - web:/code ports: - "80:5000" links: - redis command: python app.py redis: image: redis:2.8.19 ports: - "6379:6379"
可以看到我們對項目所含兩個服務(wù)進(jìn)行的操作:
web:我們將在web目錄下進(jìn)行容器的構(gòu)建,并且將其作為Volume掛載到容器的/code目錄中,然后通過python app.py來啟動Flask應(yīng)用。最后將容器的5000端口暴露出來,并將其映射到主機的80端口上。2. redis:我們直接使用Docker Hub上的官方鏡像來提供所需的Redis服務(wù)支持,將6379端口暴露并映射到主機上。
你一定注意到了位于web目錄下的Dockerfile文件,它用于指導(dǎo)Docker如何構(gòu)建我們的應(yīng)用鏡像(基于Ubuntu),并且保證了完備的依賴支持。
構(gòu)建并運行接下來只需要一行簡單命令,就能輕松搞定一切(鏡像的構(gòu)建及容器的啟動運行):
Ubuntu $ docker-compose up
這會根據(jù)Dockerfile來構(gòu)建Flask應(yīng)用的鏡像,從官方倉庫拉取Redis鏡像,然后將一切運行起來。
現(xiàn)在你可以去喝一杯咖啡,呃,也許是兩杯:首次運行會花費相對較長的時間,事實上Docker會在構(gòu)建過程中,將Dockerfile中的每一步操作(更正式的說法應(yīng)該是layer)緩存下來,以后的構(gòu)建過程會因此提速很多,因為只有發(fā)生改變的步驟才會被重新執(zhí)行。
Docker Compose會并行地啟動全部容器,每個容器都會被分配各自的名字,并且會為日志設(shè)置可讀性更高的配色方案。
好了,那么準(zhǔn)備好來測試了嗎?
打開你的瀏覽器,輸入主機DOCKER_HOST環(huán)境變量所對應(yīng)的IP地址,例如在我這里是 http://192.168.59.103/ (運行boot2docker ip命令可以查詢到IP地址)。
接下來你應(yīng)該會在瀏覽器中看到以下文本“Hello! This page has been seen 1 times.”:
刷新頁面,如果一切正常的話,計數(shù)器變量應(yīng)該會進(jìn)行累加。
通過Ctrl-C來終止我們的應(yīng)用進(jìn)程,然后通過以下命令讓其改為在后臺運行:
$ docker-compose up -d
想查看應(yīng)用進(jìn)程的運行狀態(tài)?只需要輸入以下命令就可以了:
$ docker-compose ps Name Command State Ports -------------------------------------------------------------------------------------------------- fitterhappierdocker_redis_1 /entrypoint.sh redis-server Up 0.0.0.0:6379->6379/tcp fitterhappierdocker_web_1 python app.py Up 0.0.0.0:80->5000/tcp, 80/tcp
可以看到我們的兩個進(jìn)程運行在不同的容器中,而Docker Compose將它們組織在一起!
更進(jìn)一步在確定一切正常無誤后,使用docker-compose stop命令來終止我們的應(yīng)用,然后通過boot2docker down來安全地關(guān)閉虛擬機。接下來就可以向Git提交本地修改,并推送到Github了。
那么,我們剛才都完成了什么呢?
我們建立了本地環(huán)境,通過Dockerfile詳盡描述了如何構(gòu)建鏡像,并基于該鏡像啟動了相應(yīng)容器。我們使用Docker Compose來將這一切整合起來,包括構(gòu)建和容器之間的關(guān)聯(lián)、通信(在Flask和Redis進(jìn)程之間)。
接下來,我們來看一個更酷的工作流程,即通過引入CircleCI來實現(xiàn)項目的持續(xù)集成。
同樣的,你可以從此處獲取源代碼。
Docker Hub到目前為止我們已經(jīng)接觸過Dockerfile、鏡像以及容器(當(dāng)然,借助了Docker Compose的幫助)。
如果你很熟悉Git的工作流程,那么可以把Docker鏡像理解為Git的repo,而容器類似于該repo的clone,如果將這個比喻繼續(xù)類推下去,那么Docker Hub也就相當(dāng)于Github的地位了。
為了使用Docker Hub,你可以用Github賬號來完成注冊。2. 添加一個新的自動構(gòu)建,將剛才完成的項目repo加入進(jìn)來,一切按照默認(rèn)選項即可,除了將“Dockerfile Location”改為“/web”。
一旦添加完畢,Docker Hub會進(jìn)行一次初始化構(gòu)建,請確保一切正常。
Docker Hub和CIDocker Hub自身通過配置就可以充當(dāng)持續(xù)集成服務(wù),從而在每次推送Git提交后自動進(jìn)行構(gòu)建。
這意味著你不能直接將鏡像推送到(通過docker push)Docker Hub上。Docker Hub會自己從repo進(jìn)行拉取并構(gòu)建鏡像,從而保證整個過程中沒有錯誤。在你的工作流程中請銘記這一點,因為在Docker文檔中目前并沒有對此進(jìn)行詳細(xì)說明。
讓我們來試一下,加入以下測試用例:
self.assertNotEqual(four, 5)
提交并推送到Github,然后就可以看到Docker Hub如何開始一次新構(gòu)建了。
由于這是項目部署上線前的最后一道防線,我們當(dāng)然希望Docker Hub在構(gòu)建完成之前,能夠捕獲所有的錯誤和異常。另外,你肯定也希望能將自己的單元測試和集成測試加入到持續(xù)集成流程中, 而這正是CircleCI的用武之地。
CircleCICircleCI是一個持續(xù)集成/發(fā)布平臺,支持對Docker容器進(jìn)行測試。你只需提供一個Dockerfile,CircleCI會據(jù)此構(gòu)建鏡像,并啟動一個新容器,然后在其中運行你的測試。
還記得我們期望的工作流程嗎?鏈接
現(xiàn)在來看看如何完成它。
安裝CIrcleCI官方提供了很好的入門指導(dǎo)。
使用Github賬號完成注冊,然后將你的Github repo添加為一個新項目(成功后會收到郵件通知)。這會為該repo增加一個hook,每當(dāng)你向其推送新的提交時,都會觸發(fā)一次新的構(gòu)建。
接下來需要向我們的repo添加一個配置文件,用以指導(dǎo)CircleCI完成構(gòu)建。
circle.yml的文件內(nèi)容如下:
machine: services: - docker dependencies: override: - pip install -r requirements.txt test: override: - docker-compose run -d --no-deps web - python web/tests.py
實際上,我們構(gòu)建了一個新的鏡像,并啟動了一個新容器,然后進(jìn)行測試:首先檢查web應(yīng)用是否正常啟動運行,然后逐一進(jìn)行單元測試。
你應(yīng)該已經(jīng)注意到我們在這里使用了命令docker-compose run -d --no-deps web而不是docker-compose up來啟動應(yīng)用,這是因為CircleCI已經(jīng)集成了可用的Redis運行時環(huán)境,所以我們只需啟動web應(yīng)用進(jìn)程就可以了。
當(dāng)circle.yml文件修改完成,就可以推送到Github來啟動一次新構(gòu)建了。記住,這將同時在Docker Hub上啟動一次構(gòu)建。
一切正常?
在繼續(xù)下去之前,需要對工作流程進(jìn)行一些調(diào)整,因為我們通常不希望將提交直接推送到master分支上。
功能分支工作流程如果不太熟悉這一工作流程,那么可以從此處獲得準(zhǔn)確生動的解釋。
讓我們來快速瀏覽一個示例:
創(chuàng)建功能分支$ git checkout -b circle-test master Switched to a new branch "circle-test"
更新應(yīng)用
并在texts.py里增加一個新的斷言:
self.assertNotEqual(four, 6)
發(fā)起一個Pull Request
$ git add web/tests.py $ git commit -m "circle-test" $ git push origin circle-test
甚至在你真正發(fā)起PR之前,CircleCI就已經(jīng)啟動了構(gòu)建。在PR創(chuàng)建完畢后,只需等待CircleCI通過所有測試,我們就可以點擊Merge按鈕來合并入master分支了。一旦merge成功,Docker Hub就會觸發(fā)相應(yīng)的構(gòu)建過程。
重構(gòu)工作流程如果回到本文開頭的工作流程處,你會發(fā)現(xiàn)我們實際上希望Docker Hub在master分支上再次進(jìn)行測試后才啟動構(gòu)建,所以讓我們來對現(xiàn)有流程進(jìn)行以一些快速的調(diào)整:
打開你的Docker Hub倉庫,在Settings下選擇Automated Build。2. 取消對“When active we will build when new pushes occur”的選中狀態(tài)。3. 保存。4. 選擇位于Settings下的Build Triggers。5. 將status改為on。6. 復(fù)制以下curl命令:$ curl --data "build=true" -X POST https://registry.hub.docker.com/u/mjhea0/fitter-happier-docker/trigger/84957124-2b85-410d-b602-b48193853b66/
將以下代碼加入到circle.yml文件末尾:
deployment: hub: branch: master commands: - $DEPLOY
現(xiàn)在我們會在merge到master分支并通過測試之后,執(zhí)行$DEPLOY環(huán)境變量所代表的命令,我們需要將這個變量的值加入到CircleCi的環(huán)境變量中:
打開 Project Settings,選擇 Environment variables。2. 添加一個名為“Deploy”的新變量,并且將剛才復(fù)制的curl命令粘貼進(jìn)去作為該變量的值。
現(xiàn)在來檢驗一下成果:
$ git add circle.yml $ git commit -m "circle-test" $ git push origin circle-test
發(fā)起一個新的PR,一旦其通過CirecleCI測試,將其merge到master分支,這會觸發(fā)另一次構(gòu)建。一旦再次通過測試,之前設(shè)置的curl命令就會觸發(fā)Docker Hub去啟動一次新構(gòu)建,一切都很完美。
結(jié)論我們已經(jīng)跑通了這個基于CircleCI的持續(xù)集成工作流程(步驟1-6):
在本地功能分支上完成應(yīng)用代碼。2. 在Github上發(fā)起一個到master分支的Pull Request。3. 在Docker容器上運行自動測試。4. 如果測試通過,手動將這個PR merge進(jìn)master分支。5. 一旦merge成功,再次運行自動測試。6. 如果第二次測試也通過,就在Docker Hub上對應(yīng)用進(jìn)行構(gòu)建。7. 一旦構(gòu)建完成,自動化地部署到生產(chǎn)環(huán)境。
關(guān)于整個流程的最后一塊拼圖呢:及自動化地將應(yīng)用發(fā)布到盛傳環(huán)境(第7步),你可以在我的另一篇博客中得到答案。
翻譯自:https://realpython.com/blog/python/docker-in-action-fitter-happier-more-productive/
譯者:李明([email protected],https://github.com/hydRAnger )
原文:Docker實戰(zhàn):更輕松、更愉快、更高效
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/26381.html
摘要:分層存儲因為鏡像包含操作系統(tǒng)完整的文件系統(tǒng),其體積往往是龐大的,因此在設(shè)計時,就充分利用的技術(shù),將其設(shè)計為分層存儲的架構(gòu)。分層存儲的特征還使得鏡像的復(fù)用定制變的更為容易。 什么是Docker Docker 是一個開源的應(yīng)用容器引擎,基于 Go 語言 并遵從Apache2.0協(xié)議開源。Docker 可以讓開發(fā)者打包他們的應(yīng)用以及依賴包到一個輕量級、可移植的容器中,然后發(fā)布到任何流行的 L...
摘要:同樣地,也有命令可以刪除掛起的鏡像網(wǎng)絡(luò)和。命令提供整體磁盤使用率的概況,包括鏡像容器和本地。因此這條命令比命令更局限。鏡像新的鏡像命令也是子命令。筆者最愛的命令莫過于,讓環(huán)境一直保持干凈整齊。 Docker 1.13出來已經(jīng)有一段時間了,新版本添加了許多有用的命令,本文作者從處女座的潔癖(此處有霧)出發(fā),告訴大家一些整理環(huán)境的小技巧。打掃房間再也不需費時又費力了,簡單的命令,就可以輕松...
摘要:云幫能解決什么問題新一代企業(yè)平臺讓開發(fā)人員輕松地開發(fā)部署和運維應(yīng)用,讓架構(gòu)師和運營人員利用熟知和可靠技術(shù)打造一個受控的運行環(huán)境。有助于加速企業(yè)級應(yīng)用服務(wù)于市場,實現(xiàn)內(nèi)部資源的有效利用。 云幫是什么? 云幫 是一款基于容器技術(shù)的應(yīng)用管理平臺。社區(qū)版針對個人、企業(yè)完全免費,您可以自由的下載與傳播,但需要遵循我們的社區(qū)版協(xié)議。 云幫從哪里來? 云幫是 北京好雨科技有限公司 結(jié)合容器技術(shù)整合的...
摘要:整體基于的開發(fā),通過反代對外提供服務(wù),之前通過配置,已經(jīng)支持了協(xié)議,但是目前還不支持協(xié)議,于是只能想別的辦法。經(jīng)過一番谷歌再次感謝偉大的谷歌以后,發(fā)現(xiàn)了,一個新一代的服務(wù)器。目前對的支持還處于實驗性質(zhì),所以要開啟,要加上標(biāo)志。 最近HTTP-over-QUIC 協(xié)議被正式命名為 HTTP/3,協(xié)議帶來的最大改變是協(xié)議底層將采用UDP協(xié)議,而不再是TCP協(xié)議,這樣的好處嗎,就是更低時延,...
閱讀 949·2021-09-27 13:36
閱讀 905·2021-09-08 09:35
閱讀 1075·2021-08-12 13:25
閱讀 1447·2019-08-29 16:52
閱讀 2915·2019-08-29 15:12
閱讀 2736·2019-08-29 14:17
閱讀 2622·2019-08-26 13:57
閱讀 1021·2019-08-26 13:51