在Docker上開始部署Python應用的教程

來源:互聯網
上載者:User
幾周前, Elastic Beanstalk聲明在AWS雲中配置和管理Docker容器。在本文中,我們通過一個簡單的註冊表單頁面應用去理解Docker部署過程,該表單使用Elastic Beanstalk Python環境。
關於註冊表單應用

幾個月之前,我們就已經開發完這個應用並且發表在部落格上。有4部分視頻和一篇文章“Using DynamoDB and SNS with Elastic Beanstalk in any Supported AWS Region”。今天,我們將在這部分內容之上進一步的開發和討論我們怎樣部署在在Docker和Elastic Beanstalk環境中。本文將分成4個部分講解。
參考資源

原始的Python應用(非Docker化)原始碼託管在GitHub上(master版本),網址為https://github.com/awslabs/eb-py-flask-signup/tree/docker。Docker化的版本在docker版本中,網址為:https://github.com/awslabs/eb-py-flask-signup/tree/docker

如果你喜歡代碼和不同版本間的比對,你可利用GitHub對比功能查看兩個版本的區別。網址為https://github.com/awslabs/eb-py-flask-signup/compare/master...docker。你也可以查看Docker化後添加的每個檔案或者每行代碼。


Docker化階段1:添加Dockerfile檔案

首先從GitHub上複製原始碼:

$> git clone git@github.com:awslabs/eb-py-flask-signup.git$> cd eb-py-flask-signup$> git checkout master

通過查看目錄內容,知道這是一個簡單的Python應用,使用Flask架構,Boto和一些其他的依賴(在requirements.txt中聲明了該依賴),其中Boto用於DynamoDB和SNS的互動。

足夠簡單,以至於我們只需建立一個Dockerfile,構建一個適用於運行該應用的鏡像。Dockerfile和其他應用源均放在目錄中(即,和requirements.txt, application.py等等放在一塊)。


FROM ubuntu:12.10 # Install Python SetuptoolsRUN apt-get install -y python-setuptools # Install pipRUN easy_install pip # Add and install Python modulesADD requirements.txt /src/requirements.txtRUN cd /src; pip install -r requirements.txt # Bundle app sourceADD . /src # ExposeEXPOSE 5000 # RunCMD ["python", "/src/application.py"]

Docker化階段 2 :在本地測試

雖然這個應用程式需要一個DynamoDB表和SNS主題來完成全部功能,不過我可以但沒有測試它們:

首先, 構建 Docker 鏡像:


$> docker build -t eb-py-sample .

最後 (直接到可以使用後!),通過構建好的image運行一個container (映射 container 的5000連接埠到主機的8080連接埠, 並且按照下面的代碼設定一些環境變數):

$> docker run -d \   -e APP_CONFIG=application.config.example \   -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \   -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \   -p 8080:5000 \   eb-py-sample

在 OS X上,我開啟 http://localhost:8080連結,顯示的就是我的一個應用程式!


複製代碼 代碼如下:

側邊欄:我們使用-e選項來傳遞一些選項:

  • APP_CONFIG: 這個程式使用這個選項載入(指向)它的設定檔. 預設我們指定一個預設的設定檔。 你可以建立一個 DynamoDB 表和SNS 主題並且將他們添加到這個設定檔中,以使你的應用程式在本地開發的時候可以更完美的工作。
  • AWS_ACCESS_KEY_ID 和 AWS_SECRET_ACCESS_KEY: 這個應用程式使用 Boto 來串連 DynamoDB 和SNS, 並且 Boto 使用這些環境變數來認證請求以上服務。這些設定僅僅是為了本地開發。 當我們向 Elastic Beanstalk 部署時將使用統一身份和存取控制方案(IAM) 角色(Roles)。

Docker 化階段 3: 修改 .ebextensions

我們的應用程式擁有一個特殊的檔案夾 .ebextensions,裡面有個 setup.config 檔案。我們使用這個檔案通知來 Elastic Beanstalk 建立我們程式所需要的 DynamoDB 表和 SNS 主題, 同時他會建立一個設定檔 /var/app/app.config ,這個檔案包含了我們剛才建立的 DynamoDB 表和 SNS 主題的名字。

這個檔案中還有一些特殊的地方是他擁有特殊的在 Elastic Beanstalk(相對於 Docker)中的 Python的環境類型(python版本?) ,我們需要把他們移除掉:

修改 files 的成員,並且移除掉 owner 和 group 鍵,使他看起來像下面的這些:


files: "/var/app/app.config":  mode: "000444"  content: |   AWS_REGION = '`{ "Ref" : "AWS::Region"}`'   STARTUP_SIGNUP_TABLE = '`{ "Ref" : "StartupSignupsTable"}`'   NEW_SIGNUP_TOPIC = '`{ "Ref" : "NewSignupTopic"}`'

修改 option_settings ,刪除靜態檔案對應。使他看起來像下面的這些:

option_settings: "aws:elasticbeanstalk:customoption":   "AlarmEmail" : "nobody@amazon.com" "aws:elasticbeanstalk:application:environment":  "APP_CONFIG": "/var/app/app.config"  "FLASK_DEBUG": "false"  "THEME": "flatly"

檢查一下setup.config檔案,確認前面的所有變化是否正確,或者可以參考託管在在GitHub上的setup.config。

Docker化階段4: 部署到Elastic Beanstalk

我已經建立並測試了我的本地容器,移除了一些.ebextensions,它是特定的Elastic Beanstalk Python環境,我已經信心滿滿地準備部署它了!

我建立了一個檔案,名字叫做Dockerrun.aws.json,與此類似,我建立了Dockerfile。這個檔案將會告訴Elastic Beanstalk 怎麼去運行Docker容器並且它看起來像是這樣的(這個檔案的詳細資料,請參閱下方)。


 {  "AWSEBDockerrunVersion": "1",  "Volumes": [   {    "ContainerDirectory": "/var/app",    "HostDirectory": "/var/app"   }  ],  "Logging": "/var/eb_log" }

關於Dockerrun.aws.json

Volumes成員將會在EC2上映射/var/app執行個體到容器上的/var/app。Docker容器通過訪問app.config檔案並通過建立.ebextensions/setup.config得以讓app在容器上運行。Logging成員告訴Elastic Beanstalk我們的Docker app將會記錄日誌到/var/eb_log到容器中。在控制台裡,無論什麼時候你點擊Snapshot Logs或者如果你啟用自動日誌輪轉,Beanstalk將會自動推送日誌/var/eb_log到這個目錄。


我將提交我的修改,並且使用 git archive 來產生一個zip檔案以便部署到Elastic Beanstalk上(你可以使用zip工具、Finder或Windows 資源管理員來打包):

$> git add Docker* && git commit -am "Dockerized"$> git archive --format=zip HEAD > eb-py-flask-signup.zip

之後,我通過 Elastic Beanstalk Management Console 來部署產生後的zip包

當我的環境通過之後,我可以訪問它,確保它可以正常工作:

我還儲存了環境日誌的快照:

由於我之前往Dockerrun.aws.json檔案中添加了Logging 成員,所以,容器中輸出到/var/eb_log中的日誌可以被定向到S3,並且我可以在瀏覽器中訪問它們:

  • 聯繫我們

    該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

    如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

    A Free Trial That Lets You Build Big!

    Start building with 50+ products and up to 12 months usage for Elastic Compute Service

    • Sales Support

      1 on 1 presale consultation

    • After-Sales Support

      24/7 Technical Support 6 Free Tickets per Quarter Faster Response

    • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.