0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【AWS初心者】Docker・ECR・ECSの関係を図で理解する

0
Posted at

はじめに

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を実行・管理する
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?