A practical breakdown of techniques for optimizing Docker images for Java applications, based on a webinar using a Spring Boot app with Vaadin, MongoDB, Kafka, and Spring Security. Key techniques covered include multi-stage builds with lightweight base images (cutting size from ~1 GB to ~206 MB), JAR layering to reduce per-deploy push size from 74 MB to under 2 MB, build packs as a Dockerfile-free alternative, AOT cache (Java 24+) to cut startup from ~4s to ~1.4s, GraalVM native images for sub-second startup, and hardened base images to eliminate CVEs. The core message is that there is no single perfect image — the right approach depends on whether you are optimizing for size, startup speed, push efficiency, or security, and these techniques can be combined.