在Docker上开始部署Python应用的教程


Posted in Python onApril 17, 2015

几周前, 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 Setuptools
RUN apt-get install -y python-setuptools
 
# Install pip
RUN easy_install pip
 
# Add and install Python modules
ADD requirements.txt /src/requirements.txt
RUN cd /src; pip install -r requirements.txt
 
# Bundle app source
ADD . /src
 
# Expose
EXPOSE 5000
 
# Run
CMD ["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链接,下图显示的就是我的一个应用程序!

在Docker上开始部署Python应用的教程

   

边栏:我们使用-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包

在Docker上开始部署Python应用的教程

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

在Docker上开始部署Python应用的教程

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

在Docker上开始部署Python应用的教程

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

在Docker上开始部署Python应用的教程

Python 相关文章推荐
Python实现Sqlite将字段当做索引进行查询的方法
Jul 21 Python
浅谈Python 的枚举 Enum
Jun 12 Python
python的unittest测试类代码实例
Dec 07 Python
python MySQLdb使用教程详解
Mar 20 Python
Python queue队列原理与应用案例分析
Sep 27 Python
基于python操作ES实例详解
Nov 16 Python
Pytorch实现的手写数字mnist识别功能完整示例
Dec 13 Python
python3实现从kafka获取数据,并解析为json格式,写入到mysql中
Dec 23 Python
python和pywin32实现窗口查找、遍历和点击的示例代码
Apr 01 Python
使用OpenCV对车道进行实时检测的实现示例代码
Jun 19 Python
基于Python和C++实现删除链表的节点
Jul 06 Python
Python中第三方库Faker的使用详解
Apr 02 Python
使用Python装饰器在Django框架下去除冗余代码的教程
Apr 16 #Python
在服务器端实现无间断部署Python应用的教程
Apr 16 #Python
使用Protocol Buffers的C语言拓展提速Python程序的示例
Apr 16 #Python
使用Python编写一个模仿CPU工作的程序
Apr 16 #Python
利用Python中的mock库对Python代码进行模拟测试
Apr 16 #Python
使用Python脚本来控制Windows Azure的简单教程
Apr 16 #Python
在Python下利用OpenCV来旋转图像的教程
Apr 16 #Python
You might like
php mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
使用淘宝IP库获取用户ip地理位置
2013/10/27 PHP
php中sql注入漏洞示例 sql注入漏洞修复
2014/01/24 PHP
php计算当前程序执行时间示例
2014/04/24 PHP
php封装单文件上传到数据库(路径)
2017/10/15 PHP
mac pecl 安装php7.1扩展教程
2019/10/17 PHP
抛弃Nginx使用nodejs做反向代理服务器
2014/07/17 NodeJs
jquery插件Jplayer使用方法简析
2016/04/22 Javascript
基于Bootstrap使用jQuery实现简单可编辑表格
2016/05/04 Javascript
js实现精确到毫秒的倒计时效果
2016/08/05 Javascript
移动端点击图片放大特效PhotoSwipe.js插件实现
2016/08/25 Javascript
javaScript中定义类或对象的五种方式总结
2016/12/04 Javascript
浅析上传头像示例及其注意事项
2016/12/14 Javascript
详解用原生JavaScript实现jQuery的某些简单功能
2016/12/19 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
js获取css的各种样式并且设置他们的方法
2017/08/22 Javascript
微信小程序中添加客服按钮contact-button功能
2018/04/27 Javascript
Vue数据绑定简析小结
2019/05/07 Javascript
详解js根据百度地图提供经纬度计算两点距离
2019/05/13 Javascript
基于html+css+js实现简易计算器代码实例
2020/02/28 Javascript
Angular5整合富文本编辑器TinyMCE的方法(汉化+上传)
2020/05/26 Javascript
[05:20]卡尔工作室_DOTA2新手教学_DOTA2超强新手功能
2013/04/22 DOTA
[01:37]全新的一集《真视界》——TI7总决赛
2017/09/21 DOTA
python pandas中对Series数据进行轴向连接的实例
2018/06/08 Python
selenium使用chrome浏览器测试(附chromedriver与chrome的对应关系表)
2018/11/29 Python
Python3实现爬取简书首页文章标题和文章链接的方法【测试可用】
2018/12/11 Python
对Python的zip函数妙用,旋转矩阵详解
2018/12/13 Python
浅析python内置模块collections
2019/11/15 Python
python异常处理和日志处理方式
2019/12/24 Python
python实现一个猜拳游戏
2020/04/05 Python
基于Python的自媒体小助手---登录页面的实现代码
2020/06/29 Python
关于老式浏览器兼容HTML5和CSS3的问题
2016/06/01 HTML / CSS
实践单位评语
2014/04/26 职场文书
中文专业毕业生自荐信
2014/05/24 职场文书
工作经历证明书范文
2014/11/02 职场文书
JavaScript中的LHS和RHS分析详情
2022/04/06 Javascript