本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
使用 EB CLI 在本地运行 Docker 环境
您可以使用 Elastic Beanstalk Command Line Interface (EB CLI) 在本地运行在 Amazon Elastic Beanstalk 应用程序中配置的 Docker 容器。EB CLI 使用项目目录中的 Docker 配置文件(Dockerfile
或 Dockerrun.aws.json
)和源代码在 Docker 本地运行您的应用程序。
在本地运行 Docker 应用程序的先决条件
-
Linux OS 或 Mac OS X
-
运行项目目录中的 eb init 以初始化 EB CLI 存储库。如果您以前未使用过 EB CLI,请参阅 使用 EB CLI 管理 Elastic Beanstalk 环境。
-
将您自己添加到
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 命令采用两个可选参数 port
和 envvars
。
要覆盖 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 停止应用程序:
^C
Gracefully 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 映像
-
使用
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 -
使用
docker rm
删除两个 Docker 容器:$
docker rm
73d515d99d2a 7061c76220de73d515d99d2a 7061c76220de
-
使用
docker rmi
删除映像:$
docker rmi
Untagged: php:fpm Deleted: 68bc5150cffc0526c66b92265c3ed8f2ea50f3c71d266aa655b7a4d20c3587b0 Untagged: nginx:latest Deleted: 637d3b2f5fb5c4f70895b77a9e76751a6e7670f4ef27a159dad49235f4fe61e068bc5150cffc 637d3b2f5fb5