Historically, there have been substantial gaps between development (a developer making live edits to a local deploy of the app) and production (a running deploy of the app accessed by end users). These gaps manifest in three areas:
- The time gap: A developer may work on code that takes days, weeks, or even months to go into production.
- The personnel gap: Developers write code, ops engineers deploy it.
- The tools gap: Developers may be using a stack like Nginx, SQLite, and OS X, while the production deploy uses Apache, MySQL, and Linux.*
The Old Way
Your app is deployed manually - usually through a series of scripts and shell commands, often requiring several team members to work together. Deployments are slow, unpredictable, error-prone, and irreversible. Some people call this "push & pray style deployment"
Your developers work in a local environment on their laptop that has little resemblance to the cloud environment where the app will run in production. All manner of difficult-to-squash bugs arise from this inconsistency.
The Modern Way
Any authorized developer can deploy your app with a single command. Deployments are fully automated - so they are quick, safe, and reproducible. If there's a problem, you can swiftly roll back to a previous version with a single command.
Your programmers work in a Dockerized development environment that's essentially a miniature version of your full production environment. The same OS and version, the same webserver configurations, the same kind of database and other backing services. If code works in dev, you can be confident it will work in production.