欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2022-06-04 11:57:35
几周前, elastic beanstalk声明在aws云中配置和管理docker容器。在本文中,我们通过一个简单的注册表单页面应用去理解docker部署过程,该表单使用e...

几周前, 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应用的教程