几周前, 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个部分讲解。

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链接,下图显示的就是我的一个应用程序!

边栏:我们使用-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 键,使他看起来像下面的这些:

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,并且我可以在浏览器中访问它们:

docker部署python web应用_在 Docker 中运行一个 Python 的 Web 应用相关推荐

  1. ipad python编程软件_在iPad中运行Python

    从一个喜欢编程的人的角度看,任何移动设备其实都只是"可编程计算器". iPad上也有一个Python的解释器的应用Python for iOS.不过,让人气愤的是,这个应用竟然是收 ...

  2. python unique函数_每30秒学会一个Python小技巧,GitHub星数4600+

    作者 | xiaoyu,数据爱好者来源 | Python数据科学(ID:PyDataScience)很多学习Python的朋友在项目实战中会遇到不少功能实现上的问题,有些问题并不是很难的问题,或者已经 ...

  3. python 生成可执行文件_在Cython中创建一个可执行文件

    你想要的是Cython编译器的–embed标志. 关于它没有大量的文档,但this是我能找到的.它确实链接到一个简单的工作示例. 要将Cython源代码编译为可以编译为可执行文件的C文件,可以使用cy ...

  4. 不属于python语言保留字_以下选项中,不属于Python保留字的是( )_学小易找答案...

    [判断题]用摆式仪测试摆值同一处平行测定不少于3次,3个测点间距2~5m.( ) [单选题]下面是单拍子的是 [填空题]假设列表对象 aList 的值为 [3,4,5,6,7,9,11,13,15,1 ...

  5. 写好的python如何在其它电脑上运行_如何在另一个文件中运行一个python文件?

    import importlib importlib.import_module('file.py') error: ModuleNotFoundError: No module named 'fil ...

  6. 爬虫python怎么下载_在网上下了一个 python 爬虫程序,怎么运行?

    第 1 条附言 · 2016-07-02 18:51:15 +08:00 我换 linux 环境现在可以运行了,运行$ python doubanSpider.py 后一直在下载,是什么意思额? /u ...

  7. python 帮助教师_花10分钟写一个Python脚本,搞定了初中老师一下午的工作

    有个朋友是一个初中老师.嗯,教学行政两手抓的那种初中老师. 一天晚上突然微信问我,怎么把图片转成PDF.懵了一下,这个直接打印成PDF不就可以了? 遂告诉他,结果感觉两个人不是一个世界的: 好不容易教 ...

  8. python爬虫英文单词_非常适合新手的一个Python爬虫项目:打造一个英文词汇量测试脚本...

    最近朋友在苦学英文,但是又不知道自己学的怎么样了,直到有一天,他找到了扇贝网,里面有个"评估你的单词量"功能非常的好,就推荐给我了! 今天我们就用python做一个小的爬虫,然后自 ...

  9. python句柄无效_作为Windows服务运行的Python:OSError:[WinError 6]句柄无效

    subprocess.py中的第1117行是: p2cread = _winapi.GetStdHandle(_winapi.STD_INPUT_HANDLE) 这让我怀疑服务流程没有与之关联的STD ...

最新文章

  1. Python 将字符串转为字典
  2. leetcode-93-复原ip地址
  3. 全面认识一下.NET 4.0的缓存功能
  4. 重磅!公开课|四旋翼飞行器:算法与实战
  5. linux服务器重启后阵列卡分区没了,服务器数据丢失了怎么恢复/分区丢失恢复教程...
  6. leetcode_median of two sorted arrays
  7. python计算组合数_Python实现的排列组合计算操作示例
  8. 物联网为电信运营商带来众多商业机会
  9. ubuntu下使用python将ppt转成图片_Ubuntu下使用Python实现游戏制作中的切分图片功能...
  10. FileItem类的常用方法
  11. 斐波那契数列(Fibonacci)递归和非递归实现
  12. 利用flashback database实现部分对象回滚
  13. speedoffice(PPT)插入的表格怎么合并单元格呢
  14. python 进化树_Biopython之系统发育树(进化树)的绘制
  15. Ubantu16.04.6下使用petalinux2020.1定制Linux系统
  16. 【盛天体育出品】天津仁爱学院“彩虹”运动场来了
  17. android app闪退的原因分析,打开一个app就闪退解决方法
  18. LLC谐振变换器原理及变频控制
  19. java随机点名器_Java实现简单随机点名器
  20. 拉东(Radon)变换

热门文章

  1. fatal error C1002: 在第2遍中编译器的堆空间不足
  2. 'utf-8' codec can't decode byte 0xd5 in position 0: invalid continuation byte
  3. iOS - Bundle 资源文件包
  4. 基于Java Swing的仪表盘实现
  5. 33 多线程同步之Condition
  6. 重装华为服务器系统软件,服务器系统重装软件
  7. centos6.4安装apache php mysql_CentOS6.4下apache+php的简易搭建
  8. python中io.textio_Python文件读写概述(IO操作、文件读写、stringiobytesio、序列化),python,的,小,总结,StringIOBytesIO...
  9. 如何将本地项目发布到gitee?
  10. asp.net接受表单验证格式后再提交数据_创建一个注册界面,并记录到数据库中...