适用于 Docker 的教程 AWS Cloud9 - AWS Cloud9

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

适用于 Docker 的教程 AWS Cloud9

本教程向您展示如何将 AWS Cloud9 SSH 开发环境连接到亚马逊 EC2 中亚马逊 Linux 实例中正在运行的 Docker 容器。这使您可以使用 AWS Cloud9 IDE 处理 Docker 容器内的代码和文件,并在该容器上运行命令。有关 Docker 的信息,请参阅 Docker 网站上的 Docker 是什么

按照本教程并创建此示例可能会导致您的 AWS 账户被扣款。其中包括可能对 Amazon EC2 等服务收取的费用。有关更多信息,请参阅 Amazon EC2 定价

先决条件

  • 您应该有一个运行 Amazon Linux 或 Ubuntu Server 的 Amazon EC2 实例。此示例假设您的账户中已经有一个运行亚马逊 Linux 或 Ubuntu 服务器的 Amazon EC2 实例。 AWS 要启动 Amazon EC2 实例,请参阅启动 Linux 虚拟机。在向导的 Choose an Amazon Machine Image (AMI)(选择 Amazon Machine Image (AMI))页面中,选择其显示名称以 Amazon Linux AMIUbuntu Server 开头的 AMI。

  • 如果 Amazon EC2 实例在 Amazon VPC 中运行,则存在额外的要求。请参阅 AWS Cloud9 开发环境的 VPC 设置

  • Amazon EC2 实例应至少具有 8 到 16 GB 的可用磁盘空间。此示例使用 3 GB 以上的 Docker 映像,并且可使用 3 GB 或更多磁盘空间的额外增量来构建映像。如果您尝试在可用空间为 8 GB 或更少的磁盘上运行此示例,我们发现,Docker 映像可能不会构建或 Docker 容器可能不会运行。要检查实例的可用磁盘空间,可以在实例上运行诸如 df -h 这样的命令(针对“用户可读格式的磁盘文件系统信息”)。要增加现有实例的磁盘大小,请参阅 Amazon EC2 用户指南中的修改卷

步骤 1:安装并运行 Docker

在此步骤中,检查 Docker 是否安装在 Amazon EC2 实例上,如果未安装 Docker,则请安装它。安装 Docker 后,在实例上运行它。

  1. 通过使用 SSH 客户端(如 ssh 实用工具或 PuTTY)连接到正在运行的 Amazon EC2 实例。为此,请参阅启动 Linux 虚拟机中的“步骤 3:连接到您的实例”。

  2. 检查是否在实例上安装了 Docker。为此,请在实例上将 docker 命令与 --version 选项一起运行。

    docker --version

    如果已安装 Docker,则将显示 Docker 版本和版本号。在此情况下,请向前跳至此过程中后面的步骤 5。

  3. 安装 Docker。为此,请将 yum 命令或 apt 命令与 install 操作一起运行,并指定要安装的 docker docker.io 程序包。

    对于 Amazon Linux:

    sudo yum install -y docker

    对于 Ubuntu Server:

    sudo apt install -y docker.io
  4. 确认已安装 Docker。为此,请再次运行 docker --version 命令。将显示 Docker 版本和版本号。

  5. 运行 Docker。为此,请将 service 命令与 docker 服务和 start 操作一起运行。

    sudo service docker start
  6. 确认 Docker 正在运行。为此,请将 docker 命令与 info 操作一起运行。

    sudo docker info

    如果 Docker 正在运行,则将显示有关 Docker 的信息。

步骤 2:构建镜像

