Docker和AMI之间的区别

Posted

技术标签:

【中文标题】Docker和AMI之间的区别【英文标题】:Difference between Docker and AMI 【发布时间】:2017-05-31 21:45:44 【问题描述】:

在 AWS 环境中:

AMI 用于打包软件,可以部署在 EC2 上。 Docker也可以用来打包软件,也可以部署到EC2上。

两者有什么区别,我该如何选择?

【问题讨论】:

从技术上讲,如果没有 AMI,您无法在 EC2 上部署 docker 映像/容器。或者更好的是,只有在您首先提供 AMI 时才存在 EC2 实例。 Docker 将在此运行:EC2/AMI。 【参考方案1】:

AMI 是一个图像。这是一整台机器,您可以从中启动新实例。 docker 容器更轻巧便携。 Docker 容器应该可以在提供者之间传输,而 AMI 则不能(很容易)。

AMI 基本上是 VM 映像。 Docker 容器是在隔离环境中的某些 VM 上运行的打包迷你映像。

【讨论】:

不应该比较AMI和docker images吗? 我同意@Dror,但更重要的是(在 AWS 内)如果没有 AMI,您将无法拥有任何 docker 表单!当且仅当 AMI 允许时,docker 以某种方式是“可移动的”;)还有一个小问题。 “硬件”由 AMI 定义,而不是由 docker 容器/映像定义。糟糕……甚至没有,硬件通常由 EC2 或 Fargate 定义,但它们都需要 AMI。 另一个问题是安全性。这会打开更多替代问题,并且很大程度上取决于您的设置。但我今天看到的趋势是 docker 镜像通常没有内置安全性。虽然 AMI 可以具有,应该具有,内置的最低安全性。在 AWS 上,您确实有其他工具来保护您的系统,但例如,具有给定 AMI 的 EC2 运行 docker 映像可能严重依赖 AMI 安全性。类似于 SSL/SSH 版本。【参考方案2】:

尽管这并没有直接回答问题,但提供了一些关于如何使用它们的背景。

一种方法是使用 Amazon AMI(或者可以是任何 AMI)启动 EC2 实例,然后在其上运行 docker 容器(具有所有依赖项)。使用这种方法,docker 镜像会随着时间的推移而变得臃肿,并且随着时间的推移会出现容器漂移。此外,由于必须启动 Ec2 并且 docker 必须启动您的应用服务器,因此应用程序启动和运行所需的时间也更长。

另一种方法是“不可变 Ec2 实例”。通过这种方法,您使用 Amazon AMI 作为基础并安装所有依赖项(使用 shell 脚本或 Ansible)并将它们烘焙到 AMI 中。我们使用 Hashicorp Packer,这是一个了不起的工具。由于所有依赖项(java8、tomcat、war 文件等)都已安装在 AMI 中,因此大大减少了应用程序启动和运行所需的时间。

对于生产用例,使用 Packer 创建 AMI 并使用 Terraform 启动云资源以使用此 AMI。在 Jenkins 管道中将所有这些联系在一起。

【讨论】:

【参考方案3】:

此链接详细介绍了 Docker 和 AMI 之间的差异:- https://forums.docker.com/t/how-would-you-differentiate-between-docker-vs-ec2-image/1235/2

【讨论】:

虽然你的答案是 100% 正确的,但如果链接目标消失,它也可能 100% 无用。请编辑您的答案并将链接保留为原始来源。

以上是关于Docker和AMI之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

AWS Elastic Beanstalk 与 AMI2 和 docker-compose.yml

是否可以从 Docker 映像创建 AWS AMI?

sh EC2上的Amazon Linux AMI 2017.09.0(HVM)上的golang,docker和docker-compose的安装脚本

如何在最新的 Amazon linux AMI 中升级 docker

text 带有docker post命令的AWS EC2简单AMI

AWS 快照和 AMI 之间的区别