使用 EB CLI 在本地运行 Docker 环境 - Amazon Elastic Beanstalk
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

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

使用 EB CLI 在本地运行 Docker 环境

您可以使用 Elastic Beanstalk Command Line Interface (EB CLI) 在本地运行在 Amazon Elastic Beanstalk 应用程序中配置的 Docker 容器。EB CLI 使用项目目录中的 Docker 配置文件(DockerfileDockerrun.aws.json)和源代码在 Docker 本地运行您的应用程序。

在本地运行 Docker 应用程序的先决条件

  • Linux OS 或 Mac OS X

  • EB CLI 版本 3.3 或更高版本

    运行项目目录中的 eb init 以初始化 EB CLI 存储库。如果您以前未使用过 EB CLI,请参阅 使用 EB CLI 管理 Elastic Beanstalk 环境

  • Docker 版本 1.6 或更高版本

    将您自己添加到 docker 群组中,注销,然后重新登录,以确保您可以在不使用 sudo 的情况下运行 Docker 命令:

    $ sudo usermod -a -G docker $USER

    运行 docker ps 以验证 Docker 守护程序已启用且运行正常:

    $ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
  • Docker 应用程序

    如果您的本地计算机上的项目文件夹中没有 Docker 应用程序,请参阅从 Docker 容器部署 Elastic Beanstalk 应用程序中有关通过 Amazon Elastic Beanstalk 使用 Docker 的说明。

  • Docker 配置文件 (可选)

    如果您的应用程序使用专用存储库中的 Docker 映像,请运行 docker login,然后按提示创建身份验证配置文件。

  • w3m (可选)

    W3m 是一个 Web 浏览器,可用来查看通过 eb local run 在命令行终端中运行的 Web 应用程序。如果您正在桌面环境中使用命令行,则不需要 w3m。

Docker 容器在本地运行而无需模拟 Amazon 资源,这些资源是在您将应用程序部署到 Elastic Beanstalk 时预配置的资源,包括安全组和数据或工作线程层。

您可以配置您的本地容器,以便通过使用 envvars 选项传递必要的连接字符串或其他变量来连接到数据库;但是,您必须确保 Amazon 中的所有资源都可以从本地计算机访问,方法是在分配的安全组中开放合适的端口或者附加默认网关弹性 IP 地址

准备 Docker 应用程序以便与 EB CLI 一起使用

准备您的 Docker 配置文件和源数据,就像您将它们部署到 Elastic Beanstalk 一样。本主题使用多容器 Docker 教程中的 PHP 和 nginx 代理示例,也在本章有论述。您可以对任何 Docker、多容器 Docker 或预配置的 Docker 应用程序使用相同的命令。

在本地运行 Docker 应用程序

从项目目录内部,使用 eb local run 命令在本地运行您的 Docker 应用程序:

~/project$ eb local run Creating elasticbeanstalk_phpapp_1... Creating elasticbeanstalk_nginxproxy_1... Attaching to elasticbeanstalk_phpapp_1, elasticbeanstalk_nginxproxy_1 phpapp_1 | [23-Apr-2015 23:24:25] NOTICE: fpm is running, pid 1 phpapp_1 | [23-Apr-2015 23:24:25] NOTICE: ready to handle connections

EB CLI 读取 Docker 配置并执行运行您的应用程序时所必需的 Docker 命令。当您首次在本地运行项目时,Docker 会从远程存储库下载映像并将其存储在本地计算机中。此过程可能耗时数分钟。

注意

eb local run 命令采用两个可选参数 portenvvars

要覆盖 Docker 应用程序的默认端口,请使用 port 选项:

$ eb local run --port 8080

此命令通知 EB CLI 使用主机上的端口 8080,并将它映射到容器上公开的端口。如果不指定端口,EB CLI 将为该主机使用容器的端口。此选项仅适用于使用 Docker 平台的应用程序。

要将环境变量传递到应用程序容器,请使用 envvars 选项:

$ eb local run --envvars RDS_HOST=$RDS_HOST,RDS_DB=$RDS_DB,RDS_USER=$RDS_USER,RDS_PASS=$RDS_PASS

使用环境变量配置数据库连接、设置调试选项或者将密钥安全地传递到您的应用程序。有关 eb local 子命令支持的选项的更多信息,请参阅 eb local

当容器已启动并且在 Docker 中正常运行时,它们就准备好接受来自客户端的请求。只要容器正在运行,eb local 进程就保持打开状态。如果您需要停止进程和容器,请按 Ctrl+C

