Run as Non-Root
RUN addgroup -S app && adduser -S app -G app
USER app
Read-Only Filesystem
docker run --read-only --tmpfs /tmp myimage
Limit Capabilities
docker run --cap-drop ALL --cap-add NET_BIND_SERVICE myimage
Resource Limits
docker run --memory 256m --cpus 0.5 --pids-limit 100 myimage
Network Isolation
docker network create --internal isolated_net
docker run --network isolated_net myimage
Security Scanning
# Scan image for vulnerabilities
docker scout cves myimage:latest
# Scan with Trivy
trivy image myimage:latest
Secrets Management
Never bake secrets into images. Use Docker secrets or mount them at runtime:
docker run --secret id=db_pass,src=./db_password.txt myimage
Audit Logging
Enable daemon-level audit logging:
{
"log-driver": "json-file",
"log-opts": {
"max-size": "10m",
"max-file": "3"
}
}