You shouldn't directly use "docker run" in production. At least not yet.
Think of the docker binary and daemon as development tools not a production platform.
Develop your apps one process per container, microservice style. If you can't do that you should probably use vms.
When it comes time to deploy, kubernetes handles scheduling for you automatically across your fleet.
Kubernetes secrets can be mounted inside the containers so you don't leak them like you can with env vars.
Kubernetes will eventually support other runtimes like rkt. But this abstracted away.
Kubernetes assumes a flat networking space, but this is taken care of with stuff like flannel.
You should probobly use Dockerfiles to create containers in your build process. Packer can create them but I would only reccomend that way if you have other tooling that does that. Spinnaker can leverage that bake-centric stuff very nicely.