IT基礎編でdockerについて学んできましたが、Docker を AWS で動かす際には、ローカル環境とは異なる制約や設定の違い を理解する必要があります。
特に、ECS on EC2 と Fargate の違い、ネットワークやボリュームの制限、環境変数の設定方法 を押さえておくことが重要です。
1. AWS における Docker の実行方法
AWS で Docker を実行する主な方法として、以下の 2種類 があります。
実行方法 | 特徴 |
---|---|
ECS on EC2 | EC2 インスタンス上でコンテナを動かす |
Fargate | AWS による完全マネージドなコンテナ実行環境(サーバーレス) |
2. ローカル環境と AWS環境 の違い
(1) ネットワークの違いと制約
コンテナ間のネットワークを利用する場合、Fargateに制約があることに注意しましょう。
Fargateはサーバーレスサービスのため、サーバー(ホスト)の操作ができません。
そのため、hostネットワークは利用できないことに注意しましょう。
参考:https://zenn.dev/fdnsy/articles/43b7f4d745ed1f
環境 | ネットワークの種類 | 特徴 | 制約 |
---|---|---|---|
ローカル環境 | 【A-27】Docker network 参照 | コンテナ間通信が可能 | 特になし(自由にネットワークを構成可能) |
ECS on EC2 | VPC 内の ENI(Elastic Network Interface) | EC2 上でコンテナごとに ENI を付与できる | 特になし(EC2の制約に依存) |
Fargate | AWS VPC 内の ENI | コンテナごとに直接 VPC 内の IP が割り当てられる | awsvpc のみ |
(2) ボリュームの違いと制約
ネットワークと同様、Fargateはサーバー(ホスト)がないためvolumeにも制約があります。
そのため、Fargate では、永続ストレージとして EFS(Elastic File System)が必要です。
もしくは、Fargate + RDS + S3で運用するパターンもあります。
環境 | ボリュームの種類 | 特徴 | 制約 |
---|---|---|---|
ローカル環境 | Docker Volume(docker volume create ) | /var/lib/docker/volumes/ に保存 | 自由に管理可能 |
ECS on EC2 | EC2 の EBS | EC2 にアタッチされた EBS を使う | EBS は 1つのインスタンスにしかアタッチできない |
Fargate | AWS EFS | 複数コンテナ間で共有可能なストレージ(EFS)を利用 | Docker の -v オプション(ローカルボリューム)は使用不可 |
3. Dockerfile の設計・考え方
上記でも述べましたが、Fargateの場合はネットワークモードやボリュームに制約があります。
そこでRDSやEFSを併用して構築を行いますが、こうなるとローカル側とコンテナ構成の差分ができるようになります。
(ローカル側でDBコンテナを作るが、AWS側では不要。ローカルではbridgeモードだが、AWS側ではawsvpc。)
AWS では、ローカルと AWS の両方で動作するように設計するため、 GUI(コンソール)側や環境変数で制御できるようにする のがポイントです。
具体的には、
・Dockerfile側はローカル用にbridgeモードで記載しておき、Fargate側はawsvpcで設定を上書きする。
・AWS側ではDBコンテナはビルドしない。
・DockerfileのDBコンテナ情報をAWS側の環境変数でRDS情報に上書きする。