EC2 に Docker を入れてコンテナを動かしてみた
AWS でコンテナを実行するサービスとして ECS や EKS があります。
Amazon ECS(Docker コンテナを実行および管理)| AWS
Amazon EKS(AWS でマネージド Kubernetes を実行)| AWS
とても便利なサービスですが、今回は勉強のために EC2 に Docker をインストールしてコンテナを動かしてみました。
手順概要
- EC2 インスタンス起動
- EC2 インスタンスへ接続してディレクトリとファイルの作成
- Docker イメージの作成
- アクセス確認
1. EC2 インスタンス起動
1-1. 以下の設定で EC2 インスタンスを起動します。
- AMI: Amazon Linux 2
- インスタンスタイプ: t2.micro
- ネットワーク: パブリックサブネット
- セキュリティグループ: 全開放
- IAM ロール:
AmazonSSMManagedInstanceCore
ポリシーをアタッチ済み - ユーザーデータ: 以下のユーザーデータで Docker をインストール
#!/bin/bash
yum update -y
amazon-linux-extras install docker -y
service docker start
chmod 666 /var/run/docker.sock
2. EC2 インスタンスへ接続してディレクトリとファイルの作成
EC2 インスタンス起動後、セッションマネージャーでインスタンスへ接続します。
セッションマネージャーで接続できない場合は、以下のトラブルシューティングをお試しください。
Session Manager の接続に関する問題のトラブルシューティング | AWS re:Post
2-1. Docker がインストールされていることを確認します。
$ docker -v
Docker version 20.10.13, build a224086
2-2. ディレクトリを作成します。
$ mkdir ec2-nodejs-app; cd ec2-nodejs-app
2-3. Dockerfile を作成します。
Dockerfile の内容は以下の通りです。
FROM node:8-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN npm init -y
RUN npm install express
EXPOSE 80
CMD [ "node", "server.js" ]
$ nano Dockerfile
# 上記の Dockerfile の内容を書き込みます。
$ cat Dockerfile
FROM node:8-alpine
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN npm init -y
RUN npm install express
EXPOSE 80
CMD [ "node", "server.js" ]
2-4. JavaScript ファイルを作成します。
JavaScript ファイルの内容は以下の通りです。
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Welcome from a Node.js app!");
});
app.listen(80, () => {
console.log("Server is up on 80");
});
$ nano server.js
# 上記の server.js の内容を書き込みます。
$ cat server.js
const express = require("express");
const app = express();
app.get("/", (req, res) => {
res.send("Welcome from a Node.js app!");
});
app.listen(80, () => {
console.log("Server is up on 80");
});
3. Docker イメージの作成
3-1. docker build
コマンドを実行します。
$ docker build -t ec2-nodejs-app .
3-2. 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
3-3. IMAGE ID を指定して、docker run
コマンドでコンテナを起動します。
$ docker run -d -p 80:80 a35444cd4783
b669eaf0f36d5fbb9b5727ed06af8f0c828eb5a21be4d4974f60c07cb2d21533
3-4. docker ps
コマンドで実行したコンテナを確認できます。
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d918c309547 a35444cd4783 "docker-entrypoint.s…" 57 seconds ago Up 56 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp vibrant_vaughan
これでコンテナが起動しました。
4. アクセス確認
最後にアクセスできるか確認してみます。
EC2 コンソールから「パブリック IPv4 アドレス」または「パブリック IPv4 DNS」をコピーしてアクセスします。
アクセスできると以下のようなページが表示されます。
なお、セキュリティグループで HTTP のインバウンドアクセスを解放しておかないとアクセスできませんのでご注意ください。
今回は検証なのでセキュリティグループは全開放です。
まとめ
今回は EC2 に Docker を入れてコンテナを動かしてみました。
どなたかの参考になれば幸いです。
参考資料
- Amazon ECS(Docker コンテナを実行および管理)| AWS
- Amazon EKS(AWS でマネージド Kubernetes を実行)| AWS
- AWS EC2 でDocker環境を無料で試してみる #container - Qiita
- Tutorial: Setting Up Node.js on an Amazon EC2 Instance - AWS SDK for JavaScript
- Dockerを使ったECSへのNodeアプリ展開 - 株式会社ブリスウェル ベトナム
- Session Manager の接続に関する問題のトラブルシューティング | AWS re:Post
Discussion