AWS Cloud9 现已不再向新客户提供。AWS Cloud9 的现有客户可以继续正常使用该服务。了解更多
适用于 AWS Cloud9 的 Docker 教程
此教程说明如何将 AWS Cloud9 SSH 开发环境连接到正在 Amazon EC2 中的 Amazon Linux 实例内运行的 Docker 容器。这使您能够使用 AWS Cloud9 IDE 在 Docker 容器内处理代码和文件并在该容器上运行命令。有关 Docker 的信息,请参阅 Docker 网站上的 Docker 是什么
按照本教程操作并创建此示例可能会对您的 AWS 账户收费。其中包括可能对 Amazon EC2 等服务收取的费用。有关更多信息,请参阅 Amazon EC2 定价
先决条件
-
您应该有一个运行 Amazon Linux 或 Ubuntu Server 的 Amazon EC2 实例。本示例假定您已经有一个在 AWS 账户下运行 Amazon Linux 或 Ubuntu Server 的 Amazon EC2 实例。要启动 Amazon EC2 实例,请参阅启动 Linux 虚拟机
。在向导的 Choose an Amazon Machine Image (AMI)(选择 Amazon Machine Image (AMI))页面中,选择其显示名称以 Amazon Linux AMI 或 Ubuntu 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 后,在实例上运行它。
-
通过使用 SSH 客户端(如
ssh
实用工具或 PuTTY)连接到正在运行的 Amazon EC2 实例。为此,请参阅启动 Linux 虚拟机中的“步骤 3:连接到您的实例”。 -
检查是否在实例上安装了 Docker。为此,请在实例上将
docker
命令与--version
选项一起运行。docker --version
如果已安装 Docker,则将显示 Docker 版本和版本号。在此情况下,请向前跳至此过程中后面的步骤 5。
-
安装 Docker。为此,请将
yum
命令或apt
命令与install
操作一起运行,并指定要安装的docker
或docker.io
程序包。对于 Amazon Linux:
sudo yum install -y docker
对于 Ubuntu Server:
sudo apt install -y docker.io
-
确认已安装 Docker。为此,请再次运行
docker --version
命令。将显示 Docker 版本和版本号。 -
运行 Docker。为此,请将
service
命令与docker
服务和start
操作一起运行。sudo service docker start
-
确认 Docker 正在运行。为此,请将
docker
命令与info
操作一起运行。sudo docker info
如果 Docker 正在运行,则将显示有关 Docker 的信息。
步骤 2:构建镜像
在此步骤中,您使用 Dockerfile 在实例上构建一个 Docker 映像。此示例使用包括 Node.js 和示例聊天服务器应用程序的映像。
-
在实例上,创建 Dockerfile。为此,在 SSH 客户端仍连接到实例的情况下,在实例上的
/tmp
目录中,创建一个名为Dockerfile
的文件。例如,运行touch
命令,如下所示。sudo touch /tmp/Dockerfile
-
将以下内容添加到
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
实用工具,如下所示。-
使用 AWS Cloud9 打开和编辑
/tmp/Dockerfile
文件。sudo vi /tmp/Dockerfile
-
将上述内容粘贴到
Dockerfile
文件。如果不确定如何执行此操作,请参阅 SSH 客户端文档。 -
切换到命令模式。要执行此操作,请按
Esc
键。(-- INSERT --
将从窗口底部消失。) -
键入
:wq
(以写入/tmp/Dockerfile
文件,保存此文件,然后退出vi
),然后按Enter
。
注意
您可以从 AWS CodeBuild 中访问经常更新的 Docker 映像列表。有关详细信息,请参阅 AWS CodeBuild 用户指南中的 CodeBuild 提供的 Docker 镜像。
-
-
在实例上,创建一个文件,此文件包含要使用的 Docker 容器的 AWS Cloud9 SSH 公有密钥。为此,请在
Dockerfile
文件所在的目录中,创建一个名为authorized_keys
的文件,例如,通过运行touch
命令。sudo touch /tmp/authorized_keys
-
将 AWS Cloud9 SSH 公有密钥添加到
authorized_keys
文件。要获取 AWS Cloud9 SSH 公有密钥,请执行以下操作:-
打开 AWS Cloud9 控制台,地址:https://console.aws.amazon.com/cloud9/
。 -
在 AWS 区域选择器的 AWS 导航栏中,选择在本主题中稍后要在其中创建 AWS Cloud9 开发环境的 AWS 区域。
-
如果显示欢迎页面,则为 New AWS Cloud9 environment(新建 Amazon Cloud9 环境)选择 Create environment(创建环境)。如未显示,则选择 Create environment(创建环境)。
-
在 Name environment(命名环境)页面上,为 Name(名称)键入环境的名称。(在这里键入的名称不重要。稍后您将选择其他名称。)
-
选择下一步。
-
对于 Environment type(环境类型),请选择 Connect and run in remote server (SSH)(连接并在远程服务器中运行 (SSH))。
-
展开 View public SSH key (查看公有 SSH 密钥)。
-
选择 Copy key to clipboard(将密钥复制到剪贴板)。(这位于 View public SSH key(查看公有 SSH 密钥) 和 Advanced settings(高级设置)之间。)
-
选择取消。
-
将剪贴板的内容粘贴到
authorized_keys
文件中,然后保存此文件。例如,可以使用vi
实用工具,如此步骤前面所述。
-
-
通过将
docker
命令与build
操作一起运行,将标签cloud9-image:latest
添加到镜像并指定要使用的Dockerfile
文件的路径来构建镜像。sudo docker build -t cloud9-image:latest /tmp
如果成功,生成输出的最后两行将显示
Successfully built
和Successfully tagged
。要确认 Docker 已成功构建映像,请将
docker
命令与image ls
操作一起运行。sudo docker image ls
如果成功,输出将显示一个条目(其中,
REPOSITORY
字段设置为cloud9-image
,TAG
字段设置为latest
)。 -
记下 Amazon EC2 实例的公有 IP 地址。您将在步骤 4:创建环境中需要它。如果您不确定实例的公有 IP 地址,则可在实例上运行以下命令来获取此地址。
curl http://169.254.169.254/latest/meta-data/public-ipv4
步骤 3:运行容器
在此步骤中,在实例上运行 Docker 容器。此容器基于在上一步中构建的映像。
-
要运行 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:latest
,NAMES
字段设置为cloud9
)。 -
-
登录运行的容器。为此,请将
docker
命令与exec
操作和以下选项一起运行。sudo docker exec -it cloud9 bash
-
-it
运行带分配的伪 TTY 的容器并使 STDIN 保持打开状态,即使未附加容器也是如此。 -
cloud9
是运行的容器的用户可读名称。 -
bash
在运行的容器中启动标准 Shell。
如果成功,则终端提示符将更改为显示登录用户的容器名称和容器 ID。
注意
如果您需要从运行的容器注销,请运行
exit
命令。终端提示符将更改回显示登录用户的实例名称和实例的私有 DNS。容器应仍在运行中。 -
-
对于您希望 AWS Cloud9 在登录后从其开始的运行中容器上的目录,请将其访问权限设置为
rwxr-xr-x
。也就是说,对所有者设置为读写执行权限,对组设置为读取执行权限,而对其他用户设置为读取执行权限。例如,如果目录的路径为~
,则可以通过在运行的容器中运行chmod
命令来设置对应目录的这些权限,如下所示。sudo chmod u=rwx,g=rx,o=rx ~
-
记下运行的容器上包含 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 控制台并创建环境。
-
确定您希望 AWS Cloud9 将其连接到环境的现有云计算实例(例如,您的 AWS 账户 中的 Amazon EC2 实例)或您自己的服务器。
-
确保现有实例或您自己的服务器满足所有 SSH 托管要求。这包括安装特定版本的 Python、Node.js 和其他组件;对于您希望的登录后 AWS Cloud9 开始目录设置特定权限;以及设置任何关联的 Amazon Virtual Private Cloud。
创建 SSH 环境
-
确保您已完成上述先决条件。
-
使用 SSH 客户端连接到现有实例或您自己的服务器(如果您尚未连接)。这确保了您可以向实例或服务器添加必要的公有 SSH 密钥值。这些内容将在此过程的稍后介绍。
注意
要连接到现有 AWS Cloud 计算实例,请参阅以下一项或多项资源:
-
对于 Amazon EC2,请参阅《Amazon EC2 用户指南》中的连接到您的 Linux 实例。
-
有关 Amazon Lightsail,请参阅《Amazon Lightsail 文档》中的连接到基于 Linux/Unix 的 Lightsail 实例
。 -
有关 AWS Elastic Beanstalk,请参阅《AWS Elastic Beanstalk 开发人员指南》中的列出和连接到服务器实例。
-
有关 AWS OpsWorks,请参阅《AWS OpsWorks 用户指南》中的使用 SSH 登录 Linux 实例。
-
对于其他 AWS 服务,请参阅特定服务的文档。
要连接到您自己的服务器,请使用 SSH。已经在 macOS 和 Linux 操作系统上安装了 SSH。要在 Windows 上使用 SSH 连接到服务器,您必须安装 PuTTY
。 -
-
登录到 AWS Cloud9 控制台,网址:https://console.aws.amazon.com/cloud9/
。 -
登录到 AWS Cloud9 控制台后,在顶部导航栏中选择要在其中创建环境的 AWS 区域。有关可用的 AWS 区域 列表,请参阅《AWS 一般参考》中的 AWS Cloud9。
-
如果您是第一次创建开发环境,则将显示欢迎页面。在 New AWS Cloud9 environment(新 Amazon Cloud9 环境)面板中,选择 Create environment(创建环境)。
如果您之前创建过开发环境,您也可以展开屏幕左侧的窗格。选择 Your environments(您的环境),然后选择 Create environment(创建环境)。
在欢迎页面:
或在 Your environment(您的环境)页面内:
-
在 Create environment(创建环境)页面上,输入环境的名称。
-
在 Description(描述)中输入对环境的描述。在本教程中,请使用
This environment is for the AWS Cloud9 tutorial.
-
对于 Environment type(环境类型),请从以下选项中选择 Existing Compute(现有计算):
-
New EC2 instance(新 EC2 实例)– 启动 AWS Cloud9 可以直接通过 SSH 连接的 Amazon EC2 实例。
-
Existing compute(现有计算)– 启动不需要任何开放入站端口的 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 公有密钥)以查看密钥。 -
-
在 Existing compute(现有计算)面板上,对于 User(用户),请输入您在此过程中之前连接到实例或服务器时使用的登录名。例如,对于 AWS Cloud 计算实例,该登录名可能为
ec2-user
、ubuntu
或root
。注意
我们建议将登录名与实例或服务器上的管理权限或管理员用户关联。更具体地说,我们建议此登录名应在实例或服务器上拥有 Node.js 安装。要进行此检查,请在实例或服务器的终端上运行命令
ls -l $(which node)
(如果您使用的是nvm
,请运行ls -l $(nvm which node)
)。此命令会显示 Node.js 安装的拥有者名称。它还会显示安装的权限、组名称和位置。 -
对于 Host(主机),请输入公有 IP 地址(首选)或者实例或服务器的主机名。
-
对于 Port(端口),请输入您希望 AWS Cloud9 尝试连接到实例或服务器时使用的端口。您也可保留默认端口。
-
选择 Additional details - optional(其他详细信息 – 可选)以显示环境路径、node.js 二进制文件路径和 SSH 跳转主机信息。
-
对于 Environment path(环境路径),请输入实例或服务器上您希望从中启动 AWS Cloud9 的目录路径。您之前在此步骤的先决条件中确定了这一点。如果将此项留空,AWS Cloud9 将使用实例或服务器在登录之后通常开始使用的目录。这通常为主目录或默认目录。
-
对于 Path to Node.js binary path(Node.js 二进制文件路径),请输入路径信息以指定实例或服务器上指向 Node.js 二进制文件的路径。要获取路径,您可以在实例或服务器上运行命令
which node
(在使用nvm
时为nvm which node
)。例如,路径可能为/usr/bin/node
。如果将此项留空,AWS Cloud9 在尝试连接时,将尝试猜测 Node.js 二进制文件所在的位置。 -
对于 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。
-
-
通过为每个标签提供键和值,添加最多 50 个标签。要执行此操作,请选择 Add new tag(添加新标签)。这些标签将作为资源标签附加到 AWS Cloud9 环境,并传播到以下底层资源:AWS CloudFormation 堆栈、Amazon EC2 实例和 Amazon EC2 安全组。要了解有关标签的更多信息,请参阅 IAM 用户指南中的使用 AWS 资源标签控制访问以及本指南中有关标签的高级信息。
警告
如果您在创建标签后更新这些标签,则更改不会传播到底层资源。有关更多信息,请参阅标签高级信息中的 将标签更新传播到底层资源。
-
选择 Create(创建)以创建您的环境,然后系统会将您重定向到主页。成功创建账户后,AWS Cloud9 控制台顶部会出现一个绿色的闪光条。您可以选择新环境并选择 Open in Cloud9(在 Cloud9 中打开)以启动 IDE。
如果未能创建账户,则 AWS Cloud9 控制台顶部会出现一个红色的闪光条。您可能会由于 Web 浏览器、AWS 访问权限、实例或关联的网络的问题而未能创建账户。您可以在 AWS Cloud9 故障排除部分找到有关可能修复导致账户失败问题的信息。
注意
如果您的环境使用代理访问互联网,则必须将代理详细信息提供给 AWS Cloud9,以便它可以安装依赖关系。有关更多信息,请参阅 无法安装依赖项。
步骤 5:运行代码
在此步骤中,您使用 AWS Cloud9 IDE 在正在运行的 Docker 容器内运行示例应用程序。
-
在显示运行的容器的 AWS Cloud9 IDE 后,启动示例聊天服务器。为此,请在 Environment (环境) 窗口中,右键单击示例
workspace/server.js
文件,然后选择 Run (运行)。 -
预览示例应用程序。为此,请在 Environment (环境) 窗口中,打开
workspace/client/index.html
文件。然后,在菜单栏上,依次选择 Tools (工具)、Preview (预览)、Preview Running Application (预览运行的应用程序)。 -
在应用程序预览标签页上,对于 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 支持文件,如下所示。
-
从实例中删除 Docker 容器。为此,请在实例上将
docker
命令与stop
和rm
停止操作以及容器的用户可读名称一起运行。sudo docker stop cloud9 sudo docker rm cloud9
-
从实例中删除 Docker 映像。为此,请在实例上将
docker
命令与image rm
操作和映像的标签一起运行。sudo docker image rm cloud9-image:latest
-
删除可能仍存在的任何其他 Docker 支持文件。为此,请在实例上将
docker
命令与system prune
操作一起运行。sudo docker system prune -a
-
卸载 Docker。为此,请在实例上将
yum
命令与remove
操作一起运行,以指定要卸载的docker
程序包。对于 Amazon Linux:
sudo yum -y remove docker
对于 Ubuntu Server:
sudo apt -y remove docker
还可以删除之前创建的
Dockerfile
和authorized_keys
文件。例如,在实例上运行rm
命令。sudo rm /tmp/Dockerfile sudo rm /tmp/authorized_keys
步骤 6.4:终止实例
要终止 Amazon EC2 实例,请参阅《Amazon EC2 用户指南》中的终止您的实例。