Docker Compose is a tool for defining and running multi-container Docker applications. Just like docker, the docker-compose source code is also officially hosted on GitHub and it is opensource.
Dockerfile is a template to define a single container. But in this real world, you will often need multiple containers e.g database (mysql), message queue like (Apache Kafka or JMS), web app (written in Java, NodeJs or Python) and so on to work together. If you just think in a pure docker prospective, you will have to write a lot of extra configuration code in a bash script or shell script in order to make multiple containers work together and start, stop or destroy them as per your need. In order to make such a task simpler, docker compose is what you should use.
docker-compose, you define multiple associated containers in a
docker-compose.yml file. If you want the application to be running inside a container then create a
Dockerfile for your application. Once the configuration is complete, use
docker-compose up to run the multiple containers specified in the
docker-compose.yml file. I will create a simple spring-boot hello-world example to understand this further.
Installation of Docker Compose
Please follow the official guide for docker-compose installation. Docker Desktop (for Windows and Mac) already comes with docker-compose, so you will not need to install it separately. Only the other OS users will need to install it separately. Not to miss out, you must have Docker installed in your system in order to use docker-compose.
Understand service and project in docker-compose
In order to understand the working of docker-compose, it is important to understand the below concepts.
service): An application container that can actually run multiple instances of the same image.
project): A complete business unit consisting of a set of associated application containers.
A project can be associated with multiple services (containers).
Docker compose example with Python 3.x and redis
Download the source code from the link below.
Once you have the code downloaded,
- Unzip it and navigate inside
- If everything goes well as expected, the above commands should run successfully
- Navigate to http://0.0.0.0:5000/
- You should be able to see “hello there” message as shown in the screenshot below.
Explanation of the code
The example code is taken from the docker official site. It is using Flask python framework and Redis cache to build a simple web application (just like one you develop). Flask is a microframework for Python based on Werkzeug, Jinja 2. Basically, there are 2 containers, one with the python web-app and the other one is a Redis container.
Let’s look at the
docker-compose.yml file below. As you know, this is a must have file where you define the configuration of your multiple containers.
There are basically 2 services,
web – This is
build from a
Dockerfile which is located in the same directory
redis – This is created from official
NOTE: Based on your need you can have multiple containers defined under services. These containers are built from Dockerfile or pulled from docker registry as per your need.
Look at the
Dockerfile below. As you can see, it builds a docker-image with python and having the code (app.py) in the right directory.
Finally, our beloved
app.py has the
NOTE: After making any code change, you need to rebuild the containers using
docker-compose up --build
Docker compose example for a Spring boot + MongoDB + Nginx
This code is already present in the above-downloaded example if you have not, please download it from here.
- Navigate inside
docker compose up --build
- Open http://localhost to make sure example is working with Nginx
- Open http://localhost:8080 to make sure spring-boot app is working
Now, let us look into the
docker-compose.yaml file to understand how a Spring boot app is made to work with MongoDB and Nginx.
NOTE: The docker-compose file can have
There are several things to note in the above compose file.
restart:always – This is a container restart policy, this value is ignored when using
volumes – Binds the host folder/file with container folder/file
dependes_on – Docker compose allows container dependencies. In this case
bb-nginx starts after
app container is started. Similarly,
app is dependent on
You can stop the running containers using
docker-compose stop. Docker compose
up and compose
stop respects the dependencies order. So for the above example, bb-mongo will start first, then the app, then bb-nginx. In the same way, bb-nginx will be stopped first, then the app and finally bb-mongo stops.