在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中的select模块
Apr 23 Python
利用python实现简单的邮件发送客户端示例
Dec 23 Python
用Python将mysql数据导出成json的方法
Aug 21 Python
详解python中的time和datetime的常用方法
Jul 08 Python
解决win7操作系统Python3.7.1安装后启动提示缺少.dll文件问题
Jul 15 Python
给你一面国旗 教你用python画中国国旗
Sep 24 Python
Python 装饰器@,对函数进行功能扩展操作示例【开闭原则】
Oct 17 Python
tensorflow 查看梯度方式
Feb 04 Python
TensorFlow加载模型时出错的解决方式
Feb 06 Python
PyCharm永久激活方式(推荐)
Sep 22 Python
python框架flask入门之路由及简单实现方法
Jun 07 Python
Python Selenium破解滑块验证码最新版(GEETEST95%以上通过率)
Jan 29 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数据库连接
2006/10/09 PHP
php数组对百万数据进行排除重复数据的实现代码
2010/06/08 PHP
php中cookie实现二级域名可访问操作的方法
2014/11/11 PHP
使用PHP Socket 编程模拟Http post和get请求
2014/11/25 PHP
JavaScript在IE和Firefox浏览器下的7个差异兼容写法小结
2010/06/18 Javascript
jQuery 自定义函数写法分享
2012/03/30 Javascript
jquery js 获取时间差、时间格式具体代码
2013/06/05 Javascript
javascript去除空格方法小结
2015/05/21 Javascript
JS正则表达式之非捕获分组用法实例分析
2016/12/28 Javascript
JavaScript判断输入是否为数字类型的方法总结
2017/09/28 Javascript
jquery 输入框查找关键字并提亮颜色的实例代码
2018/01/23 jQuery
NodeJS实现不可逆加密与密码密文保存的方法
2018/03/16 NodeJs
vue+vant-UI框架实现购物车的复选框全选和反选功能
2019/11/05 Javascript
[03:22]DAC最前线(第二期)—DOTA2亚洲邀请赛主赛场周边及线路探访
2015/01/24 DOTA
python解析xml文件实例分享
2013/12/04 Python
跟老齐学Python之有容乃大的list(1)
2014/09/14 Python
详解Python中内置的NotImplemented类型的用法
2015/03/31 Python
Python实现遍历数据库并获取key的值
2015/05/17 Python
python使用Image处理图片常用技巧分析
2015/06/01 Python
python中map()函数的使用方法示例
2017/09/29 Python
Tensorflow实现卷积神经网络用于人脸关键点识别
2018/03/05 Python
搞定这套Python爬虫面试题(面试会so easy)
2019/04/03 Python
Python 实现Image和Ndarray互相转换
2020/02/19 Python
python实现飞机大战项目
2020/03/11 Python
Python读取ini配置文件传参的简单示例
2021/01/05 Python
Top Villas美国:豪华别墅出租和度假屋
2018/07/10 全球购物
工厂厂长岗位职责
2013/11/08 职场文书
婚礼证婚人证婚词
2014/01/13 职场文书
职业生涯规划书前言
2014/04/15 职场文书
市委常委班子党的群众路线教育实践活动整改措施
2014/10/02 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
MySQL Threads_running飙升与慢查询的相关问题解决
2021/05/08 MySQL
使用Djongo模块在Django中使用MongoDB数据库
2021/06/20 Python
IDEA使用SpringAssistant插件创建SpringCloud项目
2021/06/23 Java/Android
一文了解JavaScript用Element Traversal新属性遍历子元素
2021/11/27 Javascript
Python可视化学习之matplotlib内置单颜色
2022/02/24 Python