AWS Cloud9
ユーザーガイド

AWS Cloud9 の Docker サンプル

このサンプルでは、Amazon EC2 の Amazon Linux インスタンスで実行中の Docker コンテナに AWS Cloud9 SSH 開発環境 を接続する方法を示します。これにより、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 仮想マシンの起動」を参照してください。ウィザードの [Amazon マシンイメージ (AMI) の選択] ページで、[Amazon Linux AMI] から始まる表示名の AMI または [Ubuntu Server] を選択します。

  • Amazon EC2 インスタンスが Amazon VPC 内で実行される場合は、追加の要件があります。AWS Cloud9 開発環境 の VPC の設定」を参照してください。

  • Amazon EC2 インスタンスには、少なくとも 8 ~ 16 GB の利用可能な空きディスク容量が必要です。 このサンプルでは、3 GB 以上のサイズの Docker イメージを使用し、イメージ構築のためにさらに 3 GB 以上のディスク空き容量を使用することがあります。8 GB 以下の空き容量のディスクでこのサンプルの実行を試行すると、Docker イメージが構築されない、あるいは Docker コンテナが実行されない結果となる場合があります。インスタンスの空きディスク容量を確認するには、インスタンスでdf -h(「人間が読める形式のディスクファイルシステム情報」用) などのコマンドを実行します。既存のインスタンスのディスクサイズを増やすには、Linux インスタンス用 Amazon EC2 ユーザーガイド の「ボリュームの修正」を参照してください。

ステップ 1: Docker のインストールと実行

