使用ECS将一个docker应用部署到AWS上
弹性容器服务(ECS)是亚马逊网络服务(AWS)提供的一项云计算服务,用于管理容器,并允许开发人员在云中运行应用程序,而无需为代码的运行配置环境。
ECS是由亚马逊开发的,以应对容器化的兴起。ECS使开发者能够轻松地使用Docker容器进行广泛的活动,从托管到运行需要许多容器的复杂微服务。
Docker是一种容器化技术,可以将一个应用程序及其库打包成一个,这样就可以轻松地运行该应用程序,而不需要做进一步的配置。
亚马逊网络服务(AWS)是一个用于部署和托管网络应用的云计算平台。除了云服务,AWS还提供分布式计算服务。其中一项服务是弹性容器服务(ECS)。
目标
在这篇文章中,我们将了解如何使用弹性容器服务(ECS)将基于Docker的应用程序部署到亚马逊网络服务。
Flask是一个用于构建Web应用程序的python框架。我们需要Flask来创建一个小的Web项目,以部署到AWS。我更喜欢flask,因为它很简单,此外,它不需要任何特殊的工具来工作。
在本教程结束时,你将能够理解如何创建、dockerize和部署一个flask应用。
前提条件
学习本教程你需要以下条件。
- 一个文本编辑器来创建flask应用程序。我使用[VSCode]。
- 对Python和Flask框架有基本了解。
- 在你的电脑上安装[Docker]。
- 安装了[AWS CLI]。
- 一个AWS账户。
创建flask应用
为了创建flask应用程序,我们需要安装flask 。在项目的目录下,运行下面的命令。
pip install flask
接下来,创建两个文件,requirements.txt ,以保存项目库及其依赖关系,以及app.py 。
在app.py 文件中添加以下代码。
from flask import Flask, render_template
import flask
app = Flask(__name__)
# Index route
@app.route('/')
def index():
return render_template('index.html')
# We are telling flask to look for a file named index in the templates folder
#then render it to the user interface. Note that by default flask looks for templates in a folder named templates.
if __name__ == '__main__':
app.run(debug=True)
创建一个名为templates 的文件夹,其中包含网页上渲染的HTML文件。在这个文件夹中,创建一个名为index.html 的文件,然后添加下面的代码。
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Docker | AWS Index</title>
<link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.7/css/bootstrap.min.css">
</head>
<body>
<div class="container">
<div class="jumbotron text-center">
<h2>FLASK APP DEPLOYED TO AWS USING DOCKER</h4>
<p>Lorem ipsum, dolor sit amet consectetur adipisicing elit. Illum officia asperiores impedit possimus quas
officiis expedita velit, at architecto iusto natus modi quaerat, nulla laboriosam atque odio amet debitis
et voluptas ea! Pariatur autem tempora placeat saepe doloribus minus ab maxime excepturi neque illo. Ratione,
sapiente magnam? Perspiciatis, molestias nihil.</p>
</div>
</div>
</div>
</body>
</html>
现在,让我们运行flask应用程序,看看它是否工作。在终端中,执行下面的命令。
set FLASK_APP='app.py'
flask run -p 5000
你应该在终端中看到下面的信息。
* Environment: production
WARNING: This is a development server. Do not use it in a production deployment.
Use a production WSGI server instead.
* Debug mode: off
* Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
现在,前往浏览器http://127.0.0.1:5000/ ,看看应用程序是否正在运行。

Dockerizing the flask app
现在,我们的应用程序已经启动并运行,我们需要对其进行Dockerize。Dockerization是将应用程序及其环境库和依赖关系打包成一个整体,这样应用程序就可以在任何地方运行,而不需要进行新的环境配置。
首先,我们需要创建一个dockerfile 。Docker文件被Docker引擎用来创建应用程序容器的新docker镜像。它设置了一个运行应用程序所需的环境。
创建一个名为Dockerfile 的文件,并添加下面的片段。
# For more information, please refer to https://aka.ms/vscode-docker-python
FROM python:3.8
# working directory
WORKDIR /user/src/app
# copy all files to the container
COPY . .
# Install pip requirements
RUN python -m pip install --no-cache-dir -r requirements.txt
# port number to expose
EXPOSE 5000
# run the command
CMD ["python", "./app.py"]
运行容器
在这个阶段,我们将结合所有的文件并运行docker容器。
启动Docker Desktop ,然后,执行下面的命令。
docker build -t app
Docker将执行Dockerfile 的每一行,如下所示。

