A Container makes software transportable by encapsulating all its components (i.e. a compiled application the libraries it depends on) behind a well-defined interface: the Container Image. Trough that the software can be executed in arbitrary, generalized Container Orchestrators.
Containers offer a massive improvement over earlier situations, in which the software and its dependencies needed to be painstakingly installed in the Runtime Environment. They where instrumental in eliminating or mitigating whole classes of errors (e.g. configuration errors, dependency conflicts with OS or other software, version conflicts, permission mistakes / errors, etc). They also made it possible to use infrastructure resources efficiently, by running as much containers as the compute etc resources allowed in isolation on the same host system. Through the ease of deploying and running the containerized software generalized horizontal scaling techniques became feasible, which immensely contributed to reliability through easy replicability / recovery.
The prevailing container standard of today is the Open Container Initiative (OCI) image specification. Every container image that complies with that can run in every Container Runtime that implements the OCI runtime specification. The most common tool to create OCI compliant container images is still Docker, but others contenders, such as podman or BuildKit have gained more traction over the years.