ArangoDB in the Giant Swarm using Docker containers
Problem
I want to use ArangoDB in the Giant Swarm with Docker containers.
Solution
Giant Swarm allows you to describe and deploy your application by providing a simple JSON
description. The
current weather app is a good
example on how to install an application which uses two components, namely node
and redis
.
My colleague Max has written a guesser game with various front-ends and ArangoDB as backend. In order to get the feeling of being part of the Giant Swarm, I have started to set up this game in the swarm.
First Steps
The guesser game consists of a front-end written as express application in node and a storage back-end using ArangoDB and a small API developed with Foxx.
The front-end application is available as image
arangodb/example-guesser
and the ArangoDB back-end with the Foxx API as
arangodb/example-guesser-db
The dockerfiles used to create the images are available from github
https://github.com/arangodb/guesser
Set up the Swarm
Set up your swarm environment as described in the documentation. Create a configuration
file for the swarm called arangodb.json
and fire up the application
{
"app_name": "guesser",
"services": [
{
"service_name": "guesser-game",
"components": [
{
"component_name": "guesser-front-end",
"image": "arangodb/example-guesser",
"ports": [ 8000 ],
"dependencies": [
{ "name": "guesser-back-end", "port": 8529 }
],
"domains": { "guesser.gigantic.io": 8000 }
},
{
"component_name": "guesser-back-end",
"image": "arangodb/example-guesser-db",
"ports": [ 8529 ]
}
]
}
]
}
This defines an application guesser
with a single service guesser-game
. This
service has two components guesser-front-end
and guesser-back-end
. The
docker images are downloaded from the standard docker repository.
The line
"domains": { "guesser.gigantic.io": 8000 }
exposes the internal port 8000 to the external port on port 80 for the host
guesser.gigantic.io
.
In order to tell Giant Swarm about your application, execute
unix> swarm create arangodb.json
Creating 'arangodb' in the 'fceller/dev' environment...
App created successfully!
This will create an application called guesser
.
unix> swarm status guesser
App guesser is down
service component instanceid status
guesser-game guesser-back-end 5347e718-3d27-4356-b530-b24fc5d1e3f5 down
guesser-game guesser-front-end 7cf25b43-13c4-4dd3-9a2b-a1e32c43ae0d down
We see the two components of our application. Both are currently powered down.
Startup the Guesser Game
Starting your engines is now one simple command
unix> swarm start guesser
Starting application guesser...
Application guesser is up
Now the application is up
unix> swarm status guesser
App guesser is up
service component instanceid status
guesser-game guesser-back-end 5347e718-3d27-4356-b530-b24fc5d1e3f5 up
guesser-game guesser-front-end 7cf25b43-13c4-4dd3-9a2b-a1e32c43ae0d up
Point your browser to
http://guesser.gigantic.io
and guess an animal.
If you want to check the log files of an instance you can ask the swarm giving it the instance id. For example, the back-end
unix> swarm logs 5347e718-3d27-4356-b530-b24fc5d1e3f5
2014-12-17 12:34:57.984554 +0000 UTC - systemd - Stopping User guesser-back-end...
2014-12-17 12:36:28.074673 +0000 UTC - systemd - 5cfe11d6-343e-49bb-8029-06333844401f.service stop-sigterm timed out. Killing.
2014-12-17 12:36:28.077821 +0000 UTC - systemd - 5cfe11d6-343e-49bb-8029-06333844401f.service: main process exited, code=killed, status=9/KILL
2014-12-17 12:36:38.213245 +0000 UTC - systemd - Stopped User guesser-back-end.
2014-12-17 12:36:38.213543 +0000 UTC - systemd - Unit 5cfe11d6-343e-49bb-8029-06333844401f.service entered failed state.
2014-12-17 12:37:55.074158 +0000 UTC - systemd - Starting User guesser-back-end...
2014-12-17 12:37:55.208354 +0000 UTC - docker - Pulling repository arangodb/example-guesser-db
2014-12-17 12:37:56.995122 +0000 UTC - docker - Status: Image is up to date for arangodb/example-guesser-db:latest
2014-12-17 12:37:57.000922 +0000 UTC - systemd - Started User guesser-back-end.
2014-12-17 12:37:57.707575 +0000 UTC - docker - --> starting ArangoDB
2014-12-17 12:37:57.708182 +0000 UTC - docker - --> waiting for ArangoDB to become ready
2014-12-17 12:38:28.157338 +0000 UTC - docker - --> installing guesser game
2014-12-17 12:38:28.59025 +0000 UTC - docker - --> ready for business
and the front-end
unix> swarm logs 7cf25b43-13c4-4dd3-9a2b-a1e32c43ae0d
2014-12-17 12:35:10.139684 +0000 UTC - systemd - Stopping User guesser-front-end...
2014-12-17 12:36:40.32462 +0000 UTC - systemd - aa7756a4-7a87-4633-bea3-e416d035188b.service stop-sigterm timed out. Killing.
2014-12-17 12:36:40.327754 +0000 UTC - systemd - aa7756a4-7a87-4633-bea3-e416d035188b.service: main process exited, code=killed, status=9/KILL
2014-12-17 12:36:50.567911 +0000 UTC - systemd - Stopped User guesser-front-end.
2014-12-17 12:36:50.568204 +0000 UTC - systemd - Unit aa7756a4-7a87-4633-bea3-e416d035188b.service entered failed state.
2014-12-17 12:38:04.796129 +0000 UTC - systemd - Starting User guesser-front-end...
2014-12-17 12:38:04.921273 +0000 UTC - docker - Pulling repository arangodb/example-guesser
2014-12-17 12:38:06.459366 +0000 UTC - docker - Status: Image is up to date for arangodb/example-guesser:latest
2014-12-17 12:38:06.469988 +0000 UTC - systemd - Started User guesser-front-end.
2014-12-17 12:38:07.391149 +0000 UTC - docker - Using DB-Server http://172.17.0.183:8529
2014-12-17 12:38:07.613982 +0000 UTC - docker - Guesser app server listening at http://0.0.0.0:8000
Scaling Up
Your game becomes a success. Well, scaling up the front-end is trivial.
Simply change your configuration file and recreate the application:
{
"app_name": "guesser",
"services": [
{
"service_name": "guesser-game",
"components": [
{
"component_name": "guesser-front-end",
"image": "arangodb/example-guesser",
"ports": [ 8000 ],
"dependencies": [
{ "name": "guesser-back-end", "port": 8529 }
],
"domains": { "guesser.gigantic.io": 8000 },
"scaling_policy": { "min": 2, "max": 2 }
},
{
"component_name": "guesser-back-end",
"image": "arangodb/example-guesser-db",
"ports": [ 8529 ]
}
]
}
]
}
The important line is
"scaling_policy": { "min": 2, "max": 2 }
It tells the swarm to use two front-end containers. In later version of the swarm
you will be able to change the number of containers in a running application with the command:
> swarm scaleup guesser/guesser-game/guesser-front-end --count=1
Scaling up component guesser/guesser-game/guesser-front-end by 1...
We at ArangoDB are hard at work to make scaling up the back-end database equally easy. Stay tuned for new releases in early 2015...
Authors: Frank Celler
Tags: #docker, #giantswarm, #howto