Changing Environment Setup in Docker Compose

01-18-2019

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
# docker-compose.dev.yml
version: '3'
services:
server:
build:
context: .
dockerfile: node-8.Dockerfile
container_name: server
restart: always
ports:
- '3000:3000'
links:
- mongo
stdin_open: true
volumes:
- ./server:/api
working_dir: /api
database:
container_name: mongo
image: mongo
ports:
- '27017:27017'
web:
build:
context: .
dockerfile: vuejs.Dockerfile
container_name: web-server
ports:
- "4000:4000"
volumes:
- ./client:/ui
working_dir: /ui

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.