几周前,ElasticBeanstalk宣布在AWS云中配置和管理Docker容器。在本文中,我们通过一个简单的注册表单页面的应用程序来了解Docker部署过程,它使用ElasticBeanstalkPython环境。关于SignupForm应用程序我们在几个月前开发并发布了有关该应用程序的博客。有4个部分的视频和一篇文章“在任何受支持的AWS区域中将DynamoDB和SNS与ElasticBeanstalk结合使用”。今天,我们将在此部分之上进一步开发和讨论我们如何在Docker和ElasticBeanstalk环境中进行部署。本文将分为4个部分进行讲解。参考资源原始Python应用程序(非Dockerized)源代码托管在GitHub(主版本)上,网址为https://github.com/awslabs/eb-py-flask-signup/tree/docker。Dockerized版本在docker版本,网址为:https://github.com/awslabs/eb-py-flask-signup/tree/docker如果喜欢代码和不同版本的对比,可以使用GitHub比较FunctionView两个版本的区别。URL是https://github.com/awslabs/eb-py-flask-signup/compare/master...docker。您还可以查看Docker化后添加的每个文件或代码行。Dockerization阶段1:添加Dockerfile首先通过查看目录从GitHub克隆源代码:$>gitclonegit@github.com:awslabs/eb-py-flask-signup.git$>cdeb-py-flask-signup$>gitcheckoutmaster内容,知道这是一个简单的Python应用,使用了Flask框架,Boto和一些其他的依赖(依赖声明在requirements.txt中),其中Boto用于DynamoDB和SNS的交互。非常简单,我们只需要创建一个Dockerfile来构建适合运行应用程序的图像。Dockerfile和其他应用程序源放在一个目录中(即与requirements.txt、application.py等一起)。FROMubuntu:12.10#InstallPythonSetuptoolsRUNapt-getinstall-ypython-setuptools#InstallpipRUNeasy_installpip#AddandinstallPythonmodulesADDrequirements.txt/src/requirements.txtRUNcd/src;pipinstall-requirements.txt#Bundleappsource添加./src#Epython"","/src/application.py"]Dockerization阶段2:本地测试虽然这个应用程序需要DynamoDB表和SNS主题才能完全运行,但我可以但不能测试它们:首先,构建Docker映像:$>dockerbuild-teb-py-sample。最后(直接直到可以使用!),通过构建的镜像运行一个容器(将容器的5000端口映射到宿主机的8080端口,并根据以下代码设置一些环境变量):$>dockerrun-d\-eAPP_CONFIG=application.config.example\-eAWS_ACCESS_KEY_ID=$AWS_ACCESS_KEY_ID\-eAWS_SECRET_ACCESS_KEY=$AWS_SECRET_ACCESS_KEY\-p8080:5000\eb-py-sample在OSX上,我打开http://localhost:8080链接,如下图所示我的一个应用程序!侧边栏:我们使用-e选项传递一些选项:APP_CONFIG:该程序使用此选项加载(指向)其配置文件。默认情况下,我们指定一个默认配置文件。您可以创建DynamoDB表和SNS主题并将它们添加到此配置文件中,以使您的应用程序在本地开发时完美运行。AWS_ACCESS_KEY_ID和AWS_SECRET_ACCESS_KEY:此应用程序使用Boto连接DynamoDB和SNS,Boto使用这些环境变量来验证对上述服务的请求。这些设置仅用于本地开发。当我们部署到ElasticBeanstalk时,我们将使用统一的身份和访问控制方案(IAM)角色(Roles)。Dockerization阶段3:修改.ebextensions我们的应用程序有一个特殊的文件夹.ebextensions,其中包含一个setup.config文件。我们用这个文件通知ElasticBeanstalk创建我们程序需要的DynamoDB表和SNS主题,他会创建一个配置文件/var/app/app.config,里面有我们刚刚创建的DynamoDB表和SNS主题名称。这个文件还有一些比较特殊的地方就是他在ElasticBeanstalk(相对于Docker)中有一个特殊的Python环境类型(python版本?),我们需要去掉它们:修改文件的成员,并去掉替换owner和group键,使其看起来像这样:文件:“/var/app/app.config”:模式:“000444”内容:|AWS_REGION='`{"Ref":"AWS::Region"}`'STARTUP_SIGNUP_TABLE='`{"Ref":"StartupSignupsTable"}`'NEW_SIGNUP_TOPIC='`{"Ref":"NewSignupTopic"}`'修改选项设置并删除静态文件映射。让它看起来像这样: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。Dockerization阶段4:部署到ElasticBeanstalk我已经设置并测试了我的本地容器,删除了一些.ebextensions,它特定于ElasticBeanstalkPython环境,我已准备好自信地部署它!我创建了一个名为Dockerrun.aws.json的文件,同样我创建了Dockerfile。该文件将告诉ElasticBeanstalk如何运行Docker容器,它看起来像这样(有关此文件的详细信息,请参见下文)。{"AWSEBDockerrunVersion":"1","Volumes":[{"ContainerDirectory":"/var/app","HostDirectory":"/var/app"}],"Logging":"/var/eb_log"}Dockerrun.aws.jsonVolumes成员会将EC2上的/var/app实例映射到容器上的/var/app。Docker容器允许应用程序通过访问app.config文件并创建.ebextensions/setup.config在容器上运行。Logging成员告诉ElasticBeanstalk,我们的Docker应用程序将记录到容器中的/var/eb_log。在控制台中,无论何时单击SnapshotLogs或启用自动日志轮换,Beanstalk都会自动将日志推送到/var/eb_log到该目录。我将提交我的更改并使用gitarchive生成??一个zip文件以部署在ElasticBeanstalk上(您可以使用zip工具、Finder或Windows资源管理器打包):$>gitaddDocker*&&gitcommit-am"Dockerized"$>gitarchive--format=zipHEAD>eb-py-flask-signup.zip之后,我通过ElasticBeanstalk管理控制台部署生成的zip包。在我的环境通过后,我可以访问它并确保它正常工作:我还保存了环境日志的快照:由于我将Logging成员添加到Dockerrun.aws.json文件,日志输出到/var/eb_log中容器可以定向到S3,我可以在浏览器中查看访问它们:在下一篇文章中,我将使用eb命令行工具直接在命令行中部署这个Dockerized程序,不需要浏览器或管理控制台!相关资源GitHub上的Dockerized示例应用程序-https://github.com/awslabs/eb-py-flask-signup/tree/dockerElasticBeanstalk上的Docker文档-http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create_deploy_docker.html英文原文:DockerizingaPythonWebApp翻译链接:http://www.oschina.net/translate/dockerizing-a-python-web-app
