はじめに
AWSを勉強していると、
Docker
コンテナ
ECR
ECS
Task Definition
Task
Service
Fargate
など、似たような単語がたくさん出てきます。最初は「結局それぞれ何なの?」となりやすかったので、自分用の学習メモとして整理しました。この記事では、Dockerで作ったアプリをECRに保存し、ECSで動かすまでの関係を初心者向けにまとめます。
まず結論
最初に全体像を押さえます。
ソースコード
↓
Dockerfile
↓ docker build
Docker Image
↓ docker push
ECR
↓ Imageを取得
ECS
↓
Task
↓
Container
↓
アプリケーション実行
ざっくりいうと、
Docker → コンテナを作るための仕組み
ECR → Docker Imageを保存する場所
ECS → コンテナを動かして管理するサービス
1. そもそもコンテナとは?
コンテナを一言で表すと、
アプリケーションを動かすために必要なものをまとめた実行環境
例えばPythonのアプリケーションなら、
アプリケーション
Python
必要なライブラリ
設定
その他必要なファイル
などをまとめて、同じ環境で動かしやすくします。
なぜコンテナが必要なのか?
例えば開発環境ではPython 3.12なのに本番環境ではPython 3.10だったとします。すると、「開発環境では動いたのに、本番では動かない」という問題が起きる可能性があります。そこで、アプリケーションと実行環境をまとめてコンテナ化します。これによって、環境差による問題を減らせます。
2. Dockerとは?
ここでDockerが登場します。
Dockerは、コンテナを作成・実行するための仕組みです。
初心者のうちは、コンテナ = 箱 Docker = 箱を作ったり動かしたりする道具くらいの理解でOKです。
3. Dockerfile → Image → Container
Dockerfile
Dockerfileは、Docker Imageを作るための設計書です。
例えば、
FROM python:3.12
COPY app.py .
RUN pip install flask
CMD ["python", "app.py"]
FROM py
のようにどの環境を使うか、何のファイルをコピーするか、どのライブラリを入れるか、起動時に何を実行するかなどを定義します。
Docker Image
Docker ImageはDockerfileをもとに作られます。
Dockerfile
↓
docker build
↓
Docker Image
Imageは、Containerを起動するためのパッケージのようなものです。
Container
Imageを実際に起動したものがContainerです。
Image
↓ docker run
Container
Image = 起動するためのもの
Container = 実際に起動しているもの
と覚えると分かりやすいです。
4. Dockerの基本コマンド
docker build- Imageを作る
docker tag- Imageに名前・タグを付ける
docker push- Imageをリポジトリへ送る
docker pull- Imageを取得する
docker run- Containerを起動する
docker ps- Containerを確認する
docker logs- Containerのログを見る
5. ECRとは?
ここからAWSのサービスです。
ECRは、Amazon Elastic Container Registryの略です。
一言でいうと、Docker Imageを保存しておくAWSのサービスです。
イメージとしては下記のような感じです。
開発PC
↓
Docker Image
↓ docker push
┌──────────────┐
│ ECR │
│ │
│ my-app:1.0 │
│ my-app:1.1 │
│ my-app:1.2 │
└──────────────┘
6. ECRは「コンテナを動かす場所」ではない
ECRは、Imageを保存する場所です。
Containerを実際に動かすのはECSです。
7. ECSとは?
ECSは、Amazon Elastic Container Serviceの略です。
一言でいうと、コンテナを実行・管理するAWSサービスです。
例えば下記です。
ECR
│
│ Docker Image
↓
ECS
│
├── Container
├── Container
└── Container
8. なぜECSが必要なのか?
DockerだけでもContainerを起動することはできます。
しかし、本番環境ではContainerが1個とは限りません。例えば、
Container1、Container2複数起動することがあります。
さらに、
Containerが停止したらどうする?
何個起動する?
新しいバージョンに更新するには?
CPUやメモリは足りている?
Containerをどこで動かす?
など、管理が必要になります。そこでECSを利用します。
9. ECSの重要な用語
ECSにはいくつか重要な用語があります。
ECS
│
└── Cluster
│
└── Service
│
├── Task
│ └── Container
│
└── Task
└── Container
さらに、Taskをどう起動するかを定義するものとして、
Task Definitionがあります。
10. Task Definitionとは?
Task Definitionは、ECSでContainerをどのように起動するかを定義したものです。
例えば、
使用するImage
CPU
Memory
Port
環境変数
ログ設定
IAM Role
などを設定します。
11. Taskとは?
Taskは、Task Definitionをもとに実際に起動したものです。
Task Definition
↓
Task
↓
Container
12. Serviceとは?
Serviceは、ECS Taskを必要な数だけ維持・管理する仕組みです。
例えば、
Desired count = 2
なら、
Task 1
Task 2
のように必要な数のTaskを動かします。
Taskが停止した場合などに、新しいTaskを起動して必要数を維持するような仕組みもあります。
13. Clusterとは?
Clusterは、ECSのTaskやServiceをまとめて管理する単位です。
例えば、
ECS Cluster
│
├── Service A
│ ├── Task
│ └── Task
│
└── Service B
├── Task
└── Task
という構成になります。
14. Fargateとは?
ECSでContainerを実行する方法として、Fargateがあります。
ECS
↓
Fargate
↓
Container
Fargateを使うことで、Containerを動かすためのサーバーを自分で直接管理する必要を減らせます。
初心者のうちは下記のように覚えておけば十分です。
EC2→ サーバーを自分で管理する
Fargate→ サーバー管理をAWSに任せてContainerを動かす
15. Docker・ECR・ECSを全部つなげる
ここまでの内容を全部つなげると、こうなります。
【開発者PC】
ソースコード
↓
Dockerfile
↓
docker build
↓
Docker Image
↓
docker push
↓
┌──────────────┐
│ ECR │
│ Docker Image │
│ を保存 │
└──────┬───────┘
│
│ Image取得
↓
┌──────────────┐
│ ECS │
│ │
│ Cluster │
│ ↓ │
│ Service │
│ ↓ │
│ Task │
│ ↓ │
│ Container │
└──────────────┘
↓
アプリケーション実行
16. 実際のデプロイをイメージする
ソースコードを変更
↓
Docker Imageを作成
↓
ECRへpush
↓
Task Definitionを更新
↓
ECSで新しいTaskを起動
↓
新しいContainerでアプリを実行
つまり、現場で「ECRに新しいImageをpushしてECSを更新します」と言われたら、「新しいContainer ImageをECRに置いて、それをECSから使って新しいContainerを起動するんだな」と理解できます。
17. ECRとECSの違いを一言で
最後にここだけ覚えておきます。
Docker
→ Containerを作る・動かす
ECR
→ Docker Imageを保存する
ECS
→ Containerを実行・管理する