📝

EC2 に Docker と Node.js を入れてコンテナを動かしてみた

2022/06/03に公開

AWS でコンテナを実行するサービスとして、ECSEKS があります。
とても便利なサービスですが、今回は勉強のために EC2 に 自分で Docker と Node.js をインストールしてコンテナを動かしてみました。

参考サイト

以下のサイトを参考にしました。

https://qiita.com/fkooo/items/bb921218313123c14358

https://docs.aws.amazon.com/ja_jp/sdk-for-javascript/v2/developer-guide/setting-up-node-on-ec2-instance.html

https://www.briswell-vn.com/ja/news/deploying-node-app-to-ecs-with-docker/

手順概要

  1. EC2 インスタンス起動
  2. EC2 インスタンスへ接続して Node.js をインストール
  3. ディレクトリとファイルの作成
  4. docker build ~ docker run
  5. アクセス確認

1. EC2 インスタンス起動

以下の設定で起動しました。
・AMI: Amazon Linux 2
・インスタンスタイプ: t2.micro
・ネットワーク: パブリックサブネット
・セキュリティグループ: 全開放
・IAM ロール: AmazonSSMManagedInstanceCore ポリシーをアタッチ済み
・ユーザーデータ: 以下のユーザーデータで Docker をインストール

#!/bin/bash
sudo yum update -y
sudo amazon-linux-extras install docker -y
sudo service docker start

本当は Node.js もインストールしたかったのですが、色々試してもうまくいきませんでした。
そのため、Node.js はこの後の手順でインストールします。

2. EC2 インスタンスへ接続して Node.js をインストール

EC2 インスタンス起動後、セッションマネージャーでインスタンスへ接続します。
セッションマネージャーで接続できない場合は、以下のトラブルシューティングをお試しください。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/ssm-session-manager-connect-fail/

sudo su

Docker がインストールされていることを確認します。

docker -v

インストールされていれば以下のような出力が表示されます。

Docker version 20.10.13, build a224086

続いて、AWS 公式ドキュメント に沿って、Node.js をインストールします。

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh

今回は node のバージョンを指定します。
最新バージョンを指定したら、GLIBC not found というエラーが発生しました。
このエラーの解決策がバージョンを落とすことだったので、今回は以下のバージョンを指定しています。

nvm install 14.7.0

以下のコマンドが成功すれば、Node.js のインストールは完了です。

node -e "console.log('Running Node.js ' + process.version)"

これで Docker と Node.js をインストールすることができました。

3. ディレクトリとファイルの作成

続いてディレクトリとファイルを作成します。
まずは適当なディレクトリを作成して移動します。

mkdir ec2-nodejs-app
cd ec2-nodejs-app

続いてディレクトリ内で npm init -ynpm i express で初期化とモジュールインストールを行います。

npm init -y
npm i express

初期化とモジュールインストール後、以下のファイルを作成します。
nano でも vim でもお好きな方法でファイルを作成してください。

Dockerfile
FROM node:8-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN npm install
EXPOSE 3000
CMD [ "node", "server.js" ]
server.js
// server.js

const express = require("express");
const app = express();

app.get("/", (req, res) => {
  res.send("Welcome from a Node.js app!");
});

app.listen(3000, () => {
  console.log("Server is up on 3000");
});

4. docker build ~ docker run

ここからは Docker でコンテナを作成していきます。
ディレクトリ内で docker build を実行します。

docker build -t ec2-nodejs-app .

docker images で IMAGE ID を確認し、コピーしておきます。

docker images

今回だと a35444cd4783 がビルドした IMAGE ID です。

REPOSITORY       TAG        IMAGE ID       CREATED         SIZE
ec2-nodejs-app   latest     a35444cd4783   3 seconds ago   75.6MB
node             8-alpine   2b8fcdc6230a   2 years ago     73.5MB

IMAGE ID を指定して、docker run でコンテナを起動します。

docker run -p 80:3000 a35444cd4783

起動すると、以下のような出力が表示されます。

Server is up on 3000

これでコンテナが起動しました。

5. アクセス確認

最後にアクセスできるか確認してみます。
EC2 コンソールから「パブリック IPv4 アドレス」または「パブリック IPv4 DNS」をコピーしてアクセスします。

アクセスできると以下のようなページが表示されます。
なお、セキュリティグループで HTTP のインバウンドアクセスを解放しておかないとアクセスできませんのでご注意ください。
今回は検証なのでセキュリティグループは全開放です。

これで無事に EC2 に Docker と Node.js を入れてコンテナを動かし、アクセスすることができました。

まとめ

今回は EC2 に Docker と Node.js を入れてコンテナを動かしてみました。
EC2 だと Docker や Node.js を自分でインストールする必要があり、ECS のすばらしさをあらためて実感できました。
また、参考サイトの手順が非常にわかりやすかったことにも感謝しています。

今回の内容が参考になれば幸いです。

Discussion