AWS EC2にDockerコンテナをデプロイする方法

はじめに

クラウドインフラストラクチャの普及に伴い、AWSのEC2インスタンス上でDockerコンテナを実行することは、多くの開発者やインフラエンジニアにとって一般的な作業となっています。この記事では、AWSのEC2インスタンスにDockerをインストールし、コンテナをデプロイする手順を詳しく解説します。

前提条件

  • AWSアカウントを持っていること
  • EC2インスタンスを作成する基本的な知識
  • SSHを使用してEC2インスタンスに接続できること
  • Dockerの基本概念を理解していること

ステップ1: EC2インスタンスの作成

まず、Dockerを実行するためのEC2インスタンスを作成します。

  1. AWSコンソールにログインし、EC2ダッシュボードに移動します
  2. 「インスタンスを起動」をクリックします
  3. Amazon Linux 2 AMIを選択します(DockerはほとんどのLinuxディストリビューションで動作しますが、Amazon Linux 2はAWSのサービスとの統合が優れています)
  4. インスタンスタイプを選択します(最低でもt2.microを推奨)
  5. インスタンスの詳細を設定します
  6. ストレージを追加します(最低8GBを推奨)
  7. セキュリティグループで以下のポートを開放します:
    • SSH (22): 管理用
    • アプリケーションで使用するポート(例:80, 443, 3000など)
  8. キーペアを作成またはすでに持っているキーペアを選択します
  9. インスタンスを起動します

ステップ2: EC2インスタンスに接続

インスタンスが起動したら、SSHを使用して接続します。

ssh -i /path/to/your-key.pem ec2-user@your-instance-public-ip

ステップ3: Dockerのインストール

EC2インスタンスに接続したら、Dockerをインストールします。

Amazon Linux 2 の場合:

# システムを更新
sudo yum update -y

# Dockerをインストール
sudo amazon-linux-extras install docker -y

# Dockerサービスを開始
sudo service docker start

# システム起動時にDockerを自動的に起動するように設定
sudo systemctl enable docker

# ec2-userをdockerグループに追加(sudoなしでDockerコマンドを実行できるようにする)
sudo usermod -a -G docker ec2-user

変更を反映させるために、一度ログアウトして再度ログインします:

exit
# 再度SSHで接続
ssh -i /path/to/your-key.pem ec2-user@your-instance-public-ip

Ubuntu の場合:

# システムを更新
sudo apt-get update
sudo apt-get upgrade -y

# 必要なパッケージをインストール
sudo apt-get install apt-transport-https ca-certificates curl gnupg lsb-release -y

# Dockerの公式GPGキーを追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

# Dockerのリポジトリを追加
echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

# Dockerをインストール
sudo apt-get update
sudo apt-get install docker-ce docker-ce-cli containerd.io -y

# Dockerサービスを開始
sudo systemctl start docker

# システム起動時にDockerを自動的に起動するように設定
sudo systemctl enable docker

# 現在のユーザーをdockerグループに追加
sudo usermod -aG docker $USER

変更を反映させるために、一度ログアウトして再度ログインします。

ステップ4: Docker Composeのインストール(オプション)

複数のコンテナを管理する場合は、Docker Composeをインストールすることをお勧めします。

# Docker Composeの最新バージョンをダウンロード
sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# 実行権限を付与
sudo chmod +x /usr/local/bin/docker-compose

# インストールを確認
docker-compose --version

ステップ5: Dockerコンテナのデプロイ

Dockerがインストールされたら、コンテナをデプロイする方法はいくつかあります。

方法1: 既存のDockerイメージを使用

Docker Hubや他のコンテナレジストリから公開されているイメージを使用できます。

# Nginxの例
docker pull nginx
docker run -d -p 80:80 --name my-nginx nginx

これで、EC2インスタンスのパブリックIPアドレスにアクセスすると、Nginxのデフォルトページが表示されます。

方法2: カスタムDockerイメージを構築

独自のDockerfileを作成してイメージをビルドする方法です。

  1. プロジェクトディレクトリを作成します:
mkdir my-docker-app
cd my-docker-app
  1. Dockerfileを作成します:
nano Dockerfile

以下のような内容を記述します(Nodeアプリケーションの例):

FROM node:14
WORKDIR /app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 3000
CMD ["node", "app.js"]
  1. アプリケーションファイルを作成します(例:app.js):
nano app.js
const http = require('http');

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World from Docker on AWS EC2!\n');
});

server.listen(3000, () => {
  console.log('Server running on port 3000');
});
  1. package.jsonファイルを作成します:
nano package.json
{
  "name": "docker-node-app",
  "version": "1.0.0",
  "description": "Simple Node.js app for Docker demo",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {}
}
  1. Dockerイメージをビルドして実行します:
docker build -t my-node-app .
docker run -d -p 3000:3000 --name my-running-app my-node-app

これで、http://your-ec2-public-ip:3000 にアクセスすると、アプリケーションが表示されます。

方法3: Docker Composeを使用する

複数のコンテナを管理する場合は、Docker Composeを使用すると便利です。

  1. docker-compose.ymlファイルを作成します:
nano docker-compose.yml
version: '3'
services:
  web:
    image: nginx
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
  app:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
  db:
    image: mongo
    volumes:
      - mongo-data:/data/db
volumes:
  mongo-data:
  1. Docker Composeを起動します:
docker-compose up -d

ステップ6: コンテナの管理

デプロイしたコンテナを管理するための基本的なコマンドです:

# 実行中のコンテナを確認
docker ps

# すべてのコンテナを確認(停止中のものも含む)
docker ps -a

# コンテナのログを確認
docker logs [コンテナID or コンテナ名]

# コンテナを停止
docker stop [コンテナID or コンテナ名]

# コンテナを再起動
docker restart [コンテナID or コンテナ名]

# コンテナを削除(停止してから)
docker rm [コンテナID or コンテナ名]

# イメージを確認
docker images

# イメージを削除
docker rmi [イメージID or イメージ名]

ステップ7: コンテナの自動再起動設定

サーバーが再起動した場合にコンテナも自動的に起動するようにします:

docker run -d --restart=always -p 80:80 --name my-nginx nginx

--restart=always オプションにより、Docker daemon起動時にコンテナも自動的に起動します。

ステップ8: セキュリティ対策

  1. コンテナのルートユーザーを避ける:

Dockerfileに以下を追加:

RUN groupadd -r appuser && useradd -r -g appuser appuser
USER appuser
  1. イメージの脆弱性スキャン:
# Amazon ECRのスキャン機能を利用するか、
# Clair、Trivy、Anchoreなどのオープンソースツールを使用
  1. 不要なポートの露出を避ける:

セキュリティグループで必要なポートのみを開放し、Dockerコンテナでも同様に必要なポートのみを公開します。

まとめ

この記事では、AWS EC2インスタンスにDockerをインストールし、コンテナをデプロイする方法について解説しました。Docker化されたアプリケーションをEC2にデプロイすることで、環境の一貫性を確保し、デプロイプロセスを簡素化できます。さらに進んだ本番環境のデプロイには、Amazon ECS(Elastic Container Service)やEKS(Elastic Kubernetes Service)などのマネージドサービスも検討してみてください。

参考リソース

コメント

タイトルとURLをコピーしました