eb local 进程正在运行时,打开另一个终端以运行其他命令。使用 eb local status 查看应用程序的状态:

~/project$ eb local status Platform: 64bit Amazon Linux 2014.09 v1.2.1 running Multi-container Docker 1.3.3 (Generic) Container name: elasticbeanstalk_nginxproxy_1 Container ip: 127.0.0.1 Container running: True Exposed host port(s): 80 Full local URL(s): 127.0.0.1:80 Container name: elasticbeanstalk_phpapp_1 Container ip: 127.0.0.1 Container running: True Exposed host port(s): None Full local URL(s): None

您可以使用 docker ps 从 Docker 的角度查看容器状态:

~/project$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 6a8e71274fed nginx:latest "nginx -g 'daemon of 9 minutes ago Up 9 minutes 0.0.0.0:80->80/tcp, 443/tcp elasticbeanstalk_nginxproxy_1 82cbf620bdc1 php:fpm "php-fpm" 9 minutes ago Up 9 minutes 9000/tcp elasticbeanstalk_phpapp_1

接下来,使用 eb local open 查看操作中的应用程序:

~/project$ eb local open

此命令在默认 Web 浏览器中打开您的应用程序。如果您正在桌面环境中运行终端,则 Web 浏览器可能是 Firefox、Safari 或 Google Chrome。如果您在无管控的环境中或通过 SSH 连接运行终端,并且有命令行浏览器 (例如,w3m) 可用,则将使用该浏览器。

等待一小段时间以切换回运行应用程序进程的终端,然后记录其他输出:

phpapp_1 | 172.17.0.36 - 21/Apr/2015:23:46:17 +0000 "GET /index.php" 200

这指示 Docker 容器中的 Web 应用程序收到针对 index.php 的 HTTP GET 请求,该请求以 200 (无错误) 状态成功返回。

运行 eb local logs 以查看 EB CLI 写入日志的位置。

~/project$ eb local logs Elastic Beanstalk will write logs locally to /home/user/project/.elasticbeanstalk/logs/local. Logs were most recently created 3 minutes ago and written to /home/user/project/.elasticbeanstalk/logs/local/150420_234011665784.

在本地运行 Docker 应用程序后执行清理

在本地完成测试应用程序后,可以停止应用程序并删除在使用 eb local run 时 Docker 下载的映像。删除映像操作是可选的。您可能希望保留它们供将来使用。

返回到运行 eb local 进程的终端,然后按 Ctrl+C 停止应用程序:

^CGracefully stopping... (press Ctrl+C again to force) Stopping elasticbeanstalk_nginxproxy_1... Stopping elasticbeanstalk_phpapp_1... Aborting. [1]+ Exit 5 eb local run

EB CLI 尝试使用 Docker 命令正常停止每个正在运行的容器。如果您需要立即停止进程,请再次按下 Ctrl+C

在停止应用程序后,Docker 容器也应该停止运行。使用 docker ps 进行验证:

$ docker ps --all CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 73d515d99d2a nginx:latest "nginx -g 'daemon of 21 minutes ago Exited (0) 11 minutes ago elasticbeanstalk_nginxproxy_1 7061c76220de php:fpm "php-fpm" 21 minutes ago Exited (0) 11 minutes ago elasticbeanstalk_phpapp_1

all 选项显示已停止的容器 (如果忽略此选项,则输出将为空白)。在上面的示例中,Docker 显示两个容器均以 0 (无错误) 状态退出。

如果已完成使用 Docker 和 EB CLI 本地命令,则可以从您的本地计算机中删除 Docker 映像以节省空间。

从本地计算机中删除 Docker 映像
  1. 使用 docker images 查看您下载的映像:

    $ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE php fpm 68bc5150cffc 1 hour ago 414.1 MB nginx latest 637d3b2f5fb5 1 hour ago 93.44 MB
  2. 使用 docker rm 删除两个 Docker 容器:

    $ docker rm 73d515d99d2a 7061c76220de 73d515d99d2a 7061c76220de
  3. 使用 docker rmi 删除映像:

    $ docker rmi 68bc5150cffc 637d3b2f5fb5 Untagged: php:fpm Deleted: 68bc5150cffc0526c66b92265c3ed8f2ea50f3c71d266aa655b7a4d20c3587b0 Untagged: nginx:latest Deleted: 637d3b2f5fb5c4f70895b77a9e76751a6e7670f4ef27a159dad49235f4fe61e0