Well to be honest, Docker is much more than just from a developer's perspective. With Docker you version entire machines while otherwise you version packages, like your frontend package, backend package which you then deploy to some existing server.
With Docker you create an image of a machine, containing already everything you need to run your app and you then deploy the entire container in production and drop the old one. This involves a lot of automation at various steps in the pipeline.
Personally I'd first go with an automated build pipeline such as a build server. We for instance use Jenkins for that, but there are a load of other tools available.
The workflow is the following: whenever some developer commits to our Gitlab server which hosts the src code, a trigger is fired to some build job on Jenkins (which we configured before) which then takes care of fetching the latest version from GitLab, doing the build, running the tests for then either creating a deployable package or in some case even deploying automatically via SSH to the server itself.
To get an idea, here's a video lesson I recently published on Egghead of a possible setup for an Angular application with GitHub as the src server, Travis as the build server and Firebase as the hosting location.