Skip to content

Commit 0b82e16

Browse files
committed
Add Docker compose sample
1 parent 04ab187 commit 0b82e16

10 files changed

+980
-2
lines changed

.gitignore

-2
Original file line numberDiff line numberDiff line change
@@ -1,2 +0,0 @@
1-
node_modules
2-
build

Docker Compose/README.md

+37
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
### Práctico Docker Compose
2+
3+
En la carpeta tasks-api tenemos una **API REST** hecha en **NodeJS** con el framework **Express** que se comunica con una base de datos **Postgres**.
4+
5+
*La app levanta en el puerto **3456**.*
6+
*Postgres por defecto levanta en el **5432**.*
7+
8+
---
9+
10+
### Parte A: Lograr levantar el sistema con un docker-compose básico
11+
12+
1. Crear un archivo `docker-compose.yml` con lo mínimo imprescindible para poder levantar la aplicación y su base de datos:
13+
* Declarar el servicio `tasks-api` y `tasks-db` que se construya a partir del Dockerfile dado.
14+
* Declarar el servicio `tasks-db` que se contruya a partir de una imagen pre-existente de postgres.
15+
* Configurar el port mapping necesario.
16+
* Configurar en el `docker-compose.yml` la variable de entorno `DATABASE_URL` para que la aplicación se conecte con la bdd correctamente cuando levantamos con `docker-compose up`.
17+
18+
Una vez arriba el sistema:
19+
* Correr `docker network ls` para ver la network *bridge* que se creó automáticamente sin necesidad de que declaremos una en el `docker-compose.yml`.
20+
* Observar que los contenedores están conectados a esa network corriendo `docker network inspect tasks-api_default`.
21+
22+
---
23+
24+
### Parte B: Hacerlo más confiable y robusto
25+
26+
1. Agregar la keyword `depends_on` para que el contenedor de la app espere a que el contenedor de la bdd esté creado.
27+
2. Usar el script **"wait_for_it.sh"** para asegurar que la app se levante una vez que la base esté corriendo y listo para aceptar conexiones.
28+
Para eso:
29+
a. Descargar el archivo de acá y ponerlo en la carpeta al mismo nivel que el docker-compose.yml.
30+
b. Cambiar el comando de startup para que en lugar de `["node", "index.js"]` sea `["./wait_for_it.sh", "tasks-db:5432", "--", "node", "index.js"]]`
31+
32+
---
33+
34+
### Parte C: Hacerlo más ameno para usarlo en el día a día
35+
36+
3. Declarar los volúmenes necesarios para **persistir** los datos en la bdd aunque destruya y levante un nuevo contenedor de la bdd.
37+
4. Hacer que funcione el **live reload**. O sea, que pueda hacer cambios, salvar y al hacer refresh de la página los pueda ver directamente sin tener que hacer `docker-compose down` y `docker-compose up --build` .

Docker Compose/tasks-api/.gitignore

+3
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
node_modules
2+
var
3+
docker-compose.yml

Docker Compose/tasks-api/Dockerfile

+11
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
FROM node:latest
2+
3+
WORKDIR /usr/src/app
4+
5+
COPY package*.json ./
6+
RUN npm install
7+
8+
COPY . .
9+
10+
EXPOSE 3456
11+
CMD [ "npm", "start" ]

Docker Compose/tasks-api/README.md

+41
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
## Clase Docker Compose
2+
3+
**Queremos correr nuestra api en node con Docker, y usar la base de PostgreSQL tambien con docker.**
4+
5+
#### Punto 1:
6+
Si corremos postgres con el comando `docker run` sin mas configuracion que esa, cuando apagamos y prendemos el container, los datos no existen mas.
7+
Necesitamos algo que mapee los datos que guarda el container a datos de nuestra computadora, y los "monte" en el container cuando esta corriendo.
8+
9+
Docker volumes: https://docs.docker.com/storage/volumes/
10+
11+
#### Punto 2:
12+
Como conectar la api en node que esta corriendo en un container independiente, con la base que esta en otro. Simplificando conceptos de virtualizacion y containerizacion, son dos ""maquinas"" diferentes.
13+
14+
Docker networks: https://docs.docker.com/network/
15+
16+
### Docker compose
17+
https://docs.docker.com/compose/
18+
19+
Nos permite orquestrar y coordinar diferentes imagenes. Nos deja de manera declarativa definir redes, volumenes, y diferentes relaciones entre varias imagenes.
20+
21+
### Api + Base
22+
23+
Archivo `docker-compose.yml`
24+
25+
Corremos
26+
`docker-compose build`
27+
`docker-compose up`
28+
29+
### Multiples instancias de Api + Nginx + Base
30+
Nginx: https://www.nginx.com/
31+
Docker Scale, Docker Swarm: https://docs.docker.com/engine/reference/commandline/service_scale/
32+
33+
Archivo `docker-compose-with-nginx-scale.yml`
34+
Configuracion Nginx: `nginx.conf`
35+
36+
Corremos
37+
`docker-compose -f docker-compose-with-nginx-scale.yml build`
38+
Para correr una instancia de la api
39+
`docker-compose -f docker-compose-with-nginx-scale.yml up --scale`
40+
Para correr N instancias de la api
41+
`docker-compose -f docker-compose-with-nginx-scale.yml up --scale example-api=3`

Docker Compose/tasks-api/index.js

+50
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
const express = require('express');
2+
const bodyParser = require('body-parser');
3+
const { Task } = require('./src/models');
4+
5+
const app = express();
6+
const port = 3456;
7+
8+
app.use(bodyParser.json());
9+
10+
app.post('/tasks', async (req, res) => {
11+
console.log(req.body)
12+
const { title } = req.body;
13+
try {
14+
const task = await Task.create({ title, completed: false })
15+
16+
res.json(task);
17+
} catch (error) {
18+
res.json({ error })
19+
}
20+
});
21+
22+
app.get('/tasks', async (req, res) => {
23+
try {
24+
const tasks = await Task.findAll();
25+
26+
res.json(tasks);
27+
} catch (error) {
28+
res.json({ error })
29+
}
30+
});
31+
32+
app.get('/tasks/:id', async (req, res) => {
33+
try {
34+
const task = await Task.findOne({ where: { id: req.params.id }})
35+
if (task) {
36+
res.json({ task });
37+
} else {
38+
res.status(404)
39+
res.json({ error: 'Task not found' });
40+
return;
41+
}
42+
} catch (error) {
43+
res.json({ error })
44+
}
45+
});
46+
47+
48+
app.listen(port, () => {
49+
console.log(`\n\nServer started and listening at port ${port}...\n\n`)
50+
});

0 commit comments

Comments
 (0)