このステップでは、Docker が Amazon EC2 インスタンスにインストールされているかを確認し、まだインストールされていない場合は Docker をインストールします。Docker をインストールしたら、インスタンスでこれを実行します。

  1. ssh ユーティリティや PuTTY などの SSH クライアントを使用して、実行中の Amazon EC2 インスタンスに接続します。これを行うには、「Linux 仮想マシンを起動する」の「ステップ 3: インスタンスに接続する」を参照してください。

  2. Docker がインスタンスにインストールされているかを確認します。これを行うには、--version オプションを使用して docker コマンドをインスタンスで実行します。

    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 が実行されていることを確認します。これを行うには、info アクションを指定して docker コマンドを実行します。

    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 cloud9/ws-nodejs Docker image. FROM cloud9/ws-nodejs # Enable the Docker container to communicate with AWS Cloud9 by # installing SSH. RUN apt update && apt install -y openssh-server # Ensure that Node.js is installed. RUN apt install -y nodejs && ln -s /usr/bin/nodejs /usr/bin/node # Disable password authentication by turning off the # Pluggable Authentication Module (PAM). RUN sed -i 's/UsePAM yes/UsePAM no/g' /etc/ssh/sshd_config # 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 # Start SSH in the Docker container. CMD /usr/sbin/sshd -D # 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

    上のコンテンツを Dockerfile ファイルに追加するには、次のようにインスタンスで vi ユーティリティを使用できます。

    1. vi を使用して /tmp/Dockerfile ファイルを開きます。

      sudo vi /tmp/Dockerfile
    2. Dockerfile ファイルに前述のコンテンツをを貼り付けます。方法が判らない場合は、SSH クライアントのドキュメントを参照してください。

    3. コマンドモードに切り替えます。これを行うには Esc キーを押します (ウィンドウの下部から -- INSERT -- が消えます)。

    4. :wq」と入力して (/tmp/Dockerfile ファイルに書き込み、このファイルを保存し、vi を終了して)、Enter キーを押します。

    注記

    追加の Docker イメージが GitHub ウェブサイトの c9/templates リポジトリにあります。以下の表は、利用できるイメージおよびそのコンテンツと定義を一覧表示しています。このリポジトリから別の Docker イメージを使用するには、Dockerfile の cloud9/ws-nodejs を、以下のいずれかのイメージ ID に置き換えます。

    イメージ ID 目次 定義

    cloud9/workspace

    Ubuntu 14.04.5 (Git, Node.js, OpenJDK、Apache Ant、Apache Maven、Nginx、MySQL、PostgreSQL、Ruby、Apache HTTP Server、PHP などの一般的なツールを使用)。

    定義

    cloud9/ws-android

    cloud9/workspace イメージのコンテンツ (Android SDK、Gradle および一般的な Android ツールを使用)。

    定義

    cloud9/ws-cpp

    cloud9/workspace イメージのコンテンツ (GNU コンパイラー (GCC) およびサンプル C と C++ コマンドラインアプリケーションを使用)。

    定義

    cloud9/ws-default

    cloud9/workspace イメージのコンテンツ (基本的な readme ファイルを使用)。

    定義

    cloud9/ws-html5

    cloud9/workspace イメージのコンテンツ (基本的なサンプル HTML ファイルを使用)。

    定義

    cloud9/ws-meteor

    cloud9/workspace イメージ (Meteor およびサンプル Meteor アプリケーションを使用)。

    定義

    cloud9/ws-nodejs (このサンプル)

    cloud9/workspace イメージのコンテンツ (Node.js の追加バージョンとサンプルチャートサーバーアプリケーションを使用)。

    定義

    cloud9/ws-php

    cloud9/workspace イメージのコンテンツ (基本的なサンプル PHP アプリケーションを使用)。

    定義

    cloud9/ws-python-plain

    cloud9/workspace イメージのコンテンツ (Python のいくつかのバージョンとサンプルウェブアプリケーションを使用)。

    定義

    cloud9/ws-python

    cloud9/workspace イメージのコンテンツ (Django を使用)。

    定義

    cloud9/ws-ruby

    cloud9/workspace イメージのコンテンツ (Ruby のいくつかのバージョンと Ruby on Rails を使用)。

    定義

    cloud9/ws-wordpress

    cloud9/workspace イメージのコンテンツ (WordPress を使用)。

    定義

  3. インスタンスで、Docker コンテナで使用するための AWS Cloud9SSH パブリックキーが含まれているファイルを作成します。これを行うには、touch コマンドを実行して、Dockerfile ファイルと同じディレクトリに authorized_keys という名前のファイルを作成します。

    sudo touch /tmp/authorized_keys
  4. authorized_keys ファイルに AWS Cloud9 SSH パブリックキーを追加します。AWS Cloud9 の SSH パブリックキーを取得するには、次の操作を行います。

    1. https://console.aws.amazon.com/cloud9/ で AWS Cloud9 コンソールを開きます。

    2. AWS ナビゲーションバーの AWS リージョンの選択で、このトピックでこれから説明するように、AWS Cloud9 開発環境 を作成する AWS リージョンを選択します。

    3. ウェルカムページが表示されたら、[New AWS Cloud9 environment (新しい AWS Cloud9 環境)] で、[Create environment (環境の作成)] を選択します。それ以外の場合は、[Create environment (環境の作成)] を選択します。

    4. [Name environment (環境に名前を付ける)] ページで、[Name (名前)] に 環境 の名前を入力します。(ここでは、名前は重要ではありません。後で別の名前を選択できます。)

    5. [Next step] を選択します。

    6. [Environment type (環境タイプ)] で [Connect and run in remote server (SSH) (リモートサーバーに接続して実行する)] を選択します。

    7. [View public SSH key (パブリック SSH キーを表示)] を展開します。

    8. [Copy key to clipboard (キーをクリップボードにコピー)] を選択します(これは [View public SSH key (パブリック SSH キーの表示)] と [Advanced settings (詳細設定)] の間になります)。

    9. [Cancel] を選択します。

    10. クリップボードのコンテンツを authorized_keys ファイルに貼り付け、このファイルを保存します。たとえば、このステップで前に説明したとおりに、vi ユーティリティを使用できます。

  5. イメージを構築します。そのために、dockerコマンドに build アクション、イメージに追加する cloud9-image:latest タグ、使用する Dockerfile ファイルへのパスを指定して実行します。

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

    成功すると、ビルド出力の最後の 2 行には Successfully built および Successfully 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 インスタンスの内部で利用できるようにします。このサンプルでは、コンテナのポート 9090 は、Amazon EC2 インスタンスのポート 22 を介して内部からアクセスできます。

    • --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 は、実行中のコンテナで標準のシェルを起動します。

    成功した場合、ターミナルプロンプトはログインしたユーザー名をコンテナとコンテナの ID に変更します。

    注記

    実行中のコンテナからログアウトする場合は、exit コマンドを実行します。ターミナルプロンプトはログインしたユーザー名をインスタンスとこのインスタンスのプライベート DNS に再度変更します。コンテナは実行中である必要があります。

  3. 実行中のコンテナでログイン後の AWS Cloud9 を開始する場所となるディレクトリで、アクセス許可を rwxr-xr-x に設定します。これは、所有者には読み取り/書き込み/実行のアクセス権限、グループには読み取り/実行のアクセス権限、その他には読み取り/実行のアクセス権限があることを意味します。たとえば、ディレクトリのパスが ~ である場合、実行中のコンテナで chmod コマンドを次のように実行して、ディレクトリにこれらのアクセス権限を設定できます。

    sudo chmod u=rwx,g=rx,o=rx ~
  4. ステップ 4: 環境 の作成 で必要となるため、Node.js バイナリを含む実行中のコンテナのディレクトリのパスをメモしておきます。このパスが分からない場合には、実行中のコンテナで次のコマンドを実行してこれを取得します。

    which node

ステップ 4: 環境 の作成