在此步骤中,您使用 Dockerfile 在实例上构建一个 Docker 映像。此示例使用包括 Node.js 和示例聊天服务器应用程序的映像。

  1. 在实例上,创建 Dockerfile。为此,在 SSH 客户端仍连接到实例的情况下,在实例上的 /tmp 目录中,创建一个名为 Dockerfile 的文件。例如,运行 touch 命令,如下所示。

    sudo touch /tmp/Dockerfile
  2. 将以下内容添加到 Dockerfile 文件。

    # Build a Docker image based on the Amazon Linux 2 Docker image. FROM amazonlinux:2 # install common tools RUN yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm RUN yum update -y RUN yum install -y sudo bash curl wget git man-db nano vim bash-completion tmux gcc gcc-c++ make tar # Enable the Docker container to communicate with AWS Cloud9 by # installing SSH. RUN yum install -y openssh-server # Ensure that Node.js is installed. RUN yum install -y nodejs # Create user and enable root access RUN useradd --uid 1000 --shell /bin/bash -m --home-dir /home/ubuntu ubuntu && \ sed -i 's/%wheel\s.*/%wheel ALL=NOPASSWD:ALL/' /etc/sudoers && \ usermod -a -G wheel ubuntu # Add the AWS Cloud9 SSH public key to the Docker container. # This assumes a file named authorized_keys containing the # AWS Cloud9 SSH public key already exists in the same # directory as the Dockerfile. RUN mkdir -p /home/ubuntu/.ssh ADD ./authorized_keys /home/ubuntu/.ssh/authorized_keys RUN chown -R ubuntu /home/ubuntu/.ssh /home/ubuntu/.ssh/authorized_keys && \ chmod 700 /home/ubuntu/.ssh && \ chmod 600 /home/ubuntu/.ssh/authorized_keys # Update the password to a random one for the user ubuntu. RUN echo "ubuntu:$(cat /dev/urandom | tr -dc 'a-zA-Z0-9' | fold -w 32 | head -n 1)" | chpasswd # pre-install Cloud9 dependencies USER ubuntu RUN curl https://d2j6vhu5uywtq3.cloudfront.net/static/c9-install.sh | bash USER root # Start SSH in the Docker container. CMD ssh-keygen -A && /usr/sbin/sshd -D

    要将上述内容添加到 Dockerfile 文件,您可以在实例上使用 vi 实用工具,如下所示。

    1. 使用 AWS Cloud9 打开和编辑/tmp/Dockerfile文件。

      sudo vi /tmp/Dockerfile
    2. 将上述内容粘贴到 Dockerfile 文件。如果不确定如何执行此操作,请参阅 SSH 客户端文档。

    3. 切换到命令模式。要执行此操作,请按 Esc 键。(-- INSERT -- 将从窗口底部消失。)

    4. 键入 :wq(以写入 /tmp/Dockerfile 文件,保存此文件,然后退出 vi),然后按 Enter

    注意

    您可以从 AWS CodeBuild中访问经常更新的 Docker 镜像列表。有关更多信息,请参阅《AWS CodeBuild 用户指南》 CodeBuild中提供的 Docker 镜像

  3. 在实例上,创建一个包含供 Docker 容器使用的 AWS Cloud9 SSH 公钥的文件。为此,请在 Dockerfile 文件所在的目录中,创建一个名为 authorized_keys 的文件,例如,通过运行 touch 命令。

    sudo touch /tmp/authorized_keys
  4. 将 AWS Cloud9 SSH 公钥添加到authorized_keys文件中。要获取 AWS Cloud9 SSH 公钥,请执行以下操作:

    1. 打开 AWS Cloud9 控制台,网址为 https://console.aws.amazon.com/cloud9/

    2. 在 AWS 导航栏的 AWS 区域选择器中,选择您要在本主题后面创建 AWS Cloud9 开发环境的 AWS 区域。

    3. 如果显示欢迎页面,请在 “新建 AWS Cloud9 环境” 中选择 “创建环境”。如未显示,则选择 Create environment(创建环境)

    4. Name environment(命名环境)页面上,为 Name(名称)键入环境的名称。(在这里键入的名称不重要。稍后您将选择其他名称。)

    5. 选择下一步

    6. 对于 Environment type(环境类型),请选择 Connect and run in remote server (SSH)(连接并在远程服务器中运行 (SSH))

    7. 展开 View public SSH key (查看公有 SSH 密钥)

    8. 选择 Copy key to clipboard(将密钥复制到剪贴板)。(这位于 View public SSH key(查看公有 SSH 密钥)Advanced settings(高级设置)之间。)

    9. 选择取消

    10. 将剪贴板的内容粘贴到 authorized_keys 文件中,然后保存此文件。例如,可以使用 vi 实用工具,如此步骤前面所述。

  5. 通过将 docker 命令与 build 操作一起运行,将标签 cloud9-image:latest 添加到镜像并指定要使用的 Dockerfile 文件的路径来构建镜像。

    sudo docker build -t cloud9-image:latest /tmp

    如果成功,生成输出的最后两行将显示 Successfully builtSuccessfully tagged

    要确认 Docker 已成功构建映像,请将 docker 命令与 image ls 操作一起运行。

    sudo docker image ls

    如果成功,输出将显示一个条目(其中,REPOSITORY 字段设置为 cloud9-imageTAG 字段设置为 latest)。

  6. 记下 Amazon EC2 实例的公有 IP 地址。您将在步骤 4:创建环境中需要它。如果您不确定实例的公有 IP 地址,则可在实例上运行以下命令来获取此地址。

    curl http://169.254.169.254/latest/meta-data/public-ipv4

步骤 3:运行容器

