# Working With Containers
Tempo relies upon containers for reproducibility and portability. In Nextflow, each process can be executed within the environment of a specified container built on the Docker (opens new window) or Singularity (opens new window) platform. This page contains a basic introduction to containers and how-to's for running Tempo with containers.
Containers: A container is a lightweight encapsulation of a environment to run a specific tool. One can think of this as "packaging" a tool with its dependencies into a standardized unit. The container includes code and all dependencies so the application runs quickly and reliably from one computing environment to another (e.g. system libraries, environment settings, etc.).
Images: A Docker image is a building block for the container. One can think of the container as an image "put to use". Images can be hosted in a repository such as Dockerhub (opens new window). When you pull the image from repository, you will have a local version of the image you can use. We you run the image and use it, you're using that specific container.
Dockerfile: This is the recipe used to create the image.
Docker versus Singularity: These are different container platforms. Singularity is compatible with images built on the Docker platform. For security concerns, the Juno compute cluster uses Singularity, see the juno setup instructions.
Versioning: Docker images are versioned by their association with a tag.
Tempo uses images built by Docker and hosted at Dockerhub (opens new window). The Dockerfiles are in the Github repo here (opens new window) and the container associated with each pipeline process is defined in the container configuration (opens new window).