接下来,执行下面的命令来运行docker容器。
docker run -p 8888:5000 -t app
在ECS中创建一个用户
前往IAM ,创建一个用户,并授予该用户AmazonEC2ContainerRegistryFullAccess 权限。
执行下面的命令,通过终端设置用户。
aws configure
插入你上面创建的用户的Access key ID 和访问键。按回车键,将其余设置保留为默认值。
你应该把细节设置成以下样子。
AWS Access Key ID [****************TIEH]: YOUR ACCESS KEY ID
AWS Secret Access Key [****************QkxN]: YOUR ACCESS KEY
Default region name [us-east-1]:
Default output format [a]:
创建一个Elastic Container Service资源库
接下来,我们需要创建一个新的ECS资源库,如下图所示。
- 在ECS控制台,前往Elastic Container Registry(ECR)。
- 点击 "开始"。
- 输入资源库名称。我把我的称为
test。 - 将其余的设置保留为默认,然后点击
Create repository。
你应该有一个像下面这样的屏幕。

上传Docker镜像到版本库
接下来,我们需要上传我们创建的docker镜像到ECR。
首先,通过检索认证登录用户,并使用令牌来认证用户。
执行下面的命令。
aws ecr get-login-password --region YOUR REGION | docker login --username AWS --password-stdin YOUR ID.dkr.ecr.YOUR REGION.amazonaws.com
构建Docker镜像。
docker build -t test
给构建的镜像打上标签,这样就可以把它上传到创建的仓库。
docker tag test:latest YOUR ID.dkr.ecr.YOUR REGION.amazonaws.com/test:latest
最后,我们需要将镜像推送到AWS的仓库。
docker push YOUR ID.dkr.ecr.YOUR REGION.amazonaws.com/test:latest

这些命令可以通过点击仓库页面的view push commands 按钮在仓库中找到。
创建ECS集群
- 在AWS控制台,前往ECS。
- 点击
create cluster按钮。 - 选择
EC2 Linux + Networking,然后进入下一个步骤。 - 在下一个页面,插入集群名称。我把我的称为
test。 - 将
Provisioning Model设为On-Demand Instance。 - 对于
EC2 Instance type,选择t3a.micro。 - 在联网下,将VPC设置为默认VPC。
- 将
Subnets设置为下拉菜单中的第一个子网。 - 将
Auto-assign public IP设置为Enabled。 - 对于
Security group,使用默认值。 - 点击创建,然后等待该过程完成。
如果程序成功,那么你应该看到一个如下的窗口。

创建任务定义
- 点击
view cluster,然后在左边的侧边栏中,点击Task Definitions。 - 点击
Create new Task DefiniTion,并选择EC2,然后进入下一个页面。 - 输入任务名称。我使用
testAppTask作为我的任务名称。 - 按照你的意愿填写细节,然后点击
add container。 - 在下一个容器中,输入容器名称。我使用了
testAppContainer。输入容器图像的URL。 - 向下滚动到端口映射。在
Host port,输入8888,在Container port,输入5000。 - 点击
add,然后向下滚动到create。

部署创建的任务
- 在左边的侧边栏,点击群集。
- 选择创建的集群。
- 在集群页面中,点击
tasks标签,然后运行new task。 - 在下一个页面,选择
EC2作为启动类型。 - 在
task definition,选择你上面创建的任务。它将自动填入。 - 在
cluster name中输入我们创建的集群的名称。 - 最后,向下滚动以运行该任务。
如果你回到集群页面,点击创建的集群,你应该看到任务状态如下。

测试URL
现在,我们几乎已经完成了。我们需要测试我们的应用程序部署状态。
- 在EC2实例中,转到网络和安全。
- 在安全组下,选择默认。
- 向下滚动到
edit inbound rules。 - 点击
Add rule按钮。 8888在protocol,选择TCP,在Port range,然后用0.0.0.0/0,在source info,可以从任何地方访问。
在点击保存按钮之前,你的配置应该如下所示。

对于选定的实例,复制公共DNS URL。实例的公共DNS会显示在页面上。把它粘贴到你的浏览器的一个新标签中,端口为8888 。
如果你所做的一切都正确,你的应用程序应该已经开始运行了!
总结
在本教程中,我们介绍了使用Elastic Container Service将Docker应用程序成功部署到AWS。我们首先建立了一个迷你的flask应用程序。
接下来,我们对应用程序进行了docker化,为部署做好准备,并将docker镜像上传到ECR仓库中。
最后,我们将应用程序部署到AWS。