参考资料
- 使用 Docker 平台分支
之前的文章分享过如何使用eb cli工具创建application和eb环境,本文介绍beanstalk支持的docker容器部署
关于beanstalk环境创建相关的资源和部署逻辑,参考之前的文章《aws beanstalk 使用eb cli配置和启动环境》
$ eb init
Select a platform branch.
1) Docker running on 64bit Amazon Linux 2
2) ECS running on 64bit Amazon Linux 2
$ eb create
# 扩容实例
$ eb scale 1 test-beandocker-env
beanstalk的docker平台支持两个分支
- 在 64AL2 上运行的 Docker
- 在 64AL2 上运行的 ECS
可以使用Dockerfile启动docker环境
如果使用的是 docker compose,eb会使用
docker-compose.yml
文件来提取和运行您的映像否则eb会改用
Dockerrun.aws.json
,可以理解为aws的docker-compose
使用eb cli过程中几个好用的命令
# 登录实例
$ eb ssh
Select an instance to ssh into
1) i-09xxxxxxxe1c7
2) i-09xxxxxx08d18
# 下载当前应用zip
$ eb labs download
Downloading application version...
Application version downloaded to: /home/ec2-user/xxxxxx
# 生成cw logs配置到.ebextension文件夹下
$ eb labs setup-cloudwatchlogs
# 在本地运行测试容器,实际就是使用docker-compose
$ eb local run --port 5000
# 注意:使用以上命令无法启动docker-compose.yaml应用
# ERROR: NotFoundError - The EB CLI cannot find Dockerfile or the Dockerrun.aws.json file in the application root directory
关于eb的部署权限和实例配置文件
在使用 Elastic Beanstalk 控制台或 EB CLI 启动环境时,Elastic Beanstalk 创建一个名为
aws-elasticbeanstalk-ec2-role
的默认实例配置文件,并为其分配具有默认权限的托管式策略所有 Amazon Linux 2 平台版本都会在环境创建期间默认启用增强型运行状况。实例需要正确权限来收集和报告增强型运行状况信息
eb提供了三种托管策略
- AWSElasticBeanstalkWebTier,上传日志到s3和调试信息到xray
- AWSElasticBeanstalkWorkerTier :日志上传、调试、指标发布和工作程序实例任务
- AWSElasticBeanstalkMulticontainerDocker :ecs相关权限,附加在ecs实例上
- (可选)AmazonSSMManagedInstanceCore:ssm托管
docker环境的beanstalk
docker环境的部署文件支持
Dockerrun.aws.json
- docker-compose.yml
- dockerfile
支持本地测试
eb local run --port 5000
使用dockerfile
部署,将Dockerfile
和application.py
文件复制到项目根目录
$ cat Dockerfile
FROM python:3.6
COPY . /app
WORKDIR /app
RUN pip install Flask==1.0.2
EXPOSE 5000
CMD ["python", "application.py"]
$ cat application.py
from flask import Flask
# Print a nice greeting
def say_hello(username = "World"):
return '<p>Hello %s!</p>\n' % username
# Some bits of text for the page
header_text = '''
<html>\n<head> <title>EB Flask Test</title> </head>\n<body>'''
instructions = '''
<p><em>Hint</em>: This is a RESTful web service! Append a username
to the URL (for example: <code>/Thelonious</code>) to say hello to
someone specific.</p>\n'''
home_link = '<p><a href="/">Back</a></p>\n'
footer_text = '</body>\n</html>'
# Elastic Beanstalk looks for an 'application' that is callable by default
application = Flask(__name__)
# Add a rule for the index page
application.add_url_rule('/', 'index', (lambda: header_text +
say_hello() + instructions + footer_text))
# Add a rule when the page is accessed with a name appended to the site
# URL
application.add_url_rule('/<username>', 'hello', (lambda username:
header_text + say_hello(username) + home_link + footer_text))
# Run the application
if __name__ == "__main__":
# Setting debug to True enables debug output. This line should be
# removed before deploying a production application.
application.debug = True
application.run(host="0.0.0.0")
$ eb deploy
使用docker-compose.yml文件部署,将docker-compose.yml
文件复制到项目根目录,创建新的service使用ecr的远程镜像
注意:需要提前安装docker-compose,ec2实例需要去往ecr拉取镜像的权限
$ cat docker-compose.yml
version: '3.8'
services:
beanstalk-flask:
image: "xxxxxxx.dkr.ecr.cn-north-1.amazonaws.com.cn/beanstalk-flask"
ports:
- "80:5000"
$ eb deploy
使用Dockerrun.aws.json
文件(v1单容器版本)部署
$ cat Dockerrun.aws.json
{
"AWSEBDockerrunVersion": "1",
"Image": {
"Name": "username/beanstalk-flask",
"Update": "true"
},
"Ports": [
{
"ContainerPort": "5000"
}
]
}
$ eb deploy
此外使用v1单容器的Dockerrun.aws.json
,可以不指定image键,但需要提供dockerfile文件(间接指定image),该构建行为最终会在eb实例上进行
查看托管环境的docker容器
$ sudo usermod -a -G docker $USER
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
65fd847eef7d 59f502b87637 "python application.…" 50 seconds ago Up 49 seconds 5000/tcp interesting_robinson
对于私有仓库拉取镜像的配置,需要在Dockerrun.aws.json
额外添加以下配置,s3文件为~/.docker/config.json
文件内容
$ cat Dockerrun.aws.json
{
"AWSEBDockerrunVersion": "1",
"Authentication": {
"Bucket": "DOC-EXAMPLE-BUCKET",
"Key": "mydockercfg"
},
...
}
ecs托管环境的beanstalk
2022 年 7 月 18 日 开始Elastic Beanstalk 将基于 Amazon Linux AMI (AL1) 的所有平台分支的状态设置为已停用
ecs托管环境的部署文件支持
Dockerrun.aws.json
文件是特定于eb的部署文件,分为v1和v2版本,v2版本的部署文件增加了多多容器的支持(只支持ecs托管docker环境)。- docker-compose.yml
- dockerfile(不支持),因此使用的image需要预构建并推送
eb托管的ecs环境执行创建集群,任务定义和创建任务(无服务)等操作。为了充分利用odcker环境,eb托管的ec2实例可以并行运行多个eb应用。创建的ecs资源有:集群群,任务定义,任务,容器代理 ,数据卷
ecs环境中的每个实例运行相同的容器组,在Dockerrun.aws.json
文件中定义,示例文件如此链接,定义了多容器任务(和ecs任务定义类似)。与 Dockerrun.aws.json
一起存档的源代码将部署到 Amazon EC2 容器实例中,并且可在 /var/app/current/
目录中进行访问
如果需要拉取私有仓库image需要配置authentication
参数,但是镜像存储在ecr中除外(需要为实例配置权限AmazonEC2ContainerRegistryReadOnly
)
无法在本地进行测试,报错如下
$ eb local run --port 5000
ERROR: NotSupportedError - You can use "eb local" only with preconfigured, generic and multicontainer Docker platforms.
登录实例产看容器
在这里插入图片描述
在ecs控制台上看到单独启动一个任务,没有创建服务
除了部署和配置方式不同,其他和ecs任务一致