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

Commit 550dfe1

Browse files
authored
Merge pull request #125 from Dimrok/feature/more-examples
Add more examples.
2 parents e4676d1 + a9eea0a commit 550dfe1

File tree

15 files changed

+636
-34
lines changed

15 files changed

+636
-34
lines changed

examples/hello-world/README.md

Lines changed: 105 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,105 @@
1+
## The Docker voting app
2+
3+
### Initialize project
4+
5+
In this example, we will create a single service application that deploys a web page displaying a message.
6+
7+
Initialize the single file project using `docker-app init -s hello-world`. A single file application contains the three sections, `metadata` corresponding `metadata.yml`, `settings` corresponding `settings.yml` and `services` corresponding `docker-compose.yml`.
8+
9+
```bash
10+
$ ls -l
11+
-rw-r--r-- 1 README.md
12+
$ docker-app init -s hello-world
13+
$ ls -l
14+
-rw-r--r-- 1 README.md
15+
-rw-r--r-- 1 hello-world.dockerapp
16+
$ cat hello-world.dockerapp
17+
#
18+
# Metadata.
19+
#
20+
version: 0.1.0
21+
name: hello-world
22+
description: ""
23+
maintainers:
24+
- name: dimrok
25+
email: ""
26+
targets:
27+
swarm: true
28+
kubernetes: true
29+
30+
--
31+
#
32+
# Services.
33+
#
34+
version: "3.6"
35+
services: {}
36+
37+
--
38+
#
39+
# Settings.
40+
#
41+
```
42+
43+
Open `hello-world.dockerapp` with your favorite text editor.
44+
45+
### Edit metadata
46+
47+
Edit the `description` and `maintainers` fields in the metadata section.
48+
49+
### Add variables to the compose file
50+
51+
Add a service `hello` to the `services` section.
52+
53+
---
54+
55+
[hello-world.dockerapp](hello-world.dockerapp):
56+
```yml
57+
[...]
58+
---
59+
#
60+
# Services.
61+
#
62+
services:
63+
hello:
64+
image: hashicorp/http-echo
65+
command: ["-text", "${text}"]
66+
ports:
67+
- ${port}:5678
68+
69+
---
70+
[...]
71+
```
72+
73+
### Give variables their default value
74+
75+
In the settings section, add every variables with the default value you want, e.g.:
76+
77+
---
78+
79+
[hello-world.dockerapp](hello-world.dockerapp):
80+
```yml
81+
[...]
82+
---
83+
#
84+
# Settings.
85+
#
86+
port: 8080
87+
text: hello world!
88+
```
89+
90+
### Render
91+
92+
You can now render your application by running `docker-app render` or even personalize the rendered compose file by running `docker-app render -s text="hello user!"`.
93+
94+
Create a `render` directory and redirect the output of `docker-app render ...` to `render/docker-compose.yml`.
95+
96+
```bash
97+
$ mkdir -p render
98+
$ docker-app render -s text="hello user" > render/docker-compose.yml
99+
```
100+
101+
### Deploy
102+
103+
You directly deploy your application by running `docker-app deploy -s text="hello user!"` or you can use the rendered version and run `docker stack deploy render/docker-compose.yml`.
104+
105+
`http://<ip_of_your_node>:8080` will display your message, e.g. http://127.0.0.1:8080 if you deployed locally.
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
#
2+
# Metadata.
3+
#
4+
version: 0.1.0
5+
name: hello-world
6+
description: "Hello world!"
7+
maintainers:
8+
- name: user
9+
10+
targets:
11+
swarm: true
12+
kubernetes: true
13+
14+
--
15+
#
16+
# Services.
17+
#
18+
version: "3.6"
19+
services:
20+
hello:
21+
image: hashicorp/http-echo
22+
command: ["-text", "${text}"]
23+
ports:
24+
- ${port}:5678
25+
26+
--
27+
#
28+
# Settings.
29+
#
30+
port: 8080
31+
text: hello world!

examples/voting-app/README.md

