在Docker中运行一个Python的Web应用

开发 后端 前端
几周前, Elastic Beanstalk声明在AWS云中配置和管理Docker容器。在本文中,我们通过一个简单的注册表单页面应用去理解Docker部署过程,该表单使用Elastic Beanstalk Python环境。

几周前, 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上克隆源代码:

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

通过查看目录内容,知道这是一个简单的Python应用,使用Flask框架,Boto和一些其他的依赖(在requirements.txt中声明了该依赖),其中Boto用于DynamoDB和SNS的互动。

足够简单,以至于我们只需创建一个Dockerfile,构建一个适用于运行该应用的镜像。Dockerfile和其他应用源均放在目录中(即,和requirements.txt, application.py等等放在一块)。

  1. FROM ubuntu:12.10 
  2.  
  3. # Install Python Setuptools  
  4. RUN apt-get install -y python-setuptools  
  5.  
  6. # Install pip  
  7. RUN easy_install pip  
  8.  
  9. # Add and install Python modules  
  10. ADD requirements.txt /src/requirements.txt  
  11. RUN cd /src; pip install -r requirements.txt  
  12.  
  13. # Bundle app source  
  14. ADD . /src  
  15.  
  16. # Expose  
  17. EXPOSE  5000 
  18.  
  19. # Run  
  20. CMD ["python""/src/application.py"]  

Docker化阶段 2 :在本地测试

虽然这个应用程序需要一个DynamoDB表和SNS主题来完成全部功能,不过我可以但没有测试它们: 

首先, 构建 Docker 镜像:

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

最后 (直接到可以使用后!),通过构建好的image运行一个container (映射 container 的5000端口到主机的8080端口, 并且按照下面的代码设置一些环境变量):

  1. $> docker run -d \  
  2.      -e APP_CONFIG=application.config.example \  
  3.      -e AWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID \  
  4.      -e AWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY \  
  5.      -p 8080:5000 \  
  6.      eb-py-sample  

在 OS X上,我打开 http://localhost:8080链接,下图显示的就是我的一个应用程序!

 

边栏:我们使用-e选项来传递一些选项: 

  1. APP_CONFIG: 这个程序使用这个选项加载指向)它的配置文件. 默认我们指定一个默认的配置文件。 你可以创建一个 DynamoDB 表和SNS 主题并且将他们添加到这个配置文件中,以使你的应用程序在本地开发的时候可以更完美的工作。
  2. 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 键,使他看起来像下面的这些:

  1. files:  
  2.   "/var/app/app.config":  
  3.     mode: "000444" 
  4.     content: |  
  5.       AWS_REGION = '`{ "Ref" : "AWS::Region"}`' 
  6.       STARTUP_SIGNUP_TABLE = '`{ "Ref" : "StartupSignupsTable"}`' 
  7.       NEW_SIGNUP_TOPIC = '`{ "Ref" : "NewSignupTopic"}`' 

修改 option_settings ,删除静态文件映射。使他看起来像下面的这些:

  1. option_settings:  
  2.   "aws:elasticbeanstalk:customoption":  
  3.      "AlarmEmail" : "nobody@amazon.com" 
  4.   "aws:elasticbeanstalk:application:environment":  
  5.     "APP_CONFIG""/var/app/app.config" 
  6.     "FLASK_DEBUG""false" 
  7.     "THEME""flatly" 

检查一下setup.config文件,确认前面的所有变化是否正确,或者可以参考托管在GitHub上的setup.config

Docker化阶段4: 部署到Elastic Beanstalk

我已经建立并测试了我的本地容器,移除了一些.ebextensions,它是特定的Elastic Beanstalk Python环境,我已经信心满满地准备部署它了!

我创建了一个文件,名字叫做Dockerrun.aws.json,与此类似,我创建了Dockerfile。这个文件将会告诉Elastic Beanstalk 怎么去运行Docker容器并且它看起来像是这样的(这个文件的详细信息,请参阅下方)。

  1. {  
  2.   "AWSEBDockerrunVersion""1",  
  3.   "Volumes": [  
  4.     {  
  5.       "ContainerDirectory""/var/app",  
  6.       "HostDirectory""/var/app" 
  7.     }  
  8.   ],  
  9.   "Logging""/var/eb_log" 
  10. }  

关于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 资源管理器来打包):

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

之后,我通过 Elastic Beanstalk Management Console 来部署生成后的zip包

当我的环境通过之后,我可以访问它,确保它可以正常工作:

 

我还保存了环境日志的快照:

[[113292]]

由于我之前往Dockerrun.aws.json文件中添加了Logging 成员,所以,容器中输出到/var/eb_log中的日志可以被定向到S3,并且我可以在浏览器中访问它们:

 

接下来

在下一篇文章中,我将会使用 eb 命令行工具直接在命令行中部署这个Dockerized程序,不需要浏览器或管理控制台!

相关资源

英文原文:Dockerizing a Python Web App

译文链接:http://www.oschina.net/translate/dockerizing-a-python-web-app

责任编辑:林师授 来源: 开源中国社区 编译
相关推荐

2014-11-25 14:04:59

DockerDocker Nodeweb应用部署

2015-02-06 11:04:10

DockerAWS移动应用开发测试

2021-07-31 12:58:53

PodmanLinux虚拟机

2023-05-10 08:05:41

GoWeb应用

2014-10-15 11:01:02

Web应用测试应用

2020-10-11 20:54:39

Python开发Docker

2021-09-12 12:00:12

浏览器LinuxWeb 应用

2011-05-18 16:02:08

XML

2009-02-03 10:19:45

2020-11-20 10:50:01

Docker容器

2011-03-10 10:45:47

Azure“Hello Worl

2021-07-30 20:25:04

pipxPython编程语言

2017-06-08 15:53:38

PythonWeb框架

2015-01-20 13:46:31

Java EEDockerDocker部署

2020-09-29 07:24:14

Python字典数据

2011-11-21 18:19:20

Web iMC

2021-08-28 10:06:29

VueJavascript应用

2013-05-13 09:31:29

Web App开发WebApp

2023-09-15 10:10:05

R 语言

2022-02-10 22:34:51

对象JVM收集器
点赞
收藏

51CTO技术栈公众号