mirror of
https://github.com/dockersamples/example-voting-app.git
synced 2026-05-14 21:46:42 +00:00
71 lines
2.5 KiB
Markdown
71 lines
2.5 KiB
Markdown
# Example Voting App
|
|
|
|
A simple distributed application running across multiple Docker containers.
|
|
|
|
## Getting started
|
|
|
|
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/).
|
|
|
|
This solution uses Python, Node.js, .NET, with Redis for messaging and Postgres for storage.
|
|
|
|
Run in this directory to build and run the app:
|
|
|
|
```shell
|
|
docker compose up
|
|
```
|
|
|
|
The `vote` app will be running at [http://localhost:5000](http://localhost:5000), and the `results` will be at [http://localhost:5001](http://localhost:5001).
|
|
|
|
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:
|
|
|
|
```shell
|
|
docker swarm init
|
|
```
|
|
|
|
Once you have your swarm, in this directory run:
|
|
|
|
```shell
|
|
docker stack deploy --compose-file docker-stack.yml vote
|
|
```
|
|
|
|
## Run the app in Kubernetes
|
|
|
|
The folder k8s-specifications contains the YAML specifications of the Voting App's services.
|
|
|
|
Run the following command to create the deployments and services objects in the vote namespace:
|
|
|
|
```shell
|
|
kubectl create -f k8s-specifications/
|
|
vote "vote" created
|
|
deployment "db" created
|
|
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.
|
|
|
|
## Architecture
|
|
|
|

|
|
|
|
* A front-end web app in [Python](/vote) which lets you vote between two options
|
|
* A [Redis](https://hub.docker.com/_/redis/) which collects new votes
|
|
* A [.NET](/worker/) worker which consumes votes and stores them in…
|
|
* A [Postgres](https://hub.docker.com/_/postgres/) database backed by a Docker volume
|
|
* A [Node.js](/result) web app which shows the results of the voting in real time
|
|
|
|
## Notes
|
|
|
|
The voting application only accepts one vote per client browser. It does not register additional votes if a vote has already been submitted from a client.
|
|
|
|
This isn't an example of a properly architected perfectly designed distributed app... it's just a simple
|
|
example of the various types of pieces and languages you might see (queues, persistent data, etc), and how to
|
|
deal with them in Docker at a basic level.
|