Lines changed: 252 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,252 @@
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+
---
36+
37+
[voting-app.dockerapp/docker-compose.yml](voting-app.dockerapp/docker-compose.yml):
38+
```yml
39+
[...]
40+
vote:
41+
image: ${vote.image.name}:${vote.image.tag}
42+
ports:
43+
- ${vote.port}:80
44+
networks:
45+
- frontend
46+
depends_on:
47+
- redis
48+
deploy:
49+
replicas: ${vote.replicas}
50+
update_config:
51+
parallelism: 2
52+
restart_policy:
53+
condition: on-failure
54+
55+
result:
56+
image: ${result.image.name}:${result.image.tag}
57+
ports:
58+
- ${result.port}:80
59+
networks:
60+
- backend
61+
depends_on:
62+
- db
63+
deploy:
64+
replicas: ${result.replicas}
65+
update_config:
66+
parallelism: 2
67+
delay: 10s
68+
restart_policy:
69+
condition: on-failure
70+
71+
worker:
72+
image: ${worker.image.name}:${worker.image.tag}
73+
networks:
74+
- frontend
75+
- backend
76+
deploy:
77+
mode: replicated
78+
replicas: ${worker.replicas}
79+
labels: [APP=VOTING]
80+
restart_policy:
81+
condition: on-failure
82+
delay: 10s
83+
max_attempts: 3
84+
window: 120s
85+
placement:
86+
constraints: [node.role == manager]
87+
88+
visualizer:
89+
image: ${visualizer.image.name}:${visualizer.image.tag}
90+
ports:
91+
- ${visualizer.port}:8080
92+
stop_grace_period: 1m30s
93+
volumes:
94+
- "/var/run/docker.sock:/var/run/docker.sock"
95+
deploy:
96+
placement:
97+
constraints: [node.role == manager]
98+
[...]
99+
```
100+
101+
### Give variables their default value
102+
103+
Open `settings.yml` and add every variables with the default value you want, e.g.:
104+
105+
---
106+
107+
[voting-app.dockerapp/settings.yml](voting-app.dockerapp/settings.yml):
108+
```yml
109+
# Vote.
110+
vote:
111+
image:
112+
name: dockersamples/examplevotingapp_vote
113+
tag: latest
114+
port: 8080
115+
replicas: 1
116+
117+
# Result.
118+
result:
119+
image:
120+
name: dockersamples/examplevotingapp_result
121+
tag: latest
122+
port: 8181
123+
replicas: 1
124+
125+
# Visualizer.
126+
visualizer:
127+
image:
128+
name: dockersamples/visualizer
129+
tag: latest
130+
port: 8282
131+
132+
# Worker.
133+
worker:
134+
image:
135+
name: dockersamples/examplevotingapp_worker
136+
tag: latest
137+
replicas: 1
138+
```
139+
140+
Test your application by running `docker-app render`.
141+
142+
### Add settings for production and development environments
143+
144+
Create `settings/development.yml` and `settings/production.yml` and add your target-specific variables.
145+
146+
---
147+
148+
[voting-app.dockerapp/settings/development.yml](voting-app.dockerapp/settings/development.yml):
149+
```yml
150+
# Vote.
151+
vote:
152+
image:
153+
name: vote
154+
155+
# Result.
156+
result:
157+
image:
158+
name: result
159+
```
160+
---
161+
162+
[voting-app.dockerapp/settings/production.yml](voting-app.dockerapp/settings/production.yml):
163+
```yml
164+
# Vote.
165+
vote:
166+
port: 80
167+
replicas: 3
168+
169+
# Result.
170+
result:
171+
port: 80
172+
replicas: 5
173+
```
174+
175+
### Wrap everything in a Makefile
176+
177+
Add a Makefile to simplify rendering, deploying and killing your app.
178+
179+
---
180+
181+
[voting-app.dockerapp/Makefile](voting-app.dockerapp/Makefile):
182+
```Makefile
183+
# Input.
184+
SETTINGS_DIR ?= settings
185+
APP_NAME := voting-app
186+
187+
# Output.
188+
DEVELOPMENT_DIR := build/development
189+
PRODUCTION_DIR := build/production
190+
PACK := $(APP_NAME).pack
191+
192+
#
193+
# Cleanup.
194+
#
195+
cleanup/production:
196+
@rm -rf $(PRODUCTION_DIR)
197+
198+
cleanup/development:
199+
@rm -rf $(DEVELOPMENT_DIR)
200+
201+
cleanup: cleanup/production cleanup/development
202+
203+
#
204+
# Render.
205+
#
206+
render/production: cleanup/production
207+
@mkdir -p $(PRODUCTION_DIR)
208+
docker-app render -f $(SETTINGS_DIR)/production.yml > $(PRODUCTION_DIR)/docker-compose.yml
209+
210+
render/development: cleanup/development
211+
@mkdir -p $(DEVELOPMENT_DIR)
212+
docker-app render -f $(SETTINGS_DIR)/development.yml > $(DEVELOPMENT_DIR)/docker-compose.yml
213+
214+
render: render/production render/development
215+
216+
#
217+
# Stop.
218+
#
219+
stop/production:
220+
docker stack rm ${APP_NAME}
221+
222+
stop/development:
223+
docker stack rm ${APP_NAME}-dev
224+
225+
stop: stop/production stop/development
226+
227+
#
228+
# Deploy.
229+
#
230+
deploy/production: render/production stop/production
231+
docker-app deploy -f $(SETTINGS_DIR)/production.yml
232+
233+
deploy/development: render/development stop/development
234+
docker-app deploy -f $(SETTINGS_DIR)/development.yml
235+
236+
#
237+
# Pack.
238+
#
239+
pack:
240+
docker-app pack -o $(PACK)
241+
242+
#
243+
# Helm.
244+
#
245+
helm/production:
246+
docker-app helm -f $(SETTINGS_DIR)/production.yml
247+
248+
helm/development:
249+
docker-app helm -f $(SETTINGS_DIR)/development.yml
250+
```
251+
252+
You can add more commands, depending on your needs.

0 commit comments

Comments
 (0)