Run processes as a non-root user, use minimal images, scan dependencies, and provide only the Linux capabilities a service needs. Read-only root filesystems, dropped capabilities, and resource limits reduce the impact of a compromise or runaway process.
Containers are not a complete security boundary by themselves. Keep the host kernel patched, avoid mounting the Docker socket into untrusted containers, and treat secrets as runtime-managed values rather than image-layer files.