Lazhar
Lazhar

Reputation: 1458

How to setup Docker for a polyglot microservice-based application?

Working on a larger-than-usual project of mine, I am building an web application that will talk to several APIs of mine, each written in its own language. I use two databases, one being MariaDB and the second being Dgraph (graph database.)

Here is my local director architecture:

Local File Structure

Because some components are written in PHP7-NGINX while others are in PYTHON-FLASK-NGINX, how can I do a proper Docker setup with that in mind? Each service, api, daemon and tool is independant and they all talk through their own REST-endpoints.

Each has its own private github repository, and I want to be able to take each one and deploy it to its own server when needed.

I am new to Docker and all the reading I do confuses me: should I create a docker-compose.yml for each service or one for the entire project? But each service is deployed separately so how does docker-compose.yml know that?

Any pointers to a clean solution? Should I create a container for each service and in that container put NGINX, PHP or PYTHON, etc?

Upvotes: 3

Views: 509

Answers (1)

Dmitriusan
Dmitriusan

Reputation: 12399

The usual approach is to put every independent component into a separate container. General Docker idea is 1 container = 1 logical task. 1 task is not exactly 1 process, it's just the smallest independent unit.

So you would need to find 4 basic images (probably existing ones from Docker registry should fit):

  • PHP7-NGINX
  • PYTHON-FLASK-NGINX
  • MariaDB
  • Dgraph

You can use https://hub.docker.com/search/ to search for appropriate images.

Then create custom Docker file for every component (taking either PHP7-NGINX or PYTHON-FLASK-NGINX as a parent image).

You probably would not need custom Docker file for databases. Typically database images require just mounting config file into image using --volume option, or passing environment arguments (see description of base image for details).

After that, you can just write docker-compose.yml and define here how your images are linked and other parameters. That would look like https://github.com/wodby/docker4drupal/blob/master/docker-compose.yml . By the way, github is full of good examples of docker-compose.yml

If you are going to run services on different servers, then you can create a Swarm cluster, and run your docker-compose.yml against it: https://docs.docker.com/compose/swarm/ . After that, you can scale easily by deploying as many instances of each microservice as you need (that's why it's more useful to have separate images for every microservice).

Upvotes: 1

Related Questions