Skip to content
This repository was archived by the owner on Jul 18, 2025. It is now read-only.

Commit 659b860

Browse files
author
Antony MECHIN
committed
Examples: Add voting-app.
Signed-off-by: Antony MECHIN <[email protected]>
1 parent fede1d5 commit 659b860

File tree

7 files changed

+375
-0
lines changed

7 files changed

+375
-0
lines changed

examples/voting-app/README.md

Lines changed: 160 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,160 @@
1+
## The Docker voting app
2+
3+
### Initialize project
4+
5+
In this example, we will create an app from the existing docker sample `example-voting-app`. First download, the project [here](https://github.com/dockersamples/example-voting-app).
6+
7+
Initialize the project using `docker-app init voting-app -c example-voting-app/docker-stack.yml`.
8+
9+
### Edit metadata
10+
11+
Go to `voting-app.dockerapp/` and open `metadata.yml` and fill the following fields:
12+
- description
13+
- maintainers
14+
15+
### Add variables to the compose file
16+
17+
Open `docker-compose.yml` and start by changing the version to `3.2` (generated docker-compose are version 3.2+ compatible). Change constants you want by variables, e.g.:
18+
19+
Change the images used, from:
20+
- `dockersamples/examplevotingapp_vote:before` to `${vote.image.name}:${vote.image.tag}`
21+
- `dockersamples/examplevotingapp_result:before` to `${result.image.name}:${result.image.tag}`
22+
- `dockersamples/examplevotingapp_worker:before` to `${worker.image.name}:${worker.image.tag}`
23+
- `dockersamples/examplevotingapp_visualizer:before` to `${visualizer.image.name}:${visualizer.image.tag}`
24+
25+
Change exposed ports, from:
26+
- `<value:5000>` to `${vote.port}`
27+
- `<value:5001>` to `${result.port}`
28+
- `<value:8080>` to `${visualizer.port}`
29+
30+
Change default replicas, from:
31+
- `<value:2>` to `${vote.replicas}`
32+
- `<value:1>` to `${result.replicas}`
33+
- `<value:1>` to `${worker.replicas}`
34+
35+
### Give variables their default value
36+
37+
Open `settings.yml` and every variables with the default value you want, e.g.:
38+
39+
```
40+
$ cat settings.yml
41+
# Vote.
42+
vote:
43+
image:
44+
name: dockersamples/examplevotingapp_vote
45+
tag: latest
46+
port: 8080
47+
replicas: 1
48+
49+
# Result.
50+
result:
51+
image:
52+
name: dockersamples/examplevotingapp_result
53+
tag: latest
54+
port: 8181
55+
replicas: 1
56+
57+
# Visualizer.
58+
visualizer:
59+
image:
60+
name: dockersamples/visualizer
61+
tag: latest
62+
port: 8282
63+
64+
# Worker.
65+
worker:
66+
image:
67+
name: dockersamples/examplevotingapp_worker
68+
tag: latest
69+
replicas: 1
70+
```
71+
72+
Test your application by running `docker-app render`.
73+
74+
### Add settings for production and development environments
75+
76+
Create `settings/development.yml` and `settings/production.yml` and add your target-specific variables.
77+
78+
```
79+
$ cat settings/development.yml
80+
# Vote.
81+
vote:
82+
image:
83+
name: vote
84+
85+
# Result.
86+
result:
87+
image:
88+
name: result
89+
```
90+
```
91+
$ cat settings/production.yml
92+
# Vote.
93+
vote:
94+
port: 80
95+
replicas: 3
96+
97+
# Result.
98+
result:
99+
port: 80
100+
replicas: 5
101+
```
102+
103+
### Wrap everything in a Makefile
104+
105+
Add a Makefile to simplify rendering, deploying and killing your app.
106+
107+
```
108+
$ cat Makefile
109+
# Input.
110+
APP_NAME := voting-app
111+
SETTINGS_DIR ?= settings
112+
113+
# Output.
114+
DEVELOPMENT_DIR := build/development
115+
PRODUCTION_DIR := build/production
116+
117+
#
118+
# Cleanup.
119+
#
120+
cleanup/production:
121+
@rm -rf $(PRODUCTION_DIR)
122+
123+
cleanup/development:
124+
@rm -rf $(DEVELOPMENT_DIR)
125+
126+
cleanup: cleanup/production cleanup/development
127+
128+
#
129+
# Render.
130+
#
131+
render/production: cleanup/production
132+
@mkdir -p $(PRODUCTION_DIR)
133+
docker-app render -f $(SETTINGS_DIR)/production.yml > $(PRODUCTION_DIR)/docker-compose.yml
134+
135+
render/development: cleanup/development
136+
@mkdir -p $(DEVELOPMENT_DIR)
137+
docker-app render -f $(SETTINGS_DIR)/development.yml > $(DEVELOPMENT_DIR)/docker-compose.yml
138+
139+
render: render/production render/development
140+
141+
#
142+
# Kill.
143+
#
144+
kill/production:
145+
docker stack rm ${APP_NAME}
146+
147+
kill/development:
148+
docker stack rm ${APP_NAME}-dev
149+
150+
kill: kill/production kill/development
151+
152+
#
153+
# Deploy.
154+
#
155+
deploy/production: render/production kill/production
156+
docker stack deploy ${APP_NAME} -c $(PRODUCTION_DIR)/docker-compose.yml
157+
158+
deploy/development: render/development kill/development
159+
docker stack deploy ${APP_NAME}-dev -c $(DEVELOPMENT_DIR)/docker-compose.yml
160+
```
Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
# Input.
2+
SETTINGS_DIR ?= settings
3+
APP_NAME := voting-app
4+
5+
# Output.
6+
DEVELOPMENT_DIR := build/development
7+
PRODUCTION_DIR := build/production
8+
PACK := $(APP_NAME).pack
9+
10+
#
11+
# Cleanup.
12+
#
13+
cleanup/production:
14+
@rm -rf $(PRODUCTION_DIR)
15+
16+
cleanup/development:
17+
@rm -rf $(DEVELOPMENT_DIR)
18+
19+
cleanup: cleanup/production cleanup/development
20+
21+
#
22+
# Render.
23+
#
24+
render/production: cleanup/production
25+
@mkdir -p $(PRODUCTION_DIR)
26+
docker-app render -f $(SETTINGS_DIR)/production.yml > $(PRODUCTION_DIR)/docker-compose.yml
27+
28+
render/development: cleanup/development
29+
@mkdir -p $(DEVELOPMENT_DIR)
30+
docker-app render -f $(SETTINGS_DIR)/development.yml > $(DEVELOPMENT_DIR)/docker-compose.yml
31+
32+
render: render/production render/development
33+
34+
#
35+
# Kill.
36+
#
37+
kill/production:
38+
docker stack rm ${APP_NAME}
39+
40+
kill/development:
41+
docker stack rm ${APP_NAME}-dev
42+
43+
kill: kill/production kill/development
44+
45+
#
46+
# Deploy.
47+
#
48+
deploy/production: render/production kill/production
49+
docker stack deploy ${APP_NAME} -c $(PRODUCTION_DIR)/docker-compose.yml
50+
51+
deploy/development: render/development kill/development
52+
docker stack deploy ${APP_NAME}-dev -c $(DEVELOPMENT_DIR)/docker-compose.yml
53+
54+
#
55+
# Pack.
56+
#
57+
pack:
58+
docker-app pack -o $(PACK)
59+
60+
#
61+
# Helm.
62+
#
63+
helm/production:
64+
docker-app helm -f $(SETTINGS_DIR)/production.yml
65+
66+
helm/development:
67+
docker-app helm -f $(SETTINGS_DIR)/development.yml
Lines changed: 92 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,92 @@
1+
version: "3.2"
2+
services:
3+
4+
redis:
5+
image: redis:alpine
6+
ports:
7+
- "6379"
8+
networks:
9+
- frontend
10+
deploy:
11+
replicas: 1
12+
update_config:
13+
parallelism: 2
14+
delay: 10s
15+
restart_policy:
16+
condition: on-failure
17+
18+
db:
19+
image: postgres:9.4
20+
volumes:
21+
- db-data:/var/lib/postgresql/data
22+
networks:
23+
- backend
24+
deploy:
25+
placement:
26+
constraints: [node.role == manager]
27+
28+
vote:
29+
image: ${vote.image.name}:${vote.image.tag}
30+
ports:
31+
- ${vote.port}:80
32+
networks:
33+
- frontend
34+
depends_on:
35+
- redis
36+
deploy:
37+
replicas: ${vote.replicas}
38+
update_config:
39+
parallelism: 2
40+
restart_policy:
41+
condition: on-failure
42+
43+
result:
44+
image: ${result.image.name}:${result.image.tag}
45+
ports:
46+
- ${result.port}:80
47+
networks:
48+
- backend
49+
depends_on:
50+
- db
51+
deploy:
52+
replicas: ${result.replicas}
53+
update_config:
54+
parallelism: 2
55+
delay: 10s
56+
restart_policy:
57+
condition: on-failure
58+
59+
worker:
60+
image: ${worker.image.name}:${worker.image.tag}
61+
networks:
62+
- frontend
63+
- backend
64+
deploy:
65+
mode: replicated
66+
replicas: ${worker.replicas}
67+
labels: [APP=VOTING]
68+
restart_policy:
69+
condition: on-failure
70+
delay: 10s
71+
max_attempts: 3
72+
window: 120s
73+
placement:
74+
constraints: [node.role == manager]
75+
76+
visualizer:
77+
image: ${visualizer.image.name}:${visualizer.image.tag}
78+
ports:
79+
- ${visualizer.port}:8080
80+
stop_grace_period: 1m30s
81+
volumes:
82+
- "/var/run/docker.sock:/var/run/docker.sock"
83+
deploy:
84+
placement:
85+
constraints: [node.role == manager]
86+
87+
networks:
88+
frontend:
89+
backend:
90+
91+
volumes:
92+
db-data:
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
version: 0.1.0
2+
name: voting-app
3+
description: "Dogs or cats?"
4+
maintainers:
5+
- name: dimrok
6+
7+
targets:
8+
swarm: true
9+
kubernetes: true
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
# Vote.
2+
vote:
3+
image:
4+
name: dockersamples/examplevotingapp_vote
5+
tag: latest
6+
port: 8080
7+
replicas: 1
8+
9+
# Result.
10+
result:
11+
image:
12+
name: dockersamples/examplevotingapp_result
13+
tag: latest
14+
port: 8181
15+
replicas: 1
16+
17+
# Visualizer.
18+
visualizer:
19+
image:
20+
name: dockersamples/visualizer
21+
tag: latest
22+
port: 8282
23+
24+
# Worker.
25+
worker:
26+
image:
27+
name: dockersamples/examplevotingapp_worker
28+
tag: latest
29+
replicas: 1
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Vote.
2+
vote:
3+
image:
4+
name: vote
5+
6+
# Result.
7+
result:
8+
image:
9+
name: result
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
# Vote.
2+
vote:
3+
port: 80
4+
replicas: 3
5+
6+
# Result.
7+
result:
8+
port: 80
9+
replicas: 5

0 commit comments

Comments
 (0)