Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

How are Packer and Docker different? Which one is easier/quickest to provision/maintain and why? What is the pros and cons of having a dockerfile?

like image 660
Abhineetraj Avatar asked Nov 07 '17 23:11

Abhineetraj


People also ask

What is the difference between Packer and Docker?

Docker is a system for building, distributing and running OCI images as containers. Containers can be run on Linux and Windows. Packer is an automated build system to manage the creation of images for containers and virtual machines. It outputs an image that you can then take and run on the platform you require.

Does Packer need Docker?

By not using Dockerfiles , Packer is able to provision containers with portable scripts or configuration management systems that are not tied to Docker in any way. It also has a simple mental model: you provision containers much the same way you provision a normal virtualized or dedicated server.

What are the main advantages of using a Docker image?

With the help of a Docker, we can build a container image and can further use that same image over every step of the deployment process. The advantage of it is the ability to separate non-dependent steps and also run them in parallel.

What is the relationship between Docker images and Docker containers?

Both elements are closely related and are part of a system defined by the Docker platform. If you have read the previous two sections that define docker images and docker containers, you may already have some understanding as to how the two establish a relationship.

How many Docker images can be created at once?

When you run a containerized environment, you essentially create a read-write copy of that filesystem (docker image) inside the container. This adds a container layer which allows modifications of the entire copy of the image. You can create an unlimited number of Docker images from one image base.

How do I build a docker container?

Once you have a binary you can build the Docker container using Packer. Packer lets you declaratively define how you want to provision a virtual image or container in a human readable text format. Packer supports two different markup languages for defining the provisioning process: JSON and HCL (Hashicorp Markup Language).

What is a layer in Docker images?

Docker images can, therefore, consist of a series of layers, each differing but also originating from the previous one. Image layers represent read-only files to which a container layer is added once you use it to start up a virtual environment. What is a Docker Container?


3 Answers

Docker is a system for building, distributing and running OCI images as containers. Containers can be run on Linux and Windows.

Packer is an automated build system to manage the creation of images for containers and virtual machines. It outputs an image that you can then take and run on the platform you require.

For v1.8 this includes - 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's Dockerfile

Docker uses a Dockerfile to manage builds which has a specific set of instructions and rules about how you build a container.

Images are built in layers. Each FROM RUN ADD COPY commands modify the layers included in an OCI image. These layers can be cached which helps speed up builds. Each layer can also be addressed individually which helps with disk usage and download usage when multiple images share layers.

Dockerfiles have a bit of a learning curve, It's best to look at some of the official Docker images for practices to follow.

Packer's Docker builder

Packer does not require a Dockerfile to build a container image. The docker plugin has a HCL or JSON config file which start the image build from a specified base image (like FROM).

Packer then allows you to run standard system config tools called "Provisioners" on top of that image. Tools like Ansible, Chef, Salt, shell scripts etc. This image will then be exported as a single layer, so you lose the layer caching/addressing benefits compared to a Dockerfile build.

Packer allows some modifications to the build container environment, like running as --privileged or mounting a volume at build time, that Docker builds will not allow.

Times you might want to use Packer are if you want to build images for multiple platforms and use the same setup. It also makes it easy to use existing build scripts if there is a provisioner for it.

like image 124
Matt Avatar answered Oct 17 '22 21:10

Matt


Expanding on the Which one is easier/quickest to provision/maintain and why? What are the pros and cons of having a docker file?`

From personal experience learning and using both, I found: (YMMV)

  • docker configuration was easier to learn than packer
  • docker configuration was harder to coerce into doing what I wanted than packer
  • speed difference in creating the image was negligible, after development
  • docker was faster during development, because of the caching
  • the docker daemon consumed some system resources even when not using docker
  • there are a handful of processes running as the daemon

I did my development on Windows, though I was targeting LINUX servers for running the images. That isn't an issue during development, except for a foible of running Docker on Windows.

  • The docker daemon reserves various TCP port ranges for itself
  • The ranges might change every time you reboot your system or restart the daemon
  • The only error message is to the effect: can't use that port! but not why it can't

BTW, The workaround is to:

  • turn off Hypervisor
  • reboot
  • reserve the public ports you want your host system to see
  • turn on hypervisor
  • reboot

Running packer on Windows, however, the issue I found is that the provisioner I wanted to use, ansible, doesn't run on Windows.

Sigh.

So I end up having to run packer on a LINUX system after all.

Just because I was feeling perverse, I wrote a Dockerfile so I could run both packer and ansible from my Windows station in a docker container using that image.

like image 25
Jesse Chisholm Avatar answered Oct 17 '22 21:10

Jesse Chisholm


Docker builds images using a Dockerfile. These can be run (Docker containers).

Packer also builds images. But you don't need a Dockerfile. And you get the option of using Provisioners such as Ansible which lets you create vastly more customisable images. It isn't used for running these images.

like image 4
Snowcrash Avatar answered Oct 17 '22 22:10

Snowcrash