📝

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

2022/06/03に公開

AWS でコンテナを実行するサービスとして ECS や EKS があります。
Amazon ECS(Docker コンテナを実行および管理)| AWS
Amazon EKS(AWS でマネージド Kubernetes を実行)| AWS

とても便利なサービスですが、今回は勉強のために EC2 に Docker をインストールしてコンテナを動かしてみました。

手順概要

  1. EC2 インスタンス起動
  2. EC2 インスタンスへ接続してディレクトリとファイルの作成
  3. Docker イメージの作成
  4. アクセス確認

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 の内容は以下の通りです。

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 ファイルの内容は以下の通りです。

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");
});
$ 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 を入れてコンテナを動かしてみました。
どなたかの参考になれば幸いです。

参考資料

Discussion