AWSのコンテキスト:
AMIはソフトウェアのパッケージ化に使用され、EC2にデプロイできます。 Dockerはソフトウェアのパッケージ化にも使用でき、EC2にデプロイすることもできます。
両方の違いは何ですか?また、どのように選択しますか?
AMIはイメージです。これは、新しいインスタンスを開始できるマシン全体です。 Dockerコンテナは、より軽量でポータブルです。 Dockerコンテナーはプロバイダー間で転送可能である必要がありますが、AMIは(簡単に)転送できません。
AMIは基本的にVMイメージです。Dockerコンテナは、隔離された環境でいくつかのVMで実行されるパッケージ化されたミニイメージです。
このリンクには、DockerとAMIの違いに関する詳細が記載されています。 https://forums.docker.com/t/how-would-you-differentiate-between-docker-vs-ec2-image/1235/2
しかし、これは質問に直接答えませんが、それらがどのように使用されるかについての背景を提供します。
1つのアプローチは、Amazon AMI(または任意のAMI)でEC2インスタンスを起動し、その上でdockerコンテナー(すべての依存関係を含む)を実行することです。このアプローチでは、Dockerイメージは時間の経過とともに肥大化し、時間の経過に伴ってコンテナがドリフトします。また、Ec2を起動し、Dockerでアプリサーバーを起動する必要があるため、アプリケーションの起動と実行にかかる時間が長くなります。
別のアプローチは、「Immutable Ec2インスタンス」です。このアプローチでは、Amazon AMIをベースとして使用し、すべての依存関係をインストールして(シェルスクリプトまたはAnsibleを使用)、AMIでそれらをベイク処理します。素晴らしいツールであるHashicorp Packerを使用しています。ここでは、すべての依存関係(Java8、Tomcat、warファイルなど)がすでにAMIにインストールされているため、アプリケーションの実行にかかる時間は大幅に短縮されます。
実稼働ユースケースでは、Packerを使用してAMIを作成し、Terraformを使用してクラウドリソースを起動してこのAMIを使用します。これらすべてをJenkinsパイプラインで結びます。