Open In App

Docker – Compose

Improve
Improve
Improve
Like Article
Like
Save Article
Save
Share
Report issue
Report

Pre-requisite: Docker 

An open-source platform called Docker makes it simple to design, ship, and deploy applications. It runs an application in an isolated environment by compiling all of its dependencies into a so-called container. for additional information on Docker. In a normal case, a number of services, such as a database and load balancing, are required to support an application. We’ll look at Docker Compose’s assistance with setting up many services in this article. Also, we will see a demonstration of installing and utilizing Docker Compose.

What is Docker Compose

Docker Compose will execute a YAML-based multi-container application. The YAML file consists of all configurations needed to deploy containers Docker Compose, which is integrated with Docker Swarm, and provides directions for building and deploying containers. With Docker Compose, each container is constructed to run on a single host.

Install Docker Compose

We can run Docker Compose on macOs, Widows, and 64-bit Linux. 

  • For any significant activity, Docker Compose depends on Docker Engine. Depending on your arrangement, we must ensure that Docker Engine is installed either locally or remotely.
  • A desktop system such as Docker for Mac and Windows comes with Docker Compose preinstalled. 
  • Install Docker first as instructed in Docker installation on the Linux system before beginning the installation of Docker Compose. 

Steps to install Docker Compose 

Step 1: The following scripts will install the most recent version of Docker Compose and update the package management.

sudo apt-get update
sudo apt-get install docker-compose-plugin

Here we are using the Ubuntu flavor in the Linux Operating system. So the package manager is “apt-get” If you want to install it in Redhat Linux then the package manager will be “yum”.

Step 2: Check the version to ensure that Docker Compose is installed successfully.

docker-compose version
Docker Compose version vN.N.N

Docker Container

A docker container is a lightweight Linux-based system that packages all the libraries and dependencies of an application, prebuilt and ready to be executed. It is an isolated running image that makes the application feel like the whole system is dedicated to it. Many large organizations are moving towards containers from VMs as they are light and simple to use and maintain. But when it comes to using containers for real-world applications, usually one container is not sufficient. For example, Let’s assume Netflix uses a microservices architecture. Then it needs services for authentication, Login, Database, Payment, etc, and for each of these services, we want to run a separate container.

It is preferred for a container to have only a single purpose.

Now, imagine writing separate docker files, and managing configuration and networks for each container. This is where Docker Compose comes into the picture and makes our lives easy.

Why Docker Compose?

As discussed earlier,  a real-world application has a separate container for each of its services. And we know that each container needs to have a Dockerfile. It means we will have to write maybe hundreds of docker files and then manage everything about the containers individually, That’s cumbersome. 

Hence we use docker-compose, which is a tool that helps in the definition and running of multi-container applications. With the help of Docker Compose you can start and stop the services by using its YAML file.

Docker-compose allows us to start and stop all of the services with just a few simple commands and a single YAML file for each configuration.

In contrast to utilizing a prebuilt image from Docker Hub, which you may configure with the docker-compose.yaml file, if you are using a custom image, you will need to declare its configurations in a separate Dockerfile.

These are the features that docker-compose support:

  • All the services are isolated running on a single host.
  • Containers are recreated only when there is some change.
  • The volume data is not reset when creating new containers, volumes are preserved.
  • Movement of variables and composition within environments.
  • It creates a virtual network for easy interaction within the environments.

Now, let’s see how we can use docker-compose, using a simple project.

How to Use Docker Compose? With example 

In this project, we will create a straightforward Restfull API that will return a list of fruits. We will use a flask for this purpose. And a PHP application will request this service and show it in the browser. Both services will run in their own containers.

  • First, Create a separate directory for our complete project. Use the following command.
mkdir dockerComposeProject
  • Move inside the directory.
cd dockerComposeProject

Create API

we will create a custom image that will use Python to serve our Restful API defined below. Then the service will be further configured using a Dockerfile.

  • Then create a subdirectory for the service we will name it product. and move into the same.
mkdir product
cd product

Build Python  api.py

from flask import Flask
from flask_restful import Resource, Api

# create a flask object
app = Flask(__name__)
api = Api(app)

# creating a class for Fruits that will hold
# the accessors
class Fruits(Resource):
    def get(self):
      # returns a dictionary with fruits
        return {
            'fruits': ['Mango',
                        'Pomegranate',
                        'Orange',
                        'Litchi']
        }

# adds the resources at the root route
api.add_resource(Fruits, '/')

# if this file is being executed then run the service
if __name__ == '__main__':
      # run the service
    app.run(host='0.0.0.0', port=80, debug=True)
  • Create a Dockerfile to define the container in which the above API will run.

Create Dockerfile For Python API 

FROM python:3-onbuild
COPY . /usr/src/app
CMD ["python", "api.py"]

FROM accepts an image name and a version that the docker will download from the docker hub. The current working directory’s contents can be copied to the location where the server expects the code to be by using the copy command. Moreover, the CMD command takes a list of commands to start the service once the container has been started.

Create Php HTML Website 

Let’s create a simple website using PHP that will use our API.

  • Move to the parent directory and create another subdirectory for the website.
cd ..
mkdir website
cd website

index.php

<!DOCTYPE html>
<html lang="en">
<head>
   <title>Fruit Service</title>
</head>
<body>
   <h1>Welcome to India's Fruit Shop</h1>
   <ul>
       <?php
           $json = file_get_contents('http://fruit-service');
           $obj = json_decode($json);
           $fruits = $obj->fruits;
           foreach ($fruits as $fruit){
               echo "<li> $fruit </li>";
           }
       ?>
   </ul>
</body>
</html>
  • Now create a compose file where we will define and configure the two services, API and the website.
  • Move out of the website subdirectory using the following code.
cd ..

And then create the file name as . docker-compose.yaml 

Create Docker-compose.yaml file 

version: "3"

services:
 fruit-service:
   build: ./product
   volumes:
     - ./product:/usr/src/app
   ports:
     - 5001:80

 website:
   image: php:apache
   volumes:
     - ./website:/var/www/html
   ports:
     - 5000:80
   depends_on:
     - fruit-service

Docker-compose.yaml file Explanation

The first line is optional where we specify the version of the docker-compose tool. Next services define a list of services that our application is going to use. The first service is fruit service which is our API and the second one is our website. The fruit service has a property build that contains the dockerfile that is to be built and created as an image. Volumes define storage mapping between the host and the container so that we can make live changes. Finally, port property exposes the containers port 80 through the host’s 5001.

The website service does not use a custom image but we download the PHP image from the Docker hub and then map the websites folder that contains our index.php to /var/www/html (PHP expects the code to be at this location). Ports expose the container port. Finally, the depends_on specifies all the services on which the current service depends.

  • The folder structure after creating all the required files and directory will be as follows:

Docker Compose folder structure

Run the application stack 

Now that we have our docker-compose.yml file, we can run it.

  • To start the application, enter the following command.
docker-compose up -d 

Now all the services will start and our website will be ready to be used at localhost:5000.

  • Open your browser and enter localhost:5000.

Output

Application from internet

  • To stop the application, either press CTRL + C or
docker-compose stop

Conclusion

In this article, we learned about Docker Compose, and why and when to use it. And demonstrated its use through a simple project.



Last Updated : 20 Sep, 2023
Like Article
Save Article
Previous
Next
Share your thoughts in the comments
Similar Reads