Microservices PoC: Docker Calculator build with docker-compose

Docker-Compose

Hopefully you have been following my Docker exploits allowing me to share as I go along. Recently I posted a part two on my Microservices PoC describing a simple calculator. The solution currently instructs to you to execute four (4) docker build commands to create the individual containers for the calculator function. When I did this, I felt there had to be a simpler way. To my delight, docker-compose was the answer. In order to use Docker Compose on my Ubuntu system, I needed to download and install it. To keep it simple, I’ll include the steps here:

Install Docker Compose

Execute the following at your command prompt to install the most current version at the time of this post:

dbryant@asus: sudo curl -L https://github.com/docker/compose/releases/download/1.15.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

dbryant@asus: sudo chmod +x /usr/local/bin/docker-compose

dbryant@asus: docker-compose --version
docker-compose version 1.15.0, build e12f3b9

With docker-compose installed, we can now use the docker-compose.yml file to combine several steps into one. In this case the four docker build commands along with the subsequent docker run commands will be handled with one docker-compose.yml file.

Create docker-compose.yml file

In your favorite editor, vi perhaps, create the docker-compose.yml file in the directory with your current “Dockerfile” files.

dbryant@asus: ls
add2.js docker-compose.yml Dockerfile_d Dockerfile_s
divide2.js Dockerfile Dockerfile_m multiply2.js

dbryant@asus: cat docker-compose.yml
add:
build: .
dockerfile: Dockerfile
ports:
- "3000:3000"
subtract:
build: .
dockerfile: Dockerfile_s
ports:
- "3001:3001"
multiply:
build: .
dockerfile: Dockerfile_m
ports:
- "3002:3002"
divide:
build: .
dockerfile: Dockerfile_d
ports:
- "3003:3003"

I have found the docker-compose.yml file to extremely finicky with spacing, tabs, and line feeds so it make take a few times to get the file structure correct.

Once done, we can now use the docker-compose up command to perform the build and run of the four images. In essence, the docker-compose.yml file uses the Dockerfiles identified to build the images and in this situation, exposes the math functions on the various ports 3000, 3001, 3002, 3003.

Run docker-compose up

