Docker images
Docker needs an image to run a container. Images are stored in the local registry. If it can’t find it, it will try and pull it from Docker Hub.
View your local images
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
debian latest e6d9c9c3e100 12 days ago 118MB
ubuntu latest bab8ce5c00ca 6 weeks ago 69.2MB
cda/mysql-5.7 latest 312ce2a6cea5 3 months ago 495MB
cda/node-16 latest b26e54c8fa11 3 months ago 1.44GB
bitnami/minio latest ef6d14df2158 3 months ago 229MB
opensearchproject/opensearch 1.3.7 0f8ef57c3629 4 months ago 831MB
hello-world latest 46331d942d63 13 months ago 9.14kB
Repository, registry, tag
When you specify the name of an image, you are referring to the image’s repository. The registry is the list of repositories available on the Docker Hub. Each repository has a tag, indicating the current production branch.
For example:
docker run -it ubuntu:18:04 /bin/bash
ubuntu
is the image repository18.04
is the image tag
The Image ID distinguishes the image globally and is not local to you.
To get detailed info on an image:
docker image inspect debian
“Dangling” images
A “dangling” image is an unused image - one that is not associated with a container. Re move dangling images with
docker image prune
Anatomy of a Docker image: layering
The process of constructing a Docker image involves creating a series of intermediate layers, each representing a change or addition to the filesystem. These layers are stacked on top of one another, forming the final image. This approach is called layering.
Layering in Docker images offers several benefits:
Reusability: Common layers can be shared between multiple images, reducing disk space usage and build time. For example, if multiple images use the same base operating system, they can all share the same base layer.
Caching: During the build process, Docker caches layers that have already been built. If a layer hasn’t changed, Docker will reuse it in subsequent builds, speeding up the build process.
Incremental updates: When updating an image, only the layers that have changed need to be updated and redistributed. This reduces the size of updates and makes the process more efficient.
Each instruction in the Dockerfile creates a new layer in the image. Some common instructions include:
FROM
: Specifies the base image to start with (e.g., an operating system or an existing image).RUN
: Executes a command, often used for installing packages or configuring the system.COPY
: Copies files or directories from the host machine to the image.ADD
: Similar to COPY but can also handle URLs and automatic extraction of archives.ENV
: Sets environment variables that will be available inside the container.CMD
: Specifies the default command to run when a container is started from the image.ENTRYPOINT
: Similar to CMD, but allows the container to be run as an executable, with additional arguments.
When building an image, Docker starts with the base image specified in the FROM instruction and applies each subsequent instruction, creating a new layer for each step. The final result is a layered image that contains the application and its dependencies, ready to be run as a container.
The read-write layer
The final layer at the “top” of the image is a thin read-write layer. In contrast to the intermediate layers it can execute read-write functionality and is not read-only.
Files in the intermediate layer cannot be modified, only the read-write layer can be modified. Files are copied over from intermediate layers when requested by the read-write layer, rather being modified themselves.
Tip for writing build files:
Things that change less should be higher up (earlier). Things that change more should be twoardds the end. This allows for better layer caching. Particularly bear this in mind with the commands: RUN, COPY, ADD.