With configuration management systems, you write code that describes how you want some component of your systems to be installed and configured, and when you execute the code on your server, it should end up in the desired state.
building a hosting platform that is capable of a lot of things that system administrators used to do manually
build modules on deployment via bundler or npm or similar, it can be incredibly slow to run, taking minutes or longer in some cases
deploying with configuration management tools is a pain in the ass and error prone.
Support for containers has existed in the Linux kernel since version 2.6.24 when cgroup support was added
All of the logic that used to live in your cookbooks/playbooks/manifests/etc now lives in a Dockerfile that resides directly in the repository for the application it is designed to build
All of the dependencies of the application are bundled with the container which means no need to build on the fly on every server during deployment.
Containers bring standardization which allows for systems like centralized logging, monitoring, and metrics to easily snap into place no matter what is running in the container.
Dockerfiles do not give you the same level of control over configuration as your application transitions between environments, like dev, staging, and production.
You may even need to have different Dockerfile’s for each environment in certain cases.
configuration management systems now have hooks for docker integration.
Config management will only be used to install Docker, an orchestration system, configure PAM/SSH auth, and tune OS sysctl values.
"With configuration management systems, you write code that describes how you want some component of your systems to be installed and configured, and when you execute the code on your server, it should end up in the desired state."
Backing services, such as the app’s database, queueing system, or cache, is one area where dev/prod parity is important
The twelve-factor developer resists the urge to use different backing services between development and production, even when adapters theoretically abstract away any differences in backing services.
declarative provisioning tools such as Chef and Puppet combined with light-weight virtual environments such as Docker and Vagrant allow developers to run local environments which closely approximate production environments.
all deploys of the app (developer environments, staging, production) should be using the same type and version of each of the backing services.
"One of the most important parts in the web is a browser. A browser is the window through which web users interact with web applications and other users. Users are always talking with web applications through browsers.
"