Docker
Containers that make your software run the same everywhere, every time.
Official Documentation5
integrations
6
documented sections
Overview
Docker is the platform for building, shipping, and running applications inside containers. A container is an isolated process that carries everything an application needs, sharing the host operating system kernel while staying separated from everything else on the machine. That makes it far lighter than a virtual machine: no guest operating system, near-instant startup, efficient resource use. Docker Engine 29 is the current major release, and containers remain the standard unit of deployment across modern infrastructure and every major cloud.
Images and Containers
An image is the sealed recipe; a container is the dish being served. The image is a read-only template holding an application and its dependencies, built from stacked layers that are cached and reused between builds. A container is a running instance of that image with a thin writable layer on top for runtime state. Because images are immutable and identified by content, the same image behaves identically wherever it is pulled, distributed through registries like Docker Hub or a private registry.
Writing a Dockerfile
A Dockerfile is the build recipe written down, so anyone with the repository can reproduce the exact runtime environment. Each instruction, such as FROM, COPY, RUN, and CMD, produces a cached layer, and ordering instructions from least to most frequently changed maximizes cache reuse and keeps builds fast. The file lives in version control beside the application code it packages, which means your runtime environment has a history, a reviewer, and an undo button.
FROM node:24-alpine AS base
WORKDIR /app
COPY package.json pnpm-lock.yaml ./
RUN corepack enable && pnpm install --frozen-lockfile
COPY . .
RUN pnpm build
EXPOSE 3000
CMD ["pnpm", "start"]Multi-Service with Compose
Real products are several services working together, and Compose describes them all in one YAML file: each service, its image or build context, ports, volumes, and dependencies. One command brings the whole stack up on a shared network where services reach each other by name. Your web application, its database, and supporting tools run together locally with a topology close to production, and the local environment becomes a declarative artifact instead of a page of setup instructions that drifts out of date.
How Devyst Uses Docker
We containerize both applications and their supporting services, so every environment in your project is reproducible. Local development uses Compose to run the application beside PostgreSQL, MongoDB, or n8n, closely matching production. Application images are built in continuous integration as immutable artifacts and promoted unchanged from staging to production, which means the build your customers receive is the build that passed every test. Self-hosted tools run as containers too, so your whole infrastructure is described in code.
Image Optimization
Smaller images deploy faster and expose less attack surface, so we keep them lean deliberately. Multi-stage builds compile the application in one stage and copy only the runtime output into a minimal final stage, leaving compilers and build tools behind. Slim and alpine base images cut the starting size, and a dockerignore file keeps stray files out of the build entirely. The container that ships contains only what runtime requires, nothing else.