Immutable Server model with Docker/Ansible vs. Ansible, Puppet, and Foreman in AWS?

In our company we have successfully implemented Puppet on customer's legacy infrastructure. We are also using Docker containers to run a dedicated service (which is in fact an old application trimmed and twisted to fit into containers).
I was not happy with containers the first time I stared working with them (yeah... 30kb app becomes 200MB heavy image) but when I had to recreate the whole environment after a small disaster I changed my mind. I think Docker was invented exactly for this: fast and often deployments without worries about server configuration. If you design the containers correctly you can switch between cloud providers, developer laptops and colocation datacenters with ease. Because all you need is a vanilla Linux box with Docker daemon.

  • In scenario 1) you have everything in one place (I mean one because with Docker you will have code AND configuration in the same repository) easy to manage, read and deploy.
  • In scenario 2) you have to store configuration parts for 3 different(!) tools in one repo and application code in the other which makes things more complicated

I was also usinng Puppet in my previous project and my experience so far is that immutable server is achievable rather with Docker than Puppet or Chef. I believe that Configuration Management tools are more useful for Cloud Providers rather than development team.