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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用 Docker 平台分支

Amazon 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 有一定了解。如果尚不了解,请按照开始使用 Elastic Beanstalk中的说明操作以启动您的第一个 Elastic Beanstalk 环境。本教程使用 EB CLI,但您也可以使用 Elastic Beanstalk 控制台创建环境并上传应用程序。

要完成本教程,您需要做以下 Docker 组件:

  • 在本地安装有效的 Docker。有关更多信息,请参阅 Docker 文档网站上的获取 Docker

  • 访问 Docker Hub。您需要创建一个 Docker ID 才能访问 Docker Hub。有关更多信息,请参阅 Docker 文档网站上的共享应用程序

要了解有关在 Elastic Beanstalk 平台上配置 Docker 环境的更多信息,请参阅同一章中的Docker 配置

容器化 Elastic Beanstalk 应用程序

对于本示例,我们从 中创建了示例 Flask 应用程序的 Docker 映像将 Flask 应用程序部署到 Elastic Beanstalk 该应用程序包含一个主文件 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 中的 Docker 命令以及 Docker Hub 凭据。有关更多信息,请参阅上部分中的先决条件

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

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

在推送映像之前,您可能需要运行 docker login。如果您运行不带参数的命令,系统将提示您输入 Docker Hub 凭据。

如果您正在使用 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 会终止与环境关联的所有 Amazon 资源,例如 Amazon EC2 s实例数据库实例负载均衡器、安全组和警报

终止 Elastic Beanstalk 环境
  1. 打开 Elastic Beanstalk 控制台,然后在 Regions(区域)列表中选择您的 Amazon Web Services 区域。

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

    注意

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

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

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

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

或者,使用 EB CLI:

~/remote-docker$ eb terminate environment-name