AWS Cloud9 の Docker サンプル - 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 または 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(「人間が読める形式のディスクファイルシステム情報」用) などのコマンドを実行します。既存のインスタンスのディスクサイズを増やすには、Linux インスタンス用 Amazon EC2 ユーザーガイドの「ボリュームの変更」を参照します。

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

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

  1. ssh ユーティリティまたは PuTTY など、SSH クライアントを使って、実行中の 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 を実行します。これを行うには、docker サービスおよび start アクションを指定して、service コマンドを実行します。

    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. vi を使用して /tmp/Dockerfile ファイルを開きます。

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

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

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

    注記

    頻繁に更新される Docker イメージのリストは、AWS CodeBuild からアクセスできます。詳細については、AWS CodeBuild ユーザーガイド で 「CodeBuild が提供する Docker イメージ」を参照してください。

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

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

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

    2. AWS ナビゲーションバーで、AWS リージョンセレクターで、このトピックで後ほど、AWS Cloud9 開発環境を作成したい AWS リージョンを選択します。

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

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

    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 が表示されるため、このコンテナのファイルとコードの使用をスタートできます。

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

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

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

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

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

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

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

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

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

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

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

  10. ポート]に「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 インストーラ] ダイアログボックスが表示されたら、[Next (次へ)] を選択します。

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

  18. 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 コマンドを 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

    また、前のステップで作成した Dockerfile ファイルおよび authorized_keys ファイルを削除することもできます。たとえば、インスタンスで rm コマンドを実行します。

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

ステップ 6.4: インスタンスの終了

Amazon EC2 インスタンスを終了するには、Linux インスタンス用 Amazon EC2 ユーザーガイド の 「インスタンスの終了」を参照します。