

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

# Elastic Beanstalk 上预配置的 Docker GlassFish 容器
<a name="create_deploy_dockerpreconfig"></a>

**注意**  
 [2022 年 7 月 18 日，](https://docs.amazonaws.cn/elasticbeanstalk/latest/relnotes/release-2022-07-18-linux-al1-retire.html)**Elastic Beanstalk 将所有基于亚马逊 Linux AMI AL1 () 的平台分支的状态设置为停用。**有关迁移到当前且完全受支持的 Amazon Linux 2023 平台分支的更多信息，请参阅 [将 Elastic Beanstalk Linux 应用程序迁移到 Amazon Linux 2023 或 Amazon Linux 2](using-features.migration-al.md)。

不再支持在亚马逊 Linux AMI (AL1) 上运行的预配置 Docker GlassFish 平台分支。要将您的 GlassFish 应用程序迁移到支持的亚马逊 Linux 2023 平台，请将您的应用程序代码部署 GlassFish 到亚马逊 Linux 2023 Docker 镜像。有关更多信息，请参阅以下主题：[将 GlassFish 应用程序部署到 Docker 平台：2023 年亚马逊 Linux 的迁移之路](#docker-glassfish-tutorial)。

## 开始使用预配置 Docker 容器 - Amazon Linux AMI（Amazon Linux 2 之前）上
<a name="create_deploy_dockerpreconfig.walkthrough"></a>

本部分介绍如何在本地开发示例应用程序，然后使用预配置的 Docker 容器将应用程序部署到 Elastic Beanstalk。

### 设置本地开发环境
<a name="create_deploy_dockerpreconfig.walkthrough.setup"></a>

在本演练中，我们使用了一个 GlassFish 示例应用程序。

**设置环境**

1. 为示例应用程序创建新文件夹。

   ```
   ~$ mkdir eb-preconf-example
   ~$ cd eb-preconf-example
   ```

1. 将示例应用程序代码下载到新文件夹。

   ```
   ~$ wget https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/samples/docker-glassfish-v1_cn.zip
   ~$ unzip docker-glassfish-v1_cn.zip
   ~$ rm docker-glassfish-v1_cn.zip
   ```

### 在本地开发和测试
<a name="create_deploy_dockerpreconfig.walkthrough.dev"></a>

**开发示例 GlassFish 应用程序**

1. 将 `Dockerfile` 添加到应用程序的根目录文件夹。在文件中，指定用于运行本地预配置的 Amazon Elastic Beanstalk Docker 容器的 Docker 基础镜像。稍后你将把你的应用程序部署到 Elastic Beanstal GlassFish k 预配置的 Docker 平台版本。选择此平台版本使用的 Docker 基本映像。要了解此平台版本的当前 Docker 映像的更多信息，请参阅《Amazon Elastic Beanstalk 平台》**指南中的 *Amazon Elastic Beanstalk 支持的平台*页面的[预配置的 Docker](https://docs.amazonaws.cn/elasticbeanstalk/latest/platforms/platforms-supported.html#platforms-supported.dockerpreconfig) 部分。  
**Example \~/E/b-preconf-exampleDockerfile**  

   ```
   # For Glassfish 5.0 Java 8
   FROM amazon/aws-eb-glassfish:5.0-al-onbuild-2.11.1
   ```

   有关使用 `Dockerfile` 的更多信息，请参阅[准备 Docker 映像以部署到 Elastic Beanstalk](single-container-docker-configuration.md)。

1. 构建 Docker 映像。

   ```
   ~/eb-preconf-example$ docker build -t my-app-image .
   ```

1. 从该映像运行 Docker 容器。
**注意**  
必须包含 `-p` 标记才能将容器中的端口 8080 映射到 localhost 端口 3000。Elastic Beanstalk Docker 容器始终在容器上的端口 8080 上公开应用程序。`-it` 标志将映像作为交互式进程运行。当容器存在时，`--rm` 标志将清理容器文件系统。您可以选择包含 `-d` 标志以将映像作为守护程序运行。

   ```
   $ docker run -it --rm -p 3000:8080 my-app-image
   ```

1. 要查看示例应用程序，请将以下 URL 键入您的 Web 浏览器。

   ```
   http://localhost:3000
   ```  
![在 Web 浏览器中显示的 GlassFish 示例应用程序](http://docs.amazonaws.cn/elasticbeanstalk/latest/dg/images/dockerpreconfig-webpage.png)

### 部署到 Elastic Beanstalk
<a name="create_deploy_dockerpreconfig.walkthrough.deploy"></a>

在测试应用程序后，可随时将其部署到 Elastic Beanstalk。

**将应用程序部署到 Elastic Beanstalk**

1. 在应用程序的根文件夹中，将 `Dockerfile` 重命名为 `Dockerfile.local`。Elastic Beanstalk 若要使用 `Dockerfile`，则必须执行此步骤，该文件中包含关于 Elastic Beanstalk 在 Elastic Beanstalk 环境中的每个 Amazon EC2 实例上构建自定义 Docker 映像的正确说明。
**注意**  
如果您的 `Dockerfile` 包含修改平台版本的基础 Docker 映像的指令，则无需执行此步骤。如果您的 `Dockerfile` 仅包含用来指定从中构建容器的基本映像的 `Dockerfile` 行，则完全无需使用 `FROM`。在这种情况下，`Dockerfile` 是冗余的。

1. 创建应用程序源包。

   ```
   ~/eb-preconf-example$ zip myapp.zip -r *
   ```

1. [使用以下预配置链接打开 Elastic Beanstalk 控制台：console.aws.amazon。 com/elasticbeanstalk/home\#/newApplication？ 应用程序名称=教程&环境类型= LoadBalanced](https://console.amazonaws.cn/elasticbeanstalk/home#/newApplication?applicationName=tutorials&environmentType=LoadBalanced)

1. 对于 **Platform (平台)**，在 **Preconfigured – Docker (预配置 – Docker)** 下，选择 **Glassfish**。

1. 对于 **Application code (应用程序节点)**，选择 **Upload your code (上传您的节点)**，然后选择 **Upload (上传)**。

1. 选择 **Local file (本地文件)**，再选择 **Browse (浏览)**，然后打开您刚刚创建的应用程序源包。

1. 选择**上传**。

1. 选择**复查并启动**。

1. 查看可用设置并选择 **Create app (创建应用程序)**。

1. 创建环境后，您可以查看已部署的应用程序。选择控制台控制面板顶部显示的环境 URL。

## 将 GlassFish 应用程序部署到 Docker 平台：2023 年亚马逊 Linux 的迁移之路
<a name="docker-glassfish-tutorial"></a>

本教程的目标是为使用预配置的 Docker GlassFish 平台（基于亚马逊 Linux AMI）的客户提供向亚马逊 Linux 2023 的迁移路径。您可以通过部署 GlassFish 将 GlassFish 应用程序迁移到亚马逊 Linux 2023，将应用程序代码迁移到亚马逊 Linux 2023 Docker 镜像。

本教程将引导你使用 Amazon Elastic Beanstalk Docker 平台将基于 [Java EE 应用服务器的应用程序部署到 E GlassFish ](https://www.oracle.com/middleware/technologies/glassfish-server.html) lastic Beanstalk 环境中。

我们演示两种构建 Docker 映像的方法：
+ **简单** — 提供您的 GlassFish 应用程序源代码，让 Elastic Beanstalk 在配置环境的过程中构建和运行 Docker 映像。这很容易设置，但代价是增加实例预置时间。
+ **高级** – 构建包含应用程序代码和依赖关系的自定义 Docker 映像，并将其提供给 Elastic Beanstalk 以在您的环境中使用。这种方法的参与度稍高一些，并减少了环境中实例的预置时间。

### 先决条件
<a name="docker-glassfish-tutorial.prereqs"></a>

本教程假设您对基本 Elastic Beanstalk 操作、Elastic Beanstalk 命令行界面（EB CLI）和 Docker 有一定了解。如果尚不了解，请按照[了解如何开始使用 Elastic Beanstalk](GettingStarted.md)中的说明操作以启动您的第一个 Elastic Beanstalk 环境。本教程使用 [EB CLI](eb-cli3.md)，但您也可以使用 Elastic Beanstalk 控制台创建环境并上传应用程序。

要完成本教程，您需要做以下 Docker 组件：
+ 在本地安装有效的 Docker。有关更多信息，请参阅 Docker 文档网站上的[获取 Docker](https://docs.docker.com/install/)。
+ 访问 Docker Hub。您需要创建一个 Docker ID 才能访问 Docker Hub。有关更多信息，请参阅 Docker 文档网站上的[共享应用程序](https://docs.docker.com/get-started/04_sharing_app/)。

要了解有关在 Elastic Beanstalk 平台上配置 Docker 环境的更多信息，请参阅同一章中的[准备 Docker 映像以部署到 Elastic Beanstalk](single-container-docker-configuration.md)。

### 简单示例：提供您的应用程序代码
<a name="docker-glassfish-tutorial.simple"></a>

这是部署 GlassFish 应用程序的简便方法。提供您的应用程序源代码以及本教程中包含的 `Dockerfile`。Elastic Beanstalk 会生成一个 Docker 镜像，其中包含你的应用程序和软件堆栈。 GlassFish 然后，Elastic Beanstalk 在环境实例上运行该映像。

此方法的一个问题是，无论 Elastic Beanstalk 何时为您的环境创建实例，都会在本地构建 Docker 映像。映像构建会增加实例预置时间。这种影响不限于初始环境创建，也会在扩展操作期间发生。

**使用示例 GlassFish 应用程序启动环境**

1. 下载示例 `docker-glassfish-al2-v1.zip`，然后将 `.zip` 文件展开到开发环境的目录中。

   ```
   ~$ curl https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/samples/docker-glassfish-al2-v1.zip --output docker-glassfish-al2-v1.zip
   ~$ mkdir glassfish-example
   ~$ cd glassfish-example
   ~/glassfish-example$ unzip ../docker-glassfish-al2-v1.zip
   ```

   您的目录结构应如下所示。

   ```
   ~/glassfish-example
   |-- Dockerfile
   |-- Dockerrun.aws.json
   |-- glassfish-start.sh
   |-- index.jsp
   |-- META-INF
   |   |-- LICENSE.txt
   |   |-- MANIFEST.MF
   |   `-- NOTICE.txt
   |-- robots.txt
   `-- WEB-INF
       `-- web.xml
   ```

   以下文件是在环境中构建和运行 Docker 容器的关键：
   + `Dockerfile` – 提供 Docker 用于构建具有应用程序和所需依赖关系的映像的说明。
   + `glassfish-start.sh` – Docker 映像运行以启动应用程序的 Shell 脚本。
   + `Dockerrun.aws.json`— 提供日志密钥，以包括 GlassFish 应用程序服务器登录[日志文件请求](using-features.logging.md)。如果您对 GlassFish 日志不感兴趣，可以省略此文件。

1. 为到 Elastic Beanstalk 的部署配置本地目录。

   ```
   ~/glassfish-example$ eb init -p docker {{glassfish-example}}
   ```

1. （可选）使用 **eb local run** 命令在本地生成并运行您的容器。

   ```
   ~/glassfish-example$ eb local run --port 8080
   ```
**注意**  
要了解有关 **eb local** 命令的更多信息，请参阅 [**eb local**](eb3-local.md)。Windows 中不支持此命令。或者，您也可以使用 **docker build** 和 **docker run** 命令生成并运行您的容器。有关更多信息，请参阅 [Docker 文档](https://docs.docker.com/)。

1. （可选）当您的容器正在运行时，可使用 **eb local open** 命令在 Web 浏览器中查看您的应用程序。或者，在 Web 浏览器中打开 [http://localhost:8080/](http://localhost:8080/)。

   ```
   ~/glassfish-example$ eb local open
   ```

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

   ```
   ~/glassfish-example$ eb create {{glassfish-example-env}}
   ```

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

   ```
   ~/glassfish-example$ eb open
   ```

完成使用该示例后，终止环境并删除相关资源。

```
~/glassfish-example$ eb terminate --all
```

### 高级示例：提供预构建的 Docker 映像
<a name="docker-glassfish-tutorial.advanced"></a>

这是一种更高级的 GlassFish 应用程序部署方式。在第一个示例的基础上，您创建了一个包含应用程序代码和 GlassFish 软件堆栈的 Docker 镜像，然后将其推送到 Docker Hub。完成此一次性步骤后，您可以根据自定义映像启动 Elastic Beanstalk 环境。

当您启动环境并提供 Docker 映像时，环境中的实例会直接下载并使用此映像，而不需要构建 Docker 映像。因此，实例预置时间会减少。

**注意**  
以下步骤将创建一个公开可用的 Docker 映像。
您将使用本地安装的 Docker 中的 Docker 命令以及 Docker Hub 凭据。有关更多信息，请参阅本主题中的前面的*先决条件*部分。

**使用预构建的 GlassFish 应用程序 Docker 镜像启动环境**

1. 下载并展开示例 `docker-glassfish-al2-v1.zip`，如前面的[简单示例](#docker-glassfish-tutorial.simple)所示。如果您已完成该示例，则可以使用已有的目录。

1. 构建一个 Docker 映像并将其推送到 Docker Hub。输入你的 Docker ID {{docker-id}} 以登录 Docker Hub。

   ```
   ~/glassfish-example$ docker build -t {{docker-id}}/beanstalk-glassfish-example:latest .
   ~/glassfish-example$ docker push {{docker-id}}/beanstalk-glassfish-example:latest
   ```
**注意**  
在推送映像之前，您可能需要运行 **docker login**。如果您运行不带参数的命令，系统将提示您输入 Docker Hub 凭据。

1. 创建其他目录。

   ```
   ~$ mkdir glassfish-prebuilt
   ~$ cd glassfish-prebuilt
   ```

1. 将以下示例复制到名为 `Dockerrun.aws.json` 的文件中。  
**Example `~/glassfish-prebuilt/Dockerrun.aws.json`**  

   ```
   {
     "AWSEBDockerrunVersion": "1",
     "Image": {
       "Name": "{{docker-username}}/beanstalk-glassfish-example"
     },
     "Ports": [
       {
         "ContainerPort": 8080,
         "HostPort": 8080
       }
     ],
     "Logging": "/usr/local/glassfish5/glassfish/domains/domain1/logs"
   }
   ```

1. 为到 Elastic Beanstalk 的部署配置本地目录。

   ```
   ~/glassfish-prebuilt$ eb init -p docker {{glassfish-prebuilt$}}
   ```

1. （可选）使用 **eb local run** 命令在本地运行容器。

   ```
   ~/glassfish-prebuilt$ eb local run --port 8080
   ```

1. （可选）当您的容器正在运行时，可使用 **eb local open** 命令在 Web 浏览器中查看您的应用程序。或者，在 Web 浏览器中打开 [http://localhost:8080/](http://localhost:8080/)。

   ```
   ~/glassfish-prebuilt$ eb local open
   ```

1. 使用 **eb create** 命令创建环境并部署 Docker 映像。

   ```
   ~/glassfish-prebuilt$ eb create {{glassfish-prebuilt-env}}
   ```

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

   ```
   ~/glassfish-prebuilt$ eb open
   ```

完成使用该示例后，终止环境并删除相关资源。

```
~/glassfish-prebuilt$ eb terminate --all
```