このステップでは、AWS Cloud9 を使用して AWS Cloud9 SSH 開発環境 を作成し、実行中の Docker コンテナにそれを接続します。AWS Cloud9 で作成した環境には AWS Cloud9 IDE が表示されるため、このコンテナのファイルとコードの使用を開始できます。

  1. 以下のようにして AWS Cloud9 コンソールにサインインします。

    • AWS アカウントを使用する唯一のユーザーである、または単一の AWS アカウント内の IAM ユーザーである場合は、https://console.aws.amazon.com/cloud9/ を参照してください。

    • 組織で AWS Single Sign-On (SSO) を使用している場合は、サインインの手順について AWS アカウント管理者にお問い合わせください。

    • AWS Educate Starter Account を使用している場合は、個々の学生のサインアップの「ステップ 2: AWS Cloud9 コンソールへのサインイン」を参照してください。

    • 教室内の学生である場合は、サインインの手順についてインストラクターにお問い合わせください。

  2. AWS ナビゲーションバーの AWS リージョンの選択を使用して、SSH 環境 を作成する AWS リージョンを選択します。

  3. ウェルカムページが表示されたら、[New AWS Cloud9 environment (新しい AWS Cloud9 環境)] で、[Create environment (環境の作成)] を選択します。それ以外の場合は、[Create environment (環境の作成)] を選択します。

  4. [Name environment (環境に名前を付ける)] ページで、[Name (名前)] に 環境 の名前を入力します。

  5. 環境 に説明を追加するには、[Description (説明)] ボックスに入力します。

  6. [Next step] を選択します。

  7. [Environment type: (環境タイプ:)] で、[Connect and run in remote server (SSH) (リモートサーバーに接続して実行 (SSH))] を選択します。

  8. [User (ユーザー)] に「ubuntu」と入力します。

  9. [ホスト] には、前に書き留めておいた Amazon EC2 インスタンスのパブリック IP アドレスを入力します。

  10. [Port (ポート)] に「9090」と入力します。

  11. [Advanced settings (詳細設定)] を展開します。

  12. [Environment path (環境パス)] に、実行中のコンテナでログイン後の AWS Cloud9 を開始する場所となるディレクトリへのパスを入力します。

  13. [Node.js binary path (Node.js バイナリパス)] は、前に書き留めた、実行中のコンテナで Node.js バイナリが格納されているディレクトリへのパスを入力します。

  14. [Next step] を選択します。

  15. [Create environment (環境の作成)] を選択します。

  16. [AWS Cloud9 Installer (AWS Cloud9 インストーラ)] ダイアログボックスが表示されたら、[Next (次へ)] を選択します。

  17. インストールするコンポーネントのリストで [c9.ide.lambda.docker] チェックボックスをオフにし、[Next (次へ)] を選択します。これは、AWS Cloud9 が Docker 内で Docker を実行することができないためです。

  18. [AWS Cloud9 Installer (AWS Cloud9 インストーラ)] ダイアログボックスに [Installation Completed (インストール完了)] と表示されたら、[Next (次へ)]、[Finish (完了)] の順に選択します。実行中のコンテナの AWS Cloud9 IDE が表示されたら、コンテナのファイルとコードの使用を開始できます。

注記

コンテナの実行が停止すると、再度コンテナの実行を開始するまで、IDE を使用してコンテナにアクセスできなくなります。この作業を実行するには、ステップ 3: コンテナの実行 に戻ります。

ステップ 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: クリーンアップ

このステップでは、環境 を削除し、AWS Cloud9 と Docker サポートファイルを Amazon EC2 インスタンスから削除します。また、このサンプルを使用し終わった後 AWS アカウントで料金が継続的に発生するのを防ぐために、Docker を実行している Amazon EC2 インスタンスを終了する必要があります。

ステップ 6.1: 環境 を削除する

環境 を削除する方法については、AWS Cloud9 で環境を削除する を参照してください。

ステップ 6.2: コンテナから AWS Cloud9 サポートファイルを削除する

環境 の削除後に、一部の AWS Cloud9 サポートファイルはコンテナに残ります。コンテナを引き続き使用したいが、これらのサポートファイルは不要である場合、ログイン後の AWS Cloud9 を開始する場所として指定したコンテナのディレクトリから .c9 フォルダを削除します。たとえば、ディレクトリが ~ の場合、次のように -r オプションを使用して rm コマンドを実行します。

sudo rm -r ~/.c9

ステップ 6.3: インスタンスから Docker サポートファイルを削除する

Docker コンテナ、Docker イメージ、および Amazon EC2 インスタンス上の Docker を保持する必要はなくなったが、インスタンスは維持したい場合には、次のように Docker サポートファイルを削除できます。

  1. インスタンスから Docker コンテナを削除します。これを行うには、インスタンスで docker コマンドに stoprm の停止アクション、および人間が読み取れるコンテナ名を指定して実行します。

    sudo docker stop cloud9 sudo docker rm cloud9
  2. インスタンスから Docker イメージを削除します。これを行うには、image rm アクションおよびイメージタグを使用して docker コマンドをインスタンスで実行します。

    sudo docker image rm cloud9-image:latest
  3. まだ残っているすべての追加 Docker ファイルを削除します。これを行うには、system prune アクションを使用して docker コマンドをインスタンスで実行します。

    sudo docker system prune -a
  4. 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 インスタンスを終了するには、Linux インスタンス用 Amazon EC2 ユーザーガイド の「インスタンスの削除」を参照してください。