Images
docker build -t name:tag .Build image from Dockerfile in current directorydocker build -t name:tag -f path/Dockerfile .Build with a specific Dockerfile pathdocker build --no-cache -t name:tag .Build ignoring layer cachedocker build --build-arg KEY=val .Pass build argument to Dockerfile ARGdocker pull nginx:alpineDownload image from registrydocker push user/repo:tagUpload image to registrydocker imagesList all local imagesdocker images -qList image IDs onlydocker tag source:tag target:tagCreate a new tag pointing to the same imagedocker rmi image:tagRemove an imagedocker rmi $(docker images -q)Remove all imagesdocker image pruneRemove dangling (untagged) imagesdocker image prune -aRemove all unused imagesdocker history image:tagShow layer history of an imagedocker inspect image:tagShow full image metadata as JSONdocker save image:tag | gzip > image.tar.gzExport image to a tar archivedocker load < image.tar.gzImport image from a tar archiveContainers
docker run image:tagCreate and start a containerdocker run -d image:tag-d detached — run in backgrounddocker run -it image:tag sh-it interactive TTY — attach shelldocker run --rm image:tag--rm — remove container automatically when it exitsdocker run --name myapp image:tagAssign a name to the containerdocker run -p 8080:80 image:tag-p host:container port mappingdocker run -p 127.0.0.1:8080:80 image:tagBind to specific host interfacedocker run -v /host/path:/container/path image:tag-v bind mount host directorydocker run -v myvolume:/data image:tagMount named volumedocker run -e KEY=value image:tag-e set environment variabledocker run --env-file .env image:tagLoad environment variables from filedocker run --network mynet image:tagAttach to a networkdocker run --memory 512m --cpus 1.5 image:tagLimit memory and CPUdocker run --restart unless-stopped image:tagRestart policy: no|always|on-failure|unless-stoppeddocker psList running containersdocker ps -aList all containers including stoppeddocker start / stop / restart nameStart / stop / restart a containerdocker stop $(docker ps -q)Stop all running containersdocker rm nameRemove a stopped containerdocker rm -f nameForce remove a running containerdocker container pruneRemove all stopped containersdocker exec -it name shRun shell in running containerdocker exec name commandRun one-off command in running containerdocker logs nameView container logsdocker logs -f nameFollow (tail) container logsdocker logs --tail 100 nameShow last 100 log linesdocker cp name:/path/file ./localCopy file from container to hostdocker cp ./local name:/path/fileCopy file from host to containerdocker statsLive CPU, memory, and network usage for all containersdocker top nameShow running processes inside a containerdocker inspect nameShow full container metadata as JSONdocker diff nameShow filesystem changes made by containerdocker commit name new-image:tagCreate image from container stateDockerfile
FROM node:20-alpineBase image — must be first instructionFROM node:20-alpine AS builderNamed stage for multi-stage buildsCOPY --from=builder /app/dist ./distCopy from a previous build stageRUN apt-get update && apt-get install -y curlRun command during build — creates a layerRUN --mount=type=cache,target=/root/.npm npm installMount cache during build — not stored in imageCOPY src/ /app/src/Copy files from build context into imageCOPY --chown=node:node . .Copy with ownershipADD archive.tar.gz /app/ADD auto-extracts archives; prefer COPY for plain filesWORKDIR /appSet working directory — created if it does not existENV NODE_ENV=productionSet environment variable — persists at runtimeARG VERSION=1.0Build-time variable — not available at runtimeEXPOSE 8080Document which port the container listens on (does not publish)USER nodeSwitch to non-root user — do this before CMD/ENTRYPOINTVOLUME ["/data"]Declare a mount point — creates anonymous volume if not mountedLABEL version="1.0" maintainer="you@example.com"Metadata key-value pairsCMD ["node", "server.js"]Default command — overridable at docker runCMD ["npm", "start"]Exec form (preferred) — no shell, signals handled correctlyENTRYPOINT ["docker-entrypoint.sh"]Fixed executable — CMD becomes its argumentsENTRYPOINT ["nginx", "-g", "daemon off;"]Common pattern: ENTRYPOINT sets binary, CMD sets flagsHEALTHCHECK --interval=30s --timeout=5s CMD curl -f http://localhost/ || exit 1Health check command run periodicallyHEALTHCHECK NONEDisable inherited health checkONBUILD COPY . /appTrigger instruction when this image is used as a baseSHELL ["/bin/bash", "-c"]Override default shell for RUN commandsCompose
docker compose up -dCreate and start all services in backgrounddocker compose up -d --buildRebuild images before startingdocker compose downStop and remove containers and networksdocker compose down -vAlso remove named volumesdocker compose down --rmi allAlso remove images built by Composedocker compose buildBuild or rebuild service imagesdocker compose build --no-cacheBuild ignoring cachedocker compose psList service containers and their statusdocker compose logs -fFollow logs from all servicesdocker compose logs -f serviceFollow logs from one servicedocker compose exec service shOpen shell in a running service containerdocker compose run --rm service commandRun one-off command in a new containerdocker compose restart serviceRestart a specific servicedocker compose stop / start serviceStop / start a service without removing itdocker compose pullPull latest images for all servicesdocker compose configValidate and print the resolved Compose configdocker compose --profile prod up -dStart services matching a profiledocker compose -f docker-compose.yml -f docker-compose.prod.yml up -dMerge multiple Compose filesdepends_on:\n db:\n condition: service_healthyWait for service health check before startingVolumes & Networks
docker volume create myvolumeCreate a named volumedocker volume lsList all volumesdocker volume inspect myvolumeShow volume details including mount pointdocker volume rm myvolumeRemove a volumedocker volume pruneRemove all unused volumes-v myvolume:/dataMount named volume-v /host/path:/container/pathBind mount — sync host directory into container-v /host/path:/container/path:roBind mount read-only--mount type=tmpfs,target=/tmptmpfs mount — in-memory, not persisteddocker network create mynetCreate a bridge networkdocker network create --driver overlay mynetCreate overlay network (Swarm)docker network lsList all networksdocker network inspect mynetShow network details and connected containersdocker network connect mynet nameConnect a running container to a networkdocker network disconnect mynet nameDisconnect container from networkdocker network rm mynetRemove a networkdocker network pruneRemove all unused networks--network hostUse host network stack — no isolation, best performance--network noneDisable all networkingRegistry
docker loginLog in to Docker Hubdocker login ghcr.ioLog in to GitHub Container Registrydocker logoutLog out from registrydocker search nginxSearch Docker Hub for imagesdocker tag myapp:latest user/myapp:1.0Tag image for push to registrydocker push user/myapp:1.0Push image to registrydocker pull user/myapp:1.0Pull specific image versiondocker pull user/myapp@sha256:abc123Pull by digest — exact, immutable referencedocker manifest inspect image:tagShow manifest — useful for multi-arch imagesdocker buildx build --platform linux/amd64,linux/arm64 -t user/app:tag --push .Build and push multi-architecture imagedocker system dfShow disk usage by images, containers, volumesdocker system pruneRemove all stopped containers, unused networks, dangling imagesdocker system prune -a --volumesFull cleanup — remove everything unused including volumes