在此步骤中,在实例上运行 Docker 容器。此容器基于在上一步中构建的映像。

  1. 要运行 Docker 容器,请在实例上将 docker 命令与 run 操作和以下选项一起运行。

    sudo docker run -d -it --expose 9090 -p 0.0.0.0:9090:22 --name cloud9 cloud9-image:latest
    • -d 在已分离模式下运行容器,以便在用于运行容器的根进程(此示例中为 SSH 客户端)退出时退出。

    • -it 运行带分配的伪 TTY 的容器并使 STDIN 保持打开状态,即使未附加容器也是如此。

    • --expose 使指定端口(此示例中为端口 9090)可通过容器使用。

    • -p 使指定端口在内部通过指定 IP 地址和端口可供 Amazon EC2 实例使用。在此示例中,可通过 Amazon EC2 实例上的端口 22 内部访问容器上的端口 9090

    • --name 是容器的用户可读名称(此示例中为 cloud9)。

    • cloud9-image:latest 是要用于运行容器的已构建映像的用户可读名称。

    要确认 Docker 正在成功运行容器,请将 docker 命令与 container ls 操作一起运行。

    sudo docker container ls

    如果成功,输出将显示一个条目(其中,IMAGE 字段设置为 cloud9-image:latestNAMES 字段设置为 cloud9)。

  2. 登录运行的容器。为此,请将 docker 命令与 exec 操作和以下选项一起运行。

    sudo docker exec -it cloud9 bash
    • -it 运行带分配的伪 TTY 的容器并使 STDIN 保持打开状态,即使未附加容器也是如此。

    • cloud9 是运行的容器的用户可读名称。

    • bash 在运行的容器中启动标准 Shell。

    如果成功,则终端提示符将更改为显示登录用户的容器名称和容器 ID。

    注意

    如果您需要从运行的容器注销,请运行 exit 命令。终端提示符将更改回显示登录用户的实例名称和实例的私有 DNS。容器应仍在运行中。

  3. 对于正在运行的容器上 AWS Cloud9 要在登录后启动的目录,请将其访问权限设置为rwxr-xr-x。这意味着所有者的 read-write-execute 权限、群组的读取执行权限以及其他人的读取执行权限。例如,如果目录的路径为 ~,则可以通过在运行的容器中运行 chmod 命令来设置对应目录的这些权限,如下所示。

    sudo chmod u=rwx,g=rx,o=rx ~
  4. 记下运行的容器上包含 Node.js 二进制文件的目录的路径,因为您在步骤 4:创建环境中将需要它。如果您不确定此路径,请在运行的容器上运行以下命令来获取它。

    which node

步骤 4:创建环境

在此步骤中,您将使用 AWS Cloud9 创建 AWS Cloud9 SSH 开发环境并将其连接到正在运行的 Docker 容器。 AWS Cloud9 创建环境后,它会显示 AWS Cloud9 IDE,以便您可以开始使用容器中的文件和代码。

您可以使用 AWS Cloud9 控制台创建 AWS Cloud9 SSH 开发环境。您无法使用 CLI 创建 SSH 环境。

先决条件

  • 首先确保您已完成 设置 AWS Cloud9 中的步骤。这样,您便可以登录到 AWS Cloud9 控制台并创建环境。

  • 确定要连接到环境的现有云计算实例(例如,您的中的 Amazon EC2 实例 AWS 账户)或您 AWS Cloud9 自己的服务器。

  • 确保现有实例或您自己的服务器满足所有 SSH 托管要求。这包括安装特定版本的 Python、Node.js 和其他组件;对于您希望的登录后 AWS Cloud9 开始目录设置特定权限;以及设置任何关联的 Amazon Virtual Private Cloud。

