"In addition, Docker solves another problem: installing software. Before Docker, developers had to use tools such as Chef or Puppet to install software reproducibly."
I would argue that the idea of Docker replacing the requirement for some type of configuration management is just plain wrong. Whilst it is true containerisation provides a very convenient way of deploying discrete applications without the risk of updating relevant libraries or packages, in my experience you still need a method of controlling the actual configuration of those microservices (things like nginx.conf or dhcpd.master for example).
The real power of containerisation is when you integrate that technology stack into a CI/CD pipeline where your unit testing (or whatever quality control is imposed) is as close to production as it's going to get. Part of that pipeline is usually something like Chef or Puppet which controls the state of those configurations as well as dynamically updating them depending on the environment (templating).
Other than that, pretty good article :)