This cheatsheet is a quick reference for Docker Swarm in the real world. It covers cluster bootstrapping, node management, services, stacks, secrets, configs, overlay networking, and the commands you need to operate a small Swarm cluster confidently.
Swarm Basics#
docker swarm init # Initialize a new swarm on the current node
docker swarm init --advertise-addr 10.0.0.10 # Specify the address for other nodes to connect
docker swarm join-token manager # Show manager join command
docker swarm join-token worker # Show worker join command
docker swarm leave # Leave the swarm
docker swarm leave --force # Force leave a managerNode Management#
docker node ls # List swarm nodes
docker node inspect <node> # Inspect a node
docker node ps <node> # List tasks running on a node
docker node promote <node> # Promote worker to manager
docker node demote <node> # Demote manager to worker
docker node update --availability drain <node> # Drain a node for maintenance
docker node update --availability active <node> # Make a node active again
docker node rm <node> # Remove a node from the swarm, only works if node has no running tasks or is drainedServices#
docker service create --name web -p 80:80 nginx:alpine # Creates 1 replica by default
docker service scale web=3 # Scale replicas
docker service ls # List services
docker service ps web # List tasks for a service
docker service inspect web # Inspect service details
docker service logs web # Show service logs
docker service update --image nginx:1.27 web # Update service image
docker service update --replicas 5 web # Update number of replicas
docker service rollback web # Roll back to previous spec
docker service rm web # Remove a serviceService Placement And Availability#
docker service create \
--name api \
--constraint 'node.role==worker' \
--replicas 2 \
myapi:latest
docker service create \
--name db \
--placement-pref 'spread=node.labels.zone' \
postgres:16
docker node update --label-add zone=west <node>
docker node update --label-add zone=east <node>Stacks#
services:
web:
image: nginx:alpine
ports:
- "8080:80"
deploy:
replicas: 2
mode: replicated # Explicitly state replication mode
update_config:
parallelism: 1
order: start-first
redis:
image: redis:7-alpine
deploy:
replicas: 1docker stack deploy -c stack.yml mystack # Deploy a stack
docker stack ls # List stacks
docker stack services mystack # List stack services
docker stack ps mystack # List tasks in a stack
docker stack rm mystack # Remove a stackSecrets And Configs#
printf 'supersecret' | docker secret create db_password -
docker secret ls # List secrets
docker secret inspect db_password # Inspect a secret
docker secret rm db_password # Remove a secret
printf 'LOG_LEVEL=info' | docker config create app_config -
docker config ls # List configs
docker config inspect app_config # Inspect a config
docker config rm app_config # Remove a configOverlay Networking#
docker network create -d overlay frontend --attachable frontend # Create overlay network
docker network ls # List networks
docker network inspect frontend # Inspect network
docker service create --name web --network frontend nginx:alpine # Create service on overlay networkRolling Updates#
docker service update \
--image nginx:1.27 \
--update-parallelism 1 \
--update-delay 10s \
--update-order start-first \
--stop-grace-period 30s \
web
docker service update --rollback web
docker service update --force web # Redeploy tasks without changing specHealth And Troubleshooting#
docker service ps web --no-trunc # Show full task details
docker service inspect --pretty web # Human-readable service summary
docker node inspect --pretty <node> # Human-readable node summary
docker events # Watch swarm events
docker logs $(docker ps -q --filter name=web) # Container logs on a nodeCommon Deployment Pattern#
docker swarm init
docker network create -d overlay appnet
docker secret create db_password ./db_password.txt
docker stack deploy -c stack.yml app
docker stack ps app --no-trunc # Check all tasks are healthy before proceeding
docker service ls
docker stack services appCleanup#
docker stack rm app
docker service rm web
docker node rm <node>
docker swarm leave --force # Destroys local cluster data! Only use --force when recovering from failed managers
docker system prune -a # Remove unused objects on a nodeHandy Tips#
- Manager Nodes: Keep them minimal (3 or 5). More managers increase Raft consensus overhead.
- Stacks over Services: Prefer docker stack for multi-service apps; it handles dependencies and scaling better than individual service commands.
- Secrets: Never bake secrets into images. Use Docker secrets which are encrypted at rest and mounted read-only.
- Labels: Apply node labels early (zone, ssd, gpu) to make placement constraints readable and portable.
- Testing: Always test –update-order and –rollback in a staging environment before production.
- Quorum: If you lose more than half your managers, the cluster locks down. Have a documented recovery plan.
