I use Docker for every aspect of my development and deployment workflows as I possibly can. For me it solves so many problems and has saved so much time I can praise it enough. The consistency across environments, operating systems is incredible.
For me I like to setup each environment just a little bit differently however. For example, when I’m developing a NodeJS application locally I might have an environment setup that looks like this:
This example is pretty simple. I have a container running my NodeJS API application, a second container for my database, MySQL or MongoDB, etc., and a third container running my user interface server, Vue.js. I use Docker Compose to manage all of this.
My docker-compose.yml might look something like this:
1 | # docker-compose.dev.yml |
There are a few reasons that I like a development setup like this:
Individual control over each aspect of the application
I can start / stop individual containers easily and independently through a separate terminal window. This also allows be to modify the underlying application environment quickly while developing. For example, adding or changing a Node environment variable.
I can view the individual applications / processes running in the container and monitor terminal output for things like errors or console.log() statements.
That works great for local development, I want fine grained control. But what about moving those same containers to different environments like DEV, QA, or PROD. The container landscape might look a lot different. I probably want applications running in containers to startup automatically. I might also have different configurations based on the environment, URLS, port numbers, etc.