2017-01-24 21:48:36 +01:00
Example Voting App
2016-06-16 00:25:28 +02:00
=========
2015-11-15 20:59:29 +01:00
2018-09-26 21:00:28 +02:00
A simple distributed application running across multiple Docker containers.
2016-06-16 00:25:28 +02:00
Getting started
---------------
2015-11-15 20:59:29 +01:00
2018-09-26 21:00:28 +02:00
Download [Docker Desktop ](https://www.docker.com/products/docker-desktop ) for Mac or Windows. [Docker Compose ](https://docs.docker.com/compose ) will be automatically installed. On Linux, make sure you have the latest version of [Compose ](https://docs.docker.com/compose/install/ ).
## Linux Containers
The Linux stack uses Python, Node.js, .NET Core (or optionally Java), with Redis for messaging and Postgres for storage.
> If you're using [Docker Desktop on Windows](https://store.docker.com/editions/community/docker-ce-desktop-windows), you can run the Linux version by [switching to Linux containers](https://docs.docker.com/docker-for-windows/#switch-between-windows-and-linux-containers), or run the Windows containers version.
2016-06-16 00:25:28 +02:00
Run in this directory:
2017-01-24 21:47:35 +01:00
```
docker-compose up
```
2016-06-16 00:25:28 +02:00
The app will be running at [http://localhost:5000 ](http://localhost:5000 ), and the results will be at [http://localhost:5001 ](http://localhost:5001 ).
2015-11-17 05:14:53 +01:00
2017-01-24 21:48:36 +01:00
Alternately, if you want to run it on a [Docker Swarm ](https://docs.docker.com/engine/swarm/ ), first make sure you have a swarm. If you don't, run:
2017-01-24 21:47:35 +01:00
```
docker swarm init
```
Once you have your swarm, in this directory run:
```
docker stack deploy --compose-file docker-stack.yml vote
```
2018-09-26 21:00:28 +02:00
## Windows Containers
An alternative version of the app uses Windows containers based on Nano Server. This stack runs on .NET Core, using [NATS ](https://nats.io ) for messaging and [TiDB ](https://github.com/pingcap/tidb ) for storage.
You can build from source using:
```
docker-compose -f docker-compose-windows.yml build
```
Then run the app using:
```
docker-compose -f docker-compose-windows.yml up -d
```
> Or in a Windows swarm, run `docker stack deploy -c docker-stack-windows.yml vote`
The app will be running at [http://localhost:5000 ](http://localhost:5000 ), and the results will be at [http://localhost:5001 ](http://localhost:5001 ).
2018-03-05 12:57:48 +01:00
Run the app in Kubernetes
-------------------------
The folder k8s-specifications contains the yaml specifications of the Voting App's services.
2018-10-10 11:10:21 +02:00
First create the vote namespace
```
$ kubectl create namespace vote
``
2018-03-05 12:57:48 +01:00
Run the following command to create the deployments and services objects:
```
$ kubectl create -f k8s-specifications/
deployment "db" created
service "db" created
deployment "redis" created
service "redis" created
deployment "result" created
service "result" created
deployment "vote" created
service "vote" created
deployment "worker" created
```
The vote interface is then available on port 31000 on each host of the cluster, the result one is available on port 31001.
2015-11-17 05:18:35 +01:00
Architecture
-----
2016-06-16 00:55:44 +02:00
![Architecture diagram ](architecture.png )
2018-09-26 21:00:28 +02:00
* A front-end web app in [Python ](/vote ) or [ASP.NET Core ](/vote/dotnet ) which lets you vote between two options
* A [Redis ](https://hub.docker.com/_/redis/ ) or [NATS ](https://hub.docker.com/_/nats/ ) queue which collects new votes
* A [.NET Core ](/worker/src/Worker ), [Java ](/worker/src/main ) or [.NET Core 2.1 ](/worker/dotnet ) worker which consumes votes and stores them in…
* A [Postgres ](https://hub.docker.com/_/postgres/ ) or [TiDB ](https://hub.docker.com/r/dockersamples/tidb/tags/ ) database backed by a Docker volume
* A [Node.js ](/result ) or [ASP.NET Core SignalR ](/result/dotnet ) webapp which shows the results of the voting in real time
2015-11-15 20:59:29 +01:00
2017-01-20 22:58:22 +01:00
Note
----
2018-03-05 12:57:48 +01:00
The voting application only accepts one vote per client. It does not register votes if a vote has already been submitted from a client.