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

How are Packer and Docker different? Which one should I prefer when provisioning images?

Packer and Docker 有何不同? easier/quickest 到 provision/maintain 是哪一个?为什么? dockerfile有什么好处和坏处?

Docker is a system for building, distributing and running Docker containers。容器可以是 运行 on Linux and 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、VirtualBox、VMware

Docker的Docker文件

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

图像是分层构建的。每个 FROM RUN ADD COPY 命令修改包含在 Docker 图像中的图层。可以缓存这些层,这有助于加快构建速度。当多个图像共享层时,每个层也可以单独寻址,这有助于磁盘使用和下载使用。

Docker文件有一点学习曲线,最好查看一些 official Docker images 以进行练习。

Packer 的 Docker 建造者

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

Packer 允许对构建容器环境进行一些修改,例如 运行ning as --privileged 或在构建时安装卷,Docker 构建将不允许。

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

Docker 使用 Docker 文件构建图像。 这些可以是 运行(Docker 个容器)。

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

扩展 哪个是 easier/quickest 到 provision/maintain,为什么? docker 文件的优点和缺点是什么?`

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

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

我在 Windows 上进行了开发,尽管我的目标是 LINUX 服务器用于 运行 图像。 这在开发过程中不是问题,除了 运行ning Docker on Windows.

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

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

  • 关闭管理程序
  • 重启
  • 保留您希望主机系统看到的 public 个端口[=52​​=]
  • 开启管理程序
  • 重启

运行 Windows 上的加壳器,但是,我发现的问题是我想使用的供应商 ansible,在 Windows 上没有 运行。

感叹

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

只是因为我觉得有悖常理,所以我写了一个 Dockerfile 这样我就可以 运行 从我的 Windows 站中 packeransible docker 使用该图像的容器。