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
来管理构建过程,其中包含一组特定的指令和规则,用于构建容器。
镜像是通过层逐步构建的。每个FROM
RUN
ADD
COPY
命令都会修改包含在OCI镜像中的层。这些层可以被缓存,从而加快构建速度。每个层也可以单独进行访问,这有助于磁盘使用和下载使用,当多个镜像共享层时。
Dockerfiles 有一定的学习曲线,最好查看一些官方 Docker 镜像以了解需要遵循的实践。
Packer 不需要 Dockerfile
来构建容器镜像。 docker
插件具有 HCL 或 JSON 配置文件,可以从指定的基础镜像(如 FROM
)开始启动镜像构建。
然后,Packer 允许您在该镜像上运行称为 "Provisioners" 的标准系统配置工具。这些工具包括 Ansible、Chef、Salt、shell 脚本等。然后,此图像将导出为单个层,因此与 Dockerfile 构建相比,您将失去层缓存/寻址的优势。
Packer 允许对构建容器环境进行一些修改,例如在构建时作为 --privileged
运行或挂载卷,而 Docker 构建则不允许这样做。
您可能希望使用 Packer 的情况是如果您想为多个平台构建映像并使用相同的设置。如果有 provisioner 可用,则还可以轻松使用现有的构建脚本。
docker build
使用的层缓存功能来加速重复构建。 - MattDocker使用Dockerfile构建镜像,而这些镜像可以在Docker容器中运行。
Packer也可以构建镜像,但你不需要Dockerfile。并且你可以选择使用Provisioners,例如Ansible,使你创建的镜像更加可定制。但它不能用于运行这些镜像。