Container Architecture (see docs): DDEV has several containers that run at the same time to get the job done. You can think of them as little computers running on your computer but independent of your computer.

Docker Images are used to create those containers. And image is essentially a template for a running container; the design of the running container. Images are what gets pulled when you do a ddev start with a new project. Your images are shared among all projects.

Dockerfiles are the recipe to build a Docker image.

A Docker Registry is a server where images can be stored. The most famous is hub.docker.com, which is what we use. hub.docker.com shows millions of Docker images that can be pulled with docker pull.

DDEV’s pushed images are at https://hub.docker.com/u/ddev and can be studied there.

Fixed tags

Building: When changes are required to the DDEV images, we push a new image with a unique tag, and then tell DDEV to use it. See docs.

Building an image for development and testing: You can make VERSION=<tag> in a directory like containers/ddev-webserver and it will build an image with that version of your code locally.

Making DDEV use your image: To make DDEV use your image you have to update the tag and/or the full image specification in pkg/versionconstants/versionconstants.go and then build ddev with make in the project root.

**docker buildx and multiple architectures**: Before the arrival of Apple Silicon, most people and development machines used the AMD64 architecture. But now both AMD64 and ARM64 are widely available. As a result, we have to do a multi-architecture build, so we use docker buildx. This does not require that you have the machine type you’re building for, and is all set up in DDEV’s Makefiles. But you do have to install the buildx Docker CLI plugin if you don’t have it. brew install docker-buildx for example.