Packer 和 Docker 有何不同?配置图像时我应该更喜欢哪一个?

Posted

技术标签:

【中文标题】Packer 和 Docker 有何不同?配置图像时我应该更喜欢哪一个?【英文标题】:How are Packer and Docker different? Which one should I prefer when provisioning images? 【发布时间】:2018-04-20 12:41:48 【问题描述】:

Packer 和 Docker 有何不同?哪一个更容易/最快地提供/维护,为什么?拥有dockerfile 的优缺点是什么?

【问题讨论】:

其中一个运行容器,另一个为虚拟机创建映像。您可能需要查看:***.com/questions/16047306/… @BMitch - 这并不完全正确。 Packer 可以创建 Docker 映像 - packer.io/docs/builders/docker.html - 此外,声明“其中一个”并不是特别有用。哪个“一个”做了哪个(根据您的评论)? 【参考方案1】:

Docker 是一个用于构建、分发和运行Docker containers 的系统。容器可以在 Linux 和 Windows 上运行。

Packer 是一个自动构建系统,用于管理容器和虚拟机的镜像创建。它会输出一个图像,然后您可以拍摄并在您需要的平台上运行。

对于 v1.1,这包括 - Alicloud ECS、Amazon EC2、Azure、CloudStack、DigitalOcean、Docker、Google Cloud、Hyper-V、LXC、LXD、1&1、OpenStack、Oracle OCI、Parallels、ProfitBricks、QEMU、Triton、虚拟机,VMware

Docker 的 Dockerfile

Docker 使用Dockerfile 来管理构建,其中包含一组关于如何构建容器的特定说明和规则。

图像是分层构建的。每个FROMRUNADDCOPY 命令都会修改 Docker 映像中包含的层。这些层可以被缓存,这有助于加快构建速度。每个层也可以单独处理,当多个图像共享层时,这有助于磁盘使用和下载使用。

Dockerfiles 有一点学习曲线,最好看看official Docker images 的一些练习。

Packer 的 Docker 构建器

Packer 不需要 Dockerfile 来构建容器镜像。它有一个 JSON 配置文件,该文件从指定的基本映像(如 FROM)开始。然后 Packer 允许您在该映像之上运行名为 "Provisioners" 的标准系统配置工具。 Ansible、Chef、Salt、shell 脚本等。 然后,此映像将作为单层导出,因此与 Dockerfile 构建相比,您将失去层缓存/寻址优势。

Packer 允许对构建容器环境进行一些修改,例如以 --privileged 运行或在构建时安装卷,而 Docker 构建不允许这样做。

如果您想为多个平台构建映像并使用相同的设置,您可能需要使用 Packer。如果有provisioner,它还可以轻松使用现有的构建脚本。

【讨论】:

两者速度有区别吗? @user239558 Packer 没有实现 docker build 用来加速重复构建的层缓存。 re: packer does not require a Dockerfile -- 但它确实需要至少一个*.json 文件,并且根据您选择的builders 和provisioners,通常有更多的配置文件;例如,ansible 使用 yaml 文件进行配置。映像中所需的内容文件,例如 *.crt,在打包程序和 docker 中都是相同的。因此,尽管 Dockerfile 是单片的,但打包程序的配置更加模块化。【参考方案2】:

扩展配置/维护哪个更容易/最快,为什么?拥有 docker 文件的优缺点是什么?`

从个人学习和使用两者的经验中,我发现:(YMMV)

docker 配置比 packer 更容易学习 docker 配置比 packer 更难强制执行我想要的操作 开发后创建图像的速度差异可以忽略不计 docker 在开发过程中更快,因为缓存 即使不使用 docker,docker 守护进程也会消耗一些系统资源 有少数进程作为 守护进程运行

我在 Windows 上进行了开发,尽管我的目标是 LINUX 服务器来运行图像。 这在开发过程中不是问题,除了在 Windows 上运行 Docker 的一个小问题。

docker 守护进程为自己保留各种 TCP 端口范围 每次重新启动系统或重新启动守护程序时,范围可能会发生变化 唯一的错误消息是:can't use that port!,但不是为什么不能

顺便说一句,解决方法是:

关闭管理程序 重启 保留您希望主机系统看到的公共端口 打开管理程序 重启

在 Windows 上运行 packer,但是,我发现的问题是我想使用的配置程序 ansible 不能在 Windows 上运行。

叹息。

所以我最终不得不在 LINUX 系统上运行 packer。

仅仅因为我觉得自己反常,我写了一个Dockerfile,这样我就可以在我的 Windows 站使用该图像在 docker 容器中运行 packeransible

【讨论】:

【参考方案3】:

Docker 使用 Dockerfile 构建镜像。 这些可以运行(Docker 容器)。

Packer 还构建图像。但是你不需要 Dockerfile。您还可以选择使用诸如 Ansible 之类的 Provisioner,它可以让您创建更多可定制的图像。它不用于运行这些图像。

【讨论】:

以上是关于Packer 和 Docker 有何不同?配置图像时我应该更喜欢哪一个?的主要内容,如果未能解决你的问题,请参考以下文章

虚拟机与Docker有何不同

“lxd”与 lxc/docker 有何不同?

docker与虚拟机有何不同

虚拟机与Docker有何不同

虚拟机与Docker有何不同?

DevOps专题|Packer使用教程