A secure container is narrow, explicit, and easy to inspect. Narrow means the image contains only what the application needs to run. Explicit means runtime privileges, capabilities, and mounts are declared and justified. Easy to inspect means no hidden layers, no undocumented dependencies, and no surprise behavior when the container starts.
The principle of least privilege applies at every layer. The base image should have minimal packages, the process should run as a low-privilege user, the container should have only the Linux capabilities it genuinely needs, and the mounts and network paths should be scoped to what the workload actually uses. The goal is to make the container a poor environment for an attacker even if they gain code execution inside it.
Defense in depth for containers means that no single control is relied on exclusively. Image scanning, signing, runtime security policies, and admission controls are independent layers. If one is bypassed or fails, others still limit the damage. This stacked model is what 'keeping the blast radius small' actually looks like in practice.
The most important mental shift is treating security as a build property, not an operational afterthought. A container that enters production insecure cannot be made secure by monitoring alone. The controls that matter most, image hygiene, build discipline, and runtime policy, must be in place before the container is deployed.