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

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

时间: 2024-10-22 00:28:25

在 Docker 中运行一个 Python 的 Web 应用的相关文章

python实现在每个独立进程中运行一个函数的方法_python

本文实例讲述了python实现在每个独立进程中运行一个函数的方法.分享给大家供大家参考.具体分析如下: 这个简单的函数可以同于在单独的进程中运行另外一个函数,这对于释放内存资源非常有用 #!/usr/bin/env python from __future__ import with_statement import os, cPickle def run_in_separate_process(func, *args, **kwds): pread, pwrite = os.pipe() pi

使用NetBeans IDE创建并运行一个简单的web应用程序

在本教程中,您将使用 NetBeans IDE 创建并运行一个简单的 web 应用程序,Hello Web.本示例应用程序要求您输入一个名字,之后使用那个名字显示一条信息.首先,您需要使用一个输入框来实现这个页面.之后您使用一个用户可以选择名字的下拉列表来替换那个输入框.下拉列表中输入的名字来自数据库表. 本教程需要以下技术以及资源的支持 JavaServer Faces 组件/Java EE 平台 1.2 with Java EE 5*1.1 with J2EE 1.4 Travel 数据库

利用 Spring Boot 在 Docker 中运行 Hadoop

本文讲的是利用 Spring Boot 在 Docker 中运行 Hadoop,[编者的话]Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程.本文介绍了如何利用Spring Boot在Docker中运行Hadoop任务. 简介 越来越多的应用都开始使用Hadoop框架.而开发者在使用过程中也遇到一些挑战,比如使用诸如Docker之类的容器开发和部署相关的技术栈开发的应用.我们将会在下面的例子中介绍如何克服这些挑战. 由于 S

在Docker中运行桌面应用

本文讲的是在Docker中运行桌面应用,[编者的话]本文作者Jessie Frazelle,本文重要介绍了很多基于文本的或者基于GUI的Docker应用.如果你想对原作者的更多Dockerfile或者镜像感兴趣的话,可以留意本文末尾的链接. 不知道你是否熟悉Docker,它是一个流行的开源容器引擎. 许多人使用Docker来部署应用到生产环境或者在容器环境里构建他们的应用.这可以节省开发者和运维工程师彼此头疼的问题,但是我喜欢以一种非典型的方式来使用Docker. 在我的电脑里,我使用Docke

在Docker中运行SQLServer ASP.NET应用

的文章在阿里云上运行ASP.NET Docker应用一文和大家探讨了如何在Docker中运行ASP.NET应用.本文是上一篇文章的续篇,讨论如何让应用访问SQLServer数据库. 创建SQLServer数据库 我们首先在阿里云上开通一个SQLServer服务器实例,创建用户user1. 创建一个名为Blog的数据库,并授权user1能够访问数据库.为数据库开通外网访问,获得数据库外网访问地址. 所有这些操作都能够在控制台完成,如果你想进入SQLServer的控制台,可以点击上图的登录数据库进入

尝鲜 | 在Docker中运行你的Mesos集群

本文讲的是尝鲜 | 在Docker中运行你的Mesos集群,[编者的话]本文介绍了在Docker中运行Apache Mesos,Mesos官方网站提供了安装包来直接运行它,但文中尝试使用Docker来运行Mesos,Mesosphere也提供了相应的镜像.在Docker中运行Mesos也有它的好处,读者可以尝试下. 很多人都已经开始在Apache Mesos中运行容器化的应用,我们也是这样.尽管我们尝试在容器中运行应用,但我们还是通过传统的安装包来在自己的主机上安装Mesos.尽管这是最简单和直

Apache拟在Docker中运行Hadoop

&http://www.aliyun.com/zixun/aggregation/37954.html">nbsp;Apache在其Hadoop维基百科发布了一个页面,主要整理了Docker中运行Hadoop的好处,以及要完全在Docker中运行Hadoop所需要完成的工作.在Docker,或者说其它容器中运行Hadoop YARN有很多优势,具体如下: 软件依赖和配置的隔离:在Docker中运行的应用,其软件依赖和配置是与宿主机完全没有关系的,跟其其它行在Docker中的应用也没

Asp.net中如何处理一个站点不同Web应用通用Session的问题

asp.net|session|web|问题|站点 Asp.net中如何处理一个站点不同Web应用通用Session的问题 1.问题描述: 系统S中有M1,M2,M3,M4四个模块,每个模块都是一个web应用.其中一个模块中设置Session后在其他模块中无法读取. 2.问题原因: 一个WEB应用相当于一个站点,应用与应用之间不可能共享Session. 3.解决方法: 1) 将四个web应用包含在同一个解决方案中,如图所示: 实际目录存储结构如下: (注:调整.webinfo文件使解决方案能构正

如何使用AdvancedInstaller在安装包中运行一个.bat文件

原文:如何使用AdvancedInstaller在安装包中运行一个.bat文件 1,  首先要保证你的Files and Folders模块下的Application Folder文件夹下包含你要运行的.bat文件. 2,  在Custom Actions模块下的InstallExecuteSequence-> Install子模块上右击: 3,  第2步完成后就会出现如下界面    4,  点击Command Line右边的edit按钮,点击"file",选择要运行的.bat文