dbryant@asus:~/development/github.com/Docker/Docker_Calc$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dbryant@asus:~/development/github.com/Docker/Docker_Calc$
dbryant@asus:~/development/github.com/Docker/Docker_Calc$ docker-compose up
Building multiply
Step 1/8 : FROM oraclelinux:7-slim
7-slim: Pulling from library/oraclelinux
3152c71f8d80: Already exists
Digest: sha256:e464042b724d41350fb3ac2c2f84bd9d28d98302c9ebe66048a5367682e5fad2
Status: Downloaded newer image for oraclelinux:7-slim
---> c0feb50f7527
Step 2/8 : ADD node-v6* /opt/
---> e3bc3a113c3d
Removing intermediate container f4f355ae55b5
Step 3/8 : ENV PATH /opt/node-v6.11.1-linux-x64/bin:$PATH
---> Running in 3e2731e6ca82
---> 6cc0e7aaf81b
Removing intermediate container 3e2731e6ca82
Step 4/8 : ENV NODE_PATH /opt/node-v6.11.1-linux-x64/lib/node_modules/
---> Running in 7029d5a7d4ed
---> b370b425a9e7
Removing intermediate container 7029d5a7d4ed
Step 5/8 : RUN npm install -g express
---> Running in 5c58fa043b20
/opt/node-v6.11.1-linux-x64/lib
`-- express@4.15.4
+-- accepts@1.3.4
| +-- mime-types@2.1.16
| | `-- mime-db@1.29.0
| `-- negotiator@0.6.1
+-- array-flatten@1.1.1
+-- content-disposition@0.5.2
+-- content-type@1.0.2
+-- cookie@0.3.1
+-- cookie-signature@1.0.6
+-- debug@2.6.8
| `-- ms@2.0.0
+-- depd@1.1.1
+-- encodeurl@1.0.1
+-- escape-html@1.0.3
+-- etag@1.8.0
+-- finalhandler@1.0.4
| `-- unpipe@1.0.0
+-- fresh@0.5.0
+-- merge-descriptors@1.0.1
+-- methods@1.1.2
+-- on-finished@2.3.0
| `-- ee-first@1.1.1
+-- parseurl@1.3.1
+-- path-to-regexp@0.1.7
+-- proxy-addr@1.1.5
| +-- forwarded@0.1.0
| `-- ipaddr.js@1.4.0
+-- qs@6.5.0
+-- range-parser@1.2.0
+-- send@0.15.4
| +-- destroy@1.0.4
| +-- http-errors@1.6.2
| | `-- inherits@2.0.3
| `-- mime@1.3.4
+-- serve-static@1.12.4
+-- setprototypeof@1.0.3
+-- statuses@1.3.1
+-- type-is@1.6.15
| `-- media-typer@0.3.0
+-- utils-merge@1.0.0
`-- vary@1.1.1

---> dbc77ff00d97
Removing intermediate container 5c58fa043b20
Step 6/8 : ADD multiply2.js .
---> 2426ecb359c2
Removing intermediate container 136f55d5a34d
Step 7/8 : EXPOSE 3002
---> Running in f1088f80a7a6
---> c51ebc6c96f4
Removing intermediate container f1088f80a7a6
Step 8/8 : CMD node multiply2.js
---> Running in ab9ba3505470
---> a9bd02502eb9
Removing intermediate container ab9ba3505470
Successfully built a9bd02502eb9
Successfully tagged dockercalc_multiply:latest
WARNING: Image for service multiply was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building add
Step 1/7 : FROM oraclelinux:7-slim
---> c0feb50f7527
Step 2/7 : ADD node-v6* /opt/
---> Using cache
---> e3bc3a113c3d
Step 3/7 : ENV PATH /opt/node-v6.11.1-linux-x64/bin:$PATH
---> Using cache
---> 6cc0e7aaf81b
Step 4/7 : ENV NODE_PATH /opt/node-v6.11.1-linux-x64/lib/node_modules/
---> Using cache
---> b370b425a9e7
Step 5/7 : RUN npm install -g express
---> Using cache
---> dbc77ff00d97
Step 6/7 : ADD add2.js .
---> 4918e0593ae4
Removing intermediate container f4a9e564b16a
Step 7/7 : CMD node add2.js
---> Running in ffcd4de5bd01
---> e8af879c151a
Removing intermediate container ffcd4de5bd01
Successfully built e8af879c151a
Successfully tagged dockercalc_add:latest
WARNING: Image for service add was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building subtract
Step 1/8 : FROM oraclelinux:7-slim
---> c0feb50f7527
Step 2/8 : ADD node-v6* /opt/
---> Using cache
---> e3bc3a113c3d
Step 3/8 : ENV PATH /opt/node-v6.11.1-linux-x64/bin:$PATH
---> Using cache
---> 6cc0e7aaf81b
Step 4/8 : ENV NODE_PATH /opt/node-v6.11.1-linux-x64/lib/node_modules/
---> Using cache
---> b370b425a9e7
Step 5/8 : RUN npm install -g express
---> Using cache
---> dbc77ff00d97
Step 6/8 : ADD subtract2.js .
---> b87fd184c682
Removing intermediate container 230a1bd82ed5
Step 7/8 : EXPOSE 3001
---> Running in a3ce90e09053
---> 4251062554a8
Removing intermediate container a3ce90e09053
Step 8/8 : CMD node subtract2.js
---> Running in 992df846b962
---> 2e16507c16a6
Removing intermediate container 992df846b962
Successfully built 2e16507c16a6
Successfully tagged dockercalc_subtract:latest
WARNING: Image for service subtract was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Building divide
Step 1/8 : FROM oraclelinux:7-slim
---> c0feb50f7527
Step 2/8 : ADD node-v6* /opt/
---> Using cache
---> e3bc3a113c3d
Step 3/8 : ENV PATH /opt/node-v6.11.1-linux-x64/bin:$PATH
---> Using cache
---> 6cc0e7aaf81b
Step 4/8 : ENV NODE_PATH /opt/node-v6.11.1-linux-x64/lib/node_modules/
---> Using cache
---> b370b425a9e7
Step 5/8 : RUN npm install -g express
---> Using cache
---> dbc77ff00d97
Step 6/8 : ADD divide2.js .
---> a614ae005246
Removing intermediate container 129ab6d193ed
Step 7/8 : EXPOSE 3003
---> Running in 407631099de2
---> 96c365ac8705
Removing intermediate container 407631099de2
Step 8/8 : CMD node divide2.js
---> Running in e77f1c4a0276
---> 7c528b7728f1
Removing intermediate container e77f1c4a0276
Successfully built 7c528b7728f1
Successfully tagged dockercalc_divide:latest
WARNING: Image for service divide was built because it did not already exist. To rebuild this image you must use `docker-compose build` or `docker-compose up --build`.
Creating dockercalc_divide_1 ...
Creating dockercalc_multiply_1 ...
Creating dockercalc_add_1 ...
Creating dockercalc_subtract_1 ...
Creating dockercalc_divide_1
Creating dockercalc_add_1
Creating dockercalc_subtract_1
Creating dockercalc_multiply_1 ... done
Attaching to dockercalc_divide_1, dockercalc_add_1, dockercalc_subtract_1, dockercalc_multiply_1
divide_1 | Division service listening on port 3003!
add_1 | Addition service listening on port 3000!
subtract_1 | Subtraction service listening on port 3001!
multiply_1 | Multiplication service listening on port 3002!

At the end of this process, you can see that all four “microservices” are up and running. We can verify a few things.

dbryant@asus:~$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
dockercalc_divide latest 7c528b7728f1 11 minutes ago 163MB
dockercalc_subtract latest 2e16507c16a6 11 minutes ago 163MB
dockercalc_add latest e8af879c151a 11 minutes ago 163MB
dockercalc_multiply latest a9bd02502eb9 11 minutes ago 163MB
oraclelinux 7-slim c0feb50f7527 2 weeks ago 118MB
dbryant@asus:~$


dbryant@asus:~$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f8e1a031ed70 dockercalc_subtract "node subtract2.js" 12 minutes ago Up 12 minutes 0.0.0.0:3001->3001/tcp dockercalc_subtract_1
47e8bb757446 dockercalc_multiply "node multiply2.js" 12 minutes ago Up 12 minutes 0.0.0.0:3002->3002/tcp dockercalc_multiply_1
8fb7d791bdbd dockercalc_add "node add2.js" 12 minutes ago Up 12 minutes 0.0.0.0:3000->3000/tcp dockercalc_add_1
1d46aa08eb13 dockercalc_divide "node divide2.js" 12 minutes ago Up 12 minutes 0.0.0.0:3003->3003/tcp dockercalc_divide_1


dbryant@asus:~/development/github.com/Docker/Docker_Calc$ docker-compose images
Container Repository Tag Image Id Size
----------------------------------------------------------------------------
dockercalc_add_1 dockercalc_add latest e8af879c151a 156 MB
dockercalc_divide_1 dockercalc_divide latest 7c528b7728f1 156 MB
dockercalc_multiply_1 dockercalc_multiply latest a9bd02502eb9 156 MB
dockercalc_subtract_1 dockercalc_subtract latest 2e16507c16a6 156 MB

We can even test this with the curl command. The %20 represents a space between the two operands.

dbryant@asus:~$ curl http://localhost:3000/add/?id=4%205 Your answer: 9 
dbryant@asus:~$ curl http://localhost:3001/subtract/?id=4%205 The answer is: -1
dbryant@asus:~$ curl http://localhost:3002/multiply/?id=4%205 The answer is: 20
dbryant@asus:~$ curl http://localhost:3003/divide/?id=4%205 The answer is: 0.8

Once you are ready to stop these, you simply press <ctrl-c>:

^CGracefully stopping... (press Ctrl+C again to force)
Killing dockercalc_subtract_1 ... done
Killing dockercalc_multiply_1 ... done
Killing dockercalc_add_1 ... done
Killing dockercalc_divide_1 ... done

There we have it.

Enjoy!

dbaontap

Originally published at dbaonTap.