MicroServices using Docker Compose — a Tiny Demonstration
Here is a super quick way to launch two services, one running a Python based Docker Container application and the other running a Docker Container running Redis Server. Docker compose create a custom bridge network allowing these two micro services to be able to discover and each other without having to expose ports.
Here is the Dockerfile
FROM python:2.7-slim
WORKDIR /app
ADD . /app
RUN pip install --trusted-host pypi.python.org Flask Redis
EXPOSE 80
CMD ["python", "app.py"]
And here is the Python application app.py in the same folder (build context).
from flask import Flask
from redis import Redis, RedisError
import os
import socketredis = Redis(host="redis-server", db=0, socket_connect_timeout=2, socket_timeout=2)app = Flask(__name__)@app.route("/")
def hello():
try:
visits = redis.incr("counter")
except RedisError:
visits = "<i>cannot connect to Redis server to count</i>"html = "<h3>Hello World!</h3>\n" \
"<b>Hostname:</b> {hostname}<br/>\n" \
"<b>Visits:</b> {visits}\n"return html.format(hostname=socket.gethostname(), visits=visits)if __name__ == "__main__":
app.run(host='0.0.0.0', port=80)
Note that the above application listens to port 80 which is also exposed in the Dockerfile and it expects the Redis Server’s hostname to be “redis-server” Let us test this.
Now let us create the docker-compose.yml file as below.
version: "3"
services:
redis-server:
image: redis:alpine
ports:
- "6379"
networks:
- mynet
app:
build: app
ports:
- "8080:80"
networks:
- mynet
depends_on:
- redis
networks:
mynet:
Folder/file structure should look like this and you should be the top folder which has the docker-compose.yml file.
.
├── app
│ ├── Dockerfile
│ └── app.py
└── docker-compose.yml
Let us now launch the application.
docker-compose up -d
This will build the Python application image first before creating the container and use redis:alpine image to launch the Redi-Server.
Above assumes that port 8080 is free on the host machine. Let us now test this.
curl localhost:8080
<h3>Hello World!</h3><b>Hostname:</b> b3f2f3a731a6<br/><b>Visits:</b> 1curl localhost:8080
<h3>Hello World!</h3><b>Hostname:</b> b3f2f3a731a6<br/><b>Visits:</b> 2
Notice that our app container is able to discover the IP address of the Redis Server using the host name “redis-server” as referred in the app.py
Thanks for your time. Please follow me for more such tiny demo snippets!