Docker is a virtualisation tool. It can create lightweight, fast, isolated, and reproducible environments like virtual machines, in which an application can be tested reliably.

An docker image is a snapshot of an operating system. A container is an instance of an image, behaving like a running virtual machine.

Testing Process

Say I want to test a rust project with file structure like

.
├── Cargo.lock
├── Cargo.toml
├── src
│   └── main.rs
└── target
    ├── CACHEDIR.TAG
    └── debug

In a brand new operating system, everything needed to test this project is the rust-cargo suite, besides the source code. So I want the container to have them.

All containers must be built from an image. Custom images can be built from a Dockerfile. The dockerfile for our purpose is

# Dockerfile
FROM rust:1.86   # we build our image from the official rust image available on docker hub

WORKDIR /app   # set working directory to /app

COPY . .  # copy all files in current directory to /app in the container

To build the image, run

docker build -t <image_name> .
docker images # list all images. You may see several images, as we have pulled one from Docker Hub

To instantiate a container, run

docker run -it <image_name> /bin/bash # run the containter interactively in command mode

The expected output is an interactive bash shell prompt running in the container in the directory /app, in which all of the source codes are present. Now just test the project as usual.

Docker Hub and other Registries for container

To test rust, we build our custom image from the official rust image on Docker Hub. There are plethora of images on Docker Hub for testing other applications, including python, nodejs, golang, debian, ubuntu, nginx, postgres, etc.

Many other image registries exist, for example, there are gcr.io, quay.io, etc.

To pull those image, simple use their url in Dockerfile, eg.

from quay.io/capk/ubuntu-2404-container-disk:v1.32.1

Images can also be pulled onto your local machine independently of a Dockerfile

docker pull quay.io/capk/ubuntu-2404-container-disk:v1.32.1

Images pulled this way have a very long name. Tag them for convenience.

docker tag quay.io/capk/ubuntu-2404-container-disk:v1.32.1 my_ubuntu:latest

And now the Dockerfile can be written as

FROM my_ubuntu:latest

In China

Docker Hub is blocked in China. Instead, search images on aityp. For example swr.cn-north-4.myhuaweicloud.com/ddn-k8s/quay.io/capk/ubuntu-2404-container-disk:v1.32.1 is the chinese mirror of quay.io/capk/ubuntu-2404-container-disk:v1.32.1.

Dockerfile for Automation

Dockerfile is extremely powerful. It can be used to automate the testing process.