使用 Docker 平台 - AWS Elastic Beanstalk
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 Docker 平台

重要

Amazon Linux 2 平台版本与 Amazon Linux AMI 平台版本(在 Amazon Linux 2 之前)完全不同。这些不同层代的平台在多个方面不兼容。如果您要迁移到 Amazon Linux 2 平台版本,请务必阅读将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2中的信息。

AWS Elastic Beanstalk 可通过生成 Dockerfile 中描述的映像或提取远程 Docker 映像来启动 Docker 环境。如果您要部署远程 Docker 映像,则无需包含 Dockerfile。相反,如果您也使用 Docker Compose,则使用 docker-compose.yml 文件,该文件会指定要使用的映像和其他配置选项。如果您没有将 Docker Compose 与 Docker 环境结合使用,请改为使用 Dockerrun.aws.json 文件。

先决条件

本教程假设您对基本 Elastic Beanstalk 操作、使用 Elastic Beanstalk 命令行界面 (EB CLI) 和 Docker 有一定了解。要完成本教程,您需要在本地安装的有效 Docker。有关安装 Docker 的更多信息,请参阅 Docker 安装指南

如果尚不了解,请按照开始使用 Elastic Beanstalk中的说明操作以启动您的第一个 Elastic Beanstalk 环境。本教程使用 EB CLI,但您也可以使用 Elastic Beanstalk 控制台创建环境并上传应用程序。要了解有关配置 Docker 环境的更多信息,请参阅Docker 配置

容器化 Elastic Beanstalk 应用程序

对于本示例,我们从将 Flask 应用程序部署到 Elastic Beanstalk 中创建了示例 Flask 应用程序的 Docker 映像。该应用程序包含一个主文件 application.py。我们还需要一个 Dockerfile。将这两个文件都放在根目录中。

~/eb-docker-flask/ |-- Dockerfile |-- application.py

~/eb-docker-flask/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-docker-flask/Dockerfile

FROM python:3.6 COPY . /app WORKDIR /app RUN pip install Flask==1.0.2 EXPOSE 5000 CMD ["python", "application.py"]

在本地测试容器

使用 Elastic Beanstalk CLI (EB CLI) 为到 Elastic Beanstalk 的部署配置本地存储库。在根目录处设置应用程序的 Dockerfile

~/eb-docker-flask$ eb init -p docker application-name

(可选)使用 eb local run 命令在本地生成并运行您的容器。

~/eb-docker-flask$ eb local run --port 5000
注意

要了解有关 eb local 命令的更多信息,请参阅 eb local。Windows 中不支持此命令。或者,您也可以使用 docker builddocker run 命令生成并运行您的容器。有关更多信息,请参阅 Docker 文档

(可选)当您的容器正在运行时,可使用 eb local open 命令在 Web 浏览器中查看您的应用程序。或者,在 Web 浏览器中打开 http://localhost:5000/

~/eb-docker-flask$ eb local open

使用 Dockerfile 部署容器

在本地测试应用程序后,将应用程序部署到 Elastic Beanstalk 环境中。Elastic Beanstalk 使用 Dockerfile 中的说明来构建和运行映像。

使用 eb create 命令创建环境并部署应用程序。

~/eb-docker-flask$ eb create environment-name

启动环境后,使用 eb open 命令在 Web 浏览器中查看它。

~/eb-docker-flask$ eb open

测试远程 Docker 映像

接下来,我们将生成上一节中的 Flask 应用程序的 Docker 映像并将其推送至 Docker Hub。

注意

以下步骤将创建一个公开可用的 Docker 映像。

构建并推送我们的映像后,如果您将 Docker Compose 与 Docker 环境结合使用,我们就可以使用 docker-compose.yml 文件将映像部署到 Elastic Beanstalk。(如果您没有将 Docker Compose 与 Docker 环境结合使用,请改为使用 Dockerrun.aws.json 文件。) 要生成 Flask 应用程序的 Docker 映像并将其推送至 Docker Hub,请运行以下命令。我们将使用与上一示例相同的目录,但您可在您的应用程序代码中使用任何目录。

~/eb-docker-flask$ docker build -t docker-username/beanstalk-flask:latest . ~/eb-docker-flask$ docker push docker-username/beanstalk-flask:latest
注意

在推送映像之前,您可能需要运行 docker login

如果您正在使用 Docker Compose 工具管理 Docker 环境,现在您只能使用 docker-compose.yml 文件部署您的应用程序。要了解有关 docker-compose.yml 文件的更多信息,请参阅Docker 配置

如果您没有使用 Docker Compose,请改为使用 Dockerrun.aws.json 文件。有关更多信息,请参阅使用 Dockerrun.aws.json v1 进行部署(无 Docker Compose)

创建一个新目录,并创建一个 docker-compose.yml 文件。

~/remote-docker/docker-compose.yml

version: '3.8' services: beanstalk-flask: image: "username/beanstalk-flask" ports: - "80:5000"

如果您并未使用 Docker Compose 工具管理 Docker 环境,现在您只能使用 Dockerrun.aws.json 文件部署您的应用程序。要了解有关 Dockerrun.aws.json 文件的更多信息,请参阅Docker 平台的配置(不含 Docker Compose)

创建一个新目录,并创建一个 Dockerrun.aws.json 文件。

~/remote-docker/Dockerrun.aws.json

{ "AWSEBDockerrunVersion": "1", "Image": { "Name": "username/beanstalk-flask", "Update": "true" }, "Ports": [ { "ContainerPort": "5000" } ] }

使用 EB CLI 为到 Elastic Beanstalk 的部署配置本地存储库。

~/remote-docker$ eb init -p docker application-name

(可选)使用 eb local run 在本地生成并运行您的容器。要了解有关 eb local 命令的更多信息,请参阅 eb local

~/remote-docker$ eb local run --port 5000

(可选)当您的容器正在运行时,可使用 eb local open 命令在 Web 浏览器中查看您的应用程序。或者,在 Web 浏览器中打开 http://localhost:5000/

~/remote-docker$ eb local open

将远程 Docker 映像部署到 Elastic Beanstalk

在本地测试容器后,将容器部署到 Elastic Beanstalk 环境中。如果您使用的是 Docker Compose,Elastic Beanstalk 会使用 docker-compose.yml 文件来提取和运行您的映像。否则,Elastic Beanstalk 会改用 Dockerrun.aws.json

使用 EB CLI 创建环境并部署映像。

~/remote-docker$ eb create environment-name

启动环境后,可使用 eb open 在 Web 浏览器中查看该环境。

~/remote-docker$ eb open

清除

Elastic Beanstalk 使用完毕时,您可以终止您的环境。Elastic Beanstalk 会终止与环境关联的所有 AWS 资源,例如 Amazon EC2 实例数据库实例负载均衡器、安全组和警报

终止 Elastic Beanstalk 环境

  1. 打开 Elastic Beanstalk 控制台,然后在 Regions (区域) 列表中选择您的 AWS 区域。

  2. 在导航窗格中,选择 Environments (环境),然后从列表中选择环境的名称。

    注意

    如果您有多个环境,请使用搜索栏筛选环境列表。

  3. 选择 Environment actions (环境操作),然后选择 Terminate environment (终止环境)

  4. 使用屏幕上的对话框确认环境终止。

利用 Elastic Beanstalk,可以随时为您的应用程序轻松创建新环境。

或者,使用 EB CLI:

~/remote-docker$ eb terminate environment-name