Packer和Docker有什么不同?在提供镜像时应该选择哪一个?

71

PackerDocker有什么不同?哪个更容易/更快地进行配置/维护,并为什么?使用dockerfile的优缺点是什么?


1
其中一个运行容器,另一个则为虚拟机创建镜像。您可能需要查看:https://dev59.com/9mQo5IYBdhLWcg3wdPAa?rq=1 - BMitch
3
@BMitch - 这并不完全正确。Packer可以创建Docker镜像 - https://www.packer.io/docs/builders/docker.html - 另外,说“其中之一”并不是特别有帮助。根据您的评论,“其中哪一个”做了什么? - Jack_Hu
3个回答

80

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

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

对于v1.8,这包括 - Alicloud ECS,Amazon EC2,Azure,CloudStack,DigitalOcean,Docker,Google Cloud,Hetzner,Hyper-V,Libvirt,LXC,LXD,1&1,OpenStack,Oracle OCI,Parallels,ProfitBricks,Proxmox,QEMU,Scaleway,Triton,Vagrant,VirtualBox,VMware,Vultr

Docker的Dockerfile

Docker使用Dockerfile来管理构建过程,其中包含一组特定的指令和规则,用于构建容器。

镜像是通过层逐步构建的。每个FROM RUN ADD COPY命令都会修改包含在OCI镜像中的层。这些层可以被缓存,从而加快构建速度。每个层也可以单独进行访问,这有助于磁盘使用和下载使用,当多个镜像共享层时。

Dockerfiles 有一定的学习曲线,最好查看一些官方 Docker 镜像以了解需要遵循的实践。

Packer 的 Docker 构建器

Packer 不需要 Dockerfile构建容器镜像docker 插件具有 HCL 或 JSON 配置文件,可以从指定的基础镜像(如 FROM)开始启动镜像构建。

然后,Packer 允许您在该镜像上运行称为 "Provisioners" 的标准系统配置工具。这些工具包括 Ansible、Chef、Salt、shell 脚本等。然后,此图像将导出为单个层,因此与 Dockerfile 构建相比,您将失去层缓存/寻址的优势。

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

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


这两者之间有任何速度差异吗? - user239558
5
Packer 没有实现 docker build 使用的层缓存功能来加速重复构建。 - Matt
2
关于“packer不需要Dockerfile”的问题,实际上它确实不需要Dockerfile文件,但至少需要一个*.json文件,并且根据您选择的构建器和配置管理工具,通常还需要许多其他配置文件。例如,ansible使用yaml文件进行配置。像*.crt这样需要在镜像内部的内容文件,在packer和docker中是相同的。因此,虽然Dockerfile是单体的,但packer配置更加模块化。 - Jesse Chisholm

9
扩展“哪个更容易/快速进行配置和维护,为什么?”的问题。拥有Docker文件的优缺点是什么?
从我个人学习和使用两者的经验来看,我发现(可能因人而异):
- Docker配置比Packer更容易学习 - Docker配置比Packer更难强制执行我想要的操作 - 在开发后,创建镜像的速度差异微不足道 - 由于缓存,Docker在开发期间更快 - 即使不使用Docker,Docker守护程序也会消耗一些系统资源 - 有一些作为守护程序运行的进程
我在Windows上进行开发,但我针对运行镜像的LINUX服务器。 在开发过程中这不是问题,除了在Windows上运行Docker的怪癖。
- Docker守护程序为自己保留各种TCP端口范围 - 这些范围可能每次重新启动系统或重新启动守护程序时都会更改 - 唯一的错误消息是:“无法使用该端口!”,但不知道为什么无法使用
顺便说一下,“解决方法”是:
- 关闭Hypervisor - 重新启动 - 保留您希望主机系统看到的公共端口 - 打开Hypervisor - 重新启动
然而,在Windows上运行Packer时,我发现的问题是我想要使用的配置程序Ansible无法在Windows上运行。
唉。
所以我最终还是不得不在LINUX系统上运行Packer。
只是因为我感到反常,我编写了一个Dockerfile,以便我可以在我的Windows工作站上使用该镜像在Docker容器中运行packer和ansible。

4

Docker使用Dockerfile构建镜像,而这些镜像可以在Docker容器中运行。

Packer也可以构建镜像,但你不需要Dockerfile。并且你可以选择使用Provisioners,例如Ansible,使你创建的镜像更加可定制。但它不能用于运行这些镜像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接