创建 SSH 环境

  1. 确保您已完成上述先决条件。

  2. 使用 SSH 客户端连接到现有实例或您自己的服务器(如果您尚未连接)。这确保了您可以向实例或服务器添加必要的公有 SSH 密钥值。这些内容将在此过程的稍后介绍。

    注意

    要连接到现有的 AWS Cloud 计算实例,请参阅以下一项或多项资源:

    要连接到您自己的服务器,请使用 SSH。已经在 macOS 和 Linux 操作系统上安装了 SSH。要在 Windows 上使用 SSH 连接到服务器,您必须安装 PuTTY

  3. 登录 AWS Cloud9 主机,网址为 https://console.aws.amazon.com/cloud9/

  4. 登录 AWS Cloud9 控制台后,在顶部导航栏中选择一个 AWS 区域 来创建环境。有关可用列表 AWS 区域,请参阅AWS Cloud9中的AWS 一般参考

    AWS Cloud9 控制台中的区域选择器
  5. 如果您是第一次创建开发环境,则将显示欢迎页面。在 “新建 AWS Cloud9 环境” 面板中,选择 “创建环境”。

    如果您之前创建过开发环境,您也可以展开屏幕左侧的窗格。选择 Your environments(您的环境),然后选择 Create environment(创建环境)。

    欢迎页面:

    如果显示欢迎页面,则选择“Create environment(创建环境)”按钮

    或在 Your environment(您的环境)页面内:

    如果未显示欢迎页面,则选择“Create environment(创建环境)”按钮
  6. Create environment(创建环境)页面上,输入环境的名称。

  7. Description(描述)中输入对环境的描述。在本教程中,请使用 This environment is for the AWS Cloud9 tutorial.

  8. 对于 Environment type(环境类型),请从以下选项中选择 Existing Compute(现有计算):

    • 新的 EC2 实例 — 启动 AWS Cloud9 可以直接通过 SSH 连接的 Amazon EC2 实例。

    • 现有计算-启动不需要任何开放入站端口的 Amazon EC2 实例。 AWS Cloud9 通过连接到实例AWS Systems Manager

      • 如果您选择 Existing compute(现有计算)选项,将创建服务角色和 IAM 实例配置文件,以允许 Systems Manager 代表您与 EC2 实例进行交互。您可以在界面下方的 Systems Manager 访问的服务角色和实例配置文件部分查看两者的名称。有关更多信息,请参阅 使用 AWS Systems Manager 访问非入口 EC2 实例

    警告

    为您的环境创建 EC2 实例可能会导致您 AWS 账户 收取 Amazon EC2 费用。使用 Systems Manager 管理与 EC2 实例的连接不会产生额外费用。

    警告

    AWS Cloud9 使用 SSH 公钥安全地连接到您的服务器。要建立安全连接,请将我们的公有密钥添加到您的 ~/.ssh/authorized_keys 文件中,并在以下步骤中提供您的登录凭证。选择 Copy key to clipboard(将密钥复制到剪贴板)以复制 SSH 密钥,或选择 View public SSH key(查看 SSH 公有密钥)以查看密钥。

  9. Existing compute(现有计算)面板上,对于 User(用户),请输入您在此过程中之前连接到实例或服务器时使用的登录名。例如,对于 AWS Cloud 计算实例,该登录名可能为 ec2-userubunturoot

    注意

    我们建议将登录名与实例或服务器上的管理权限或管理员用户关联。更具体地说,我们建议此登录名应在实例或服务器上拥有 Node.js 安装。要进行此检查,请在实例或服务器的终端上运行命令 ls -l $(which node)(如果您使用的是 nvm,请运行 ls -l $(nvm which node))。此命令会显示 Node.js 安装的拥有者名称。它还会显示安装的权限、组名称和位置。

  10. 对于 Host(主机),请输入公有 IP 地址(首选)或者实例或服务器的主机名。

  11. 在 “口” 中,输入您 AWS Cloud9 要用来尝试连接到实例或服务器的端口。您也可保留默认端口。

  12. 选择 Additional details - optional(其他详细信息 – 可选)以显示环境路径、node.js 二进制文件路径和 SSH 跳转主机信息。

  13. 环境路径中,输入您要 AWS Cloud9 从中启动的实例或服务器上的目录路径。您之前在此步骤的先决条件中确定了这一点。如果将此项留空, AWS Cloud9 将使用实例或服务器在登录之后通常开始使用的目录。这通常为主目录或默认目录。

  14. 对于 Path to Node.js binary path(Node.js 二进制文件路径),请输入路径信息以指定实例或服务器上指向 Node.js 二进制文件的路径。要获取路径,您可以在实例或服务器上运行命令 which node(在使用 nvm 时为 nvm which node)。例如,路径可能为 /usr/bin/node。如果将此项留空, AWS Cloud9 在尝试连接时,将尝试猜测 Node.js 二进制文件所在的位置。

  15. 对于 SSH jump host(SSH 跳转主机),输入有关实例或服务器使用的跳转主机的信息。使用格式 USER_NAME@HOSTNAME:PORT_NUMBER(例如 ec2-user@:ip-192-0-2-0:22)。

    跳转主机必须满足以下要求:

    • 它必须可使用 SSH 通过公有互联网访问。

    • 它必须允许任意 IP 地址通过指定端口的入站访问。

    • 复制到现有实例或服务器上 ~/.ssh/authorized_keys 文件中的公有 SSH 密钥值还必须复制到跳转主机上的 ~/.ssh/authorized_keys 文件中。

    • 必须安装有 Netcat。

  16. 通过为每个标签提供,添加最多 50 个标签。要执行此操作,请选择 Add new tag(添加新标签)。这些标签作为资源标签附加到 AWS Cloud9 环境,并传播到以下基础资源: AWS CloudFormation 堆栈、Amazon EC2 实例和 Amazon EC2 安全组。要了解有关标签的更多信息,请参阅 IAM 用户指南中的使用 AWS 资源标签控制访问权限以及本指南中有关标签的高级信息

    警告

    如果您在创建标签后更新这些标签,则更改不会传播到底层资源。有关更多信息,请参阅标签高级信息中的 将标签更新传播到底层资源

  17. 选择 Create(创建)以创建您的环境,然后系统会将您重定向到主页。成功创建帐户后, AWS Cloud9 控制台顶部会出现一个绿色的闪光条。您可以选择新环境并选择 Open in Cloud9(在 Cloud9 中打开)以启动 IDE。

    AWS Cloud9 AWS Cloud9 控制台中的 IDE 选择器

    如果未能创建账户,则 AWS Cloud9 控制台顶部会出现一个红色的闪光条。由于您的网络浏览器、 AWS 访问权限、实例或关联网络存在问题,您的账户可能无法创建。您可以在 AWS Cloud9 故障排除部分找到有关可能修复导致账户失败问题的信息。

注意

如果您的环境使用代理来访问 Internet,则必须向其提供代理详细信息, AWS Cloud9 这样它才能安装依赖关系。有关更多信息,请参阅 无法安装依赖项

步骤 5:运行代码

在此步骤中,您将使用 AWS Cloud9 IDE 在正在运行的 Docker 容器中运行示例应用程序。

  1. 显示正在运行的容器的 AWS Cloud9 IDE 后,启动示例聊天服务器。为此,请在 Environment (环境) 窗口中,右键单击示例 workspace/server.js 文件,然后选择 Run (运行)

  2. 预览示例应用程序。为此,请在 Environment (环境) 窗口中,打开 workspace/client/index.html 文件。然后,在菜单栏上,依次选择 Tools (工具)、Preview (预览)、Preview Running Application (预览运行的应用程序)

  3. 在应用程序预览标签页上,对于 Your Name (您的姓名),键入您的姓名。对于 Message (消息),请输入消息。然后选择 Send (发送)。聊天服务器会将您的姓名和消息添加到列表中。

步骤 6:清理

在此步骤中,您将删除环境并从 Amazon EC2 实例中移除 AWS Cloud9 和 Docker 支持文件。此外,为了防止在您使用完此示例后继续向您的 AWS 账户收费,您应该终止运行 Docker 的 Amazon EC2 实例。

步骤 6.1:删除环境

要删除环境,请参阅 在 AWS Cloud9 中删除环境

步骤 6.2:删除容器中的 AWS Cloud9 支持文件

删除环境后,一些 AWS Cloud9 支持文件仍保留在容器中。如果您想继续使用容器但不再需要这些支持文件,请在容器登录后从您指定的 AWS Cloud9 目录中删除该文件.c9夹。例如,如果目录为 ~,请将 rm 命令与 -r 选项一起运行,如下所示。

sudo rm -r ~/.c9

步骤 6.3:删除实例中的 Docker 支持文件

如果您不想再在 Amazon EC2 实例上保留 Docker 容器、Docker 镜像和 Docker,但想要保留此实例,则可删除这些 Docker 支持文件,如下所示。

  1. 从实例中删除 Docker 容器。为此,请在实例上将 docker 命令与 stop rm 停止操作以及容器的用户可读名称一起运行。

    sudo docker stop cloud9 sudo docker rm cloud9
  2. 从实例中删除 Docker 映像。为此,请在实例上将 docker 命令与 image rm 操作和映像的标签一起运行。

    sudo docker image rm cloud9-image:latest
  3. 删除可能仍存在的任何其他 Docker 支持文件。为此,请在实例上将 docker 命令与 system prune 操作一起运行。

    sudo docker system prune -a
  4. 卸载 Docker。为此,请在实例上将 yum 命令与 remove 操作一起运行,以指定要卸载的 docker 程序包。

    对于 Amazon Linux:

    sudo yum -y remove docker

    对于 Ubuntu Server:

    sudo apt -y remove docker

    还可以删除之前创建的 Dockerfileauthorized_keys 文件。例如,在实例上运行 rm 命令。

    sudo rm /tmp/Dockerfile sudo rm /tmp/authorized_keys

步骤 6.4:终止实例

要终止 Amazon EC2 实例,请参阅 Amazon EC2 用户指南中的终止您的实例