To provide an alternative perspective, the dogma that "one container = one program" looks truly bizarre to some of us on the outside who have been using containers for years and years at various companies.
I prefer to do this - you run entire application stacks inside your container (where it makes sense), rather than run 5 different containers to support the one application. Particularly if your application stack is immutable, it makes deployment far easier than trying to coordinate multiple containers (and versions)
This is fine for a development environment or even a very small application. But when you need to scale individual components of the stack differently, e.g Postgres, Redis and RabbitMQ, it doesn't make sense to scale the whole stack horizontally by simply starting a new container.
If you take a look at PaaS such as Heroku you are always getting a DNS address to these other services. In some cases they may be simply another scheduled container, but in other cases you may be using a database as a service platform similar to Amazon Dynamo.