Skip to content

Commit 5757d2c

Browse files
committed
Merge branch 'master' of https://github.com/Lemoncode/bootcamp-devops-lemoncode into master
2 parents 5f99c27 + e52bfa1 commit 5757d2c

15 files changed

Lines changed: 1037 additions & 128 deletions

.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
.vscode/
2+
.DS_Store

01-contenedores/.DS_Store

-6 KB
Binary file not shown.

01-contenedores/README.md

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,3 +51,25 @@
5151

5252
### Día III: Contenerización de aplicaciones (19 de Octubre)
5353

54+
- Mi primera aplicación a contenerizar > Node.js y Visual Studio Code
55+
* El Dockerfile
56+
* Ejecutar eslint como parte de la build
57+
- Multistage build
58+
- Ejemplo de contenerización de una aplicación en un entorno .NET
59+
- Ejemplo de aplicación Java con IntelliJ
60+
- Ejemplo de aplicación web en PHP con Eclipse
61+
- Ejemplo con contenedores Windows
62+
63+
### Día IV: Networking (20 de Octubre)
64+
65+
- Port Mapping
66+
- Exponer todos los puertos descritos como EXPOSE
67+
- docker0
68+
- Listar las redes disponibles en un host
69+
- Los contenedores por defecto se meten en la red bridge/NAT
70+
- Inspeccionar una red
71+
- Crear una nueva red
72+
- Crear un contenedor asociado a una red específica
73+
- Descubrimiento de servicios y comunicación entre contenedores de la misma red
74+
- Un contenedor con dos endpoints
75+
- Crear una red de tipo overlay
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,36 +1,38 @@
11
# ---- Base Node ----
2-
FROM alpine:3.12 AS base
3-
# install node
4-
RUN apk add --no-cache nodejs-current nodejs-npm
2+
FROM node:12.18-alpine AS base
3+
#Add some labels
4+
LABEL maintainer="Gisela Torres"
55
# set working directory
66
WORKDIR /app
77

88
#
99
# ---- Dependencies ----
1010
FROM base AS dependencies
1111
# Copy project file
12-
COPY package*.json ./
13-
# Install ALL node_modules, including 'devDependencies'
14-
RUN npm install
12+
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
1513

1614
#
1715
# ---- Test ----
1816
# run linters, setup and tests
1917
FROM dependencies AS test
18+
# Install ALL node_modules, including 'devDependencies'
19+
RUN npm install --silent
2020
COPY . .
2121
RUN npm run test
2222

2323

2424
#
2525
# ---- Release ----
2626
FROM base AS release
27+
#Add environment variables
28+
ENV NODE_ENV production
2729
# copy production node_modules
2830
COPY --from=dependencies /app/package.json ./
2931
#Install app dependencies
30-
RUN npm install --only=production
32+
RUN npm install --silent --production && mv node_modules ../
3133
# copy app sources
3234
COPY . .
3335
# expose port and define CMD
3436
EXPOSE 3000
3537
#specify what command it'll execute when you create a container
36-
CMD npm run start
38+
CMD ["npm", "start"]
Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,10 @@
1-
FROM alpine:3.12 AS base
2-
# install node
3-
RUN apk add --no-cache nodejs-current nodejs-npm
4-
# set working directory
5-
WORKDIR /app
6-
# copy project file
7-
COPY package*.json ./
8-
# install ALL node_modules, including 'devDependencies'
1+
FROM node:12.18-alpine
2+
LABEL maintainer="Gisela Torres"
3+
# ENV NODE_ENV production
4+
WORKDIR /usr/src/app
5+
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
96
RUN npm install
10-
#copying the rest of the files
117
COPY . .
12-
#Execute eslint
13-
RUN npm run test
14-
#What port you'll use
8+
RUN npm run test
159
EXPOSE 3000
16-
#specify what command it'll execute when you create a container
17-
CMD npm run start
10+
CMD ["npm", "start"]
Lines changed: 32 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
# Parte 3: contenerización de aplicaciones #
22

33
#Mi primera applicación a contenerizar > Node.js
4+
#Para esta demo usaremos VS Code.
5+
https://code.visualstudio.com/docs/containers/overview
46
cd 01-contenedores/contenedores-iii/hello-world
57

68
#Ejecutar la app sin contenerizar
79
npm install
10+
npm run test
811
node server.js
12+
npm run start-dev
13+
14+
#Para crear el archivo Dockerfile y .dockerignore que vimos en la parte teórica, puedes hacerlo con la extensión de Docker de manera sencilla.
15+
#Basta con ejecutar Cmd + P > Add Docker Files to Workspace y seleccionar Node.js. Te pedirá que le selecciones el package.json y el puerto que utiliza tu app.
16+
#Le diremos que no queremos el archivo de Docker compose, lo dejaremos para más adelante :-)
917

1018
#Revisar el archivo Dockerfile
1119
cat Dockerfile
@@ -20,61 +28,54 @@ cat Dockerfile
2028
#COPY coge una fuente y un destino dentro de tu máquina local.
2129
#ADD te permite hacer lo mismo que COPY, pero además puedes especificar una URL como origen o incluso extraer un archivo .tar y descomprimirlo directamente en destino.
2230

23-
2431
#Revisar el archivo .dockerignore
2532
cat .dockerignore
2633

2734
#Generar la imagen en base al Dockerfile
2835
docker build --tag=hello-world .
2936

37+
#Comprobamos las imágenes que ahora tenemos disponibles, así como el peso de hello-world
38+
docker images
39+
3040
#Ver el historico generado para la imagen
3141
docker history hello-world #Los que tienen valor 0B son metadatos
3242

3343
#Ejecutar un nuevo contenedor usando tu nueva imagen:
3444
docker run -p 4000:3000 hello-world
3545

36-
#Añadir una nueva etiqueta a tu nueva imagen
37-
docker image tag hello-world 0gis0/hello-world:latest
38-
docker images #El image ID es el mismo para ambas etiquetas porque apuntan a la misma imagen
39-
40-
#Publicar tu nueva imagen en Docker Hub
41-
docker push 0gis0/hello-world:latest
42-
43-
#Si accedes a tu cuenta en Docker Hub verás tu nueva imagen, la cual acaba de ser publicada
44-
https://hub.docker.com/
45-
46-
#Elimina la imagen de local
47-
docker rm 5bfeba90ec4d --force
48-
docker rmi -f hello-world 0gis0/hello-world
49-
50-
#Ejecutar un nuevo contenedor usando mi nueva imagen en Docker Hub
51-
docker run -p 4000:3000 0gis0/hello-world
46+
#Modifica el Dockerfile para ejecutar el test con eslint:
47+
# FROM node:12.18-alpine
48+
# LABEL maintainer="Gisela Torres"
49+
# # ENV NODE_ENV production
50+
# WORKDIR /usr/src/app
51+
# COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
52+
# RUN npm install
53+
# COPY . .
54+
# RUN npm run test
55+
# EXPOSE 3000
56+
# CMD ["npm", "start"]
57+
58+
#Si vuelves a generar tu imagen, después de que arregles los errores que reporta eslint, comprobarás que ha engordado
59+
docker images
5260

5361
### Multi-stage Builds ###
54-
#Ejemplo sin multi-stage
55-
docker build hello-world -t no-multi-stage -f Dockerfile.no.multistages --no-cache
56-
docker run -p 4000:3000 no-multi-stage
57-
5862
#Con multi-stage lo que se hace es utilizar múltiples FROM dentro del mismo Dockerfile.
5963
#Cada FROM utiliza una imagen base diferente y cada una inicia un nuevo stage.
6064
#El último FROM produce la imagen final, el resto solo serán intermediarios.
6165
#Puedes copiar archivos de un stage a otro, dejando atrás todo lo que no quieres para la imagen final.
6266
#La idea es simple: crea imagenes adicionales con las herramientas que necesitas (compiladores, linters, herramientas de testing, etc.) pero que no son necesarias para producción
6367
#El objetivo final es tener una imagen productiva lo más slim posible y segura.
6468
#Mismo ejemplo con multi-stages
65-
docker build hello-world -t multi-stage -f Dockerfile.multistages --no-cache
69+
docker build hello-world -t multi-stage -f Dockerfile.multistages
6670
docker run -p 5000:3000 multi-stage
6771

6872
docker images
6973

70-
### Squash de una imagen ###
71-
docker inspect no-multi-stage
72-
docker build hello-world -t image-squashed -f Dockerfile.no.multistages --no-cache --squash
73-
docker images
74-
docker inspect image-squashed
74+
#Si comparas con la versión de la misma aplicación sin multi-stages, la diferencia es notable
75+
docker build hello-world -t no-multi-stage -f Dockerfile.no.multistages --no-cache
7576

7677

77-
#### Ejemplo de contenerización de una aplicación en .NET #####
78+
#### Ejemplo de contenerización de una aplicación en un entorno .NET #####
7879
#Visual Studio 2019
7980
#1. Creación de un nuevo proyecto del tipo ASP.NET Core Web Application
8081
#2. Dejar seleccionado el tipo MVC (Dejar el check de Enable Docker Support deshabilitado)
@@ -83,21 +84,13 @@ docker inspect image-squashed
8384
# Generará un Dockerfile con Multi-stage
8485

8586

86-
87-
#Visual Studio Code
88-
https://code.visualstudio.com/docs/containers/overview
89-
90-
#Demos con la extensión de Docker para Visual Studio Code
91-
# Ejecutar un contenedor desde el explorador de imágenes
92-
# Registros
93-
9487
### Ejemplo de aplicación en Java - IntelliJ IDEA/Eclipse ####
9588
https://www.jetbrains.com/help/idea/running-a-java-app-in-a-container.html
9689

97-
# FROM openjdk:12.0.1
98-
# COPY ./out/production/HelloWorld /tmp
90+
# FROM openjdk:14
91+
# COPY ./out/production/HelloDocker/ /tmp
9992
# WORKDIR /tmp
100-
# ENTRYPOINT ["java", "HelloWorld"]
93+
# ENTRYPOINT ["java","HelloWorld"]
10194

10295
#Ejemplo de aplicación con un contenedor Windows
10396
#Windows Base OS images: https://hub.docker.com/_/microsoft-windows-base-os-images
@@ -139,9 +132,3 @@ docker run --rm helloworld cmd.exe /s /c type Hello.txt
139132

140133
# - Elimina herramientas innecesarias de la imagen: wget, netcat, etc. para evitar que los atacantes puedan usarlas si se diera el caso.
141134
# - Utilizar imágenes base reducidas
142-
143-
144-
#Deberes:
145-
# 1. Dockeriza la aplicación de la carpeta hello-lemoncoder
146-
# 2. Ejecutar un contenedor con tu nueva imagen
147-
# 3. Añade un archivo de prueba en el contenedor y crea una nueva imagen a partir de dicho contenedor.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
#Deberes:
2+
# 1. Dockeriza la aplicación de la carpeta hello-lemoncoder con Visual Studio Code
3+
# 2. Ejecutar un contenedor con tu nueva imagen
4+
# 3. Añade un archivo de prueba en el contenedor y crea una nueva imagen a partir de dicho contenedor.
Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,23 @@
1-
node_modules
2-
npm-debug.log
3-
Dockerfile*
4-
docker-compose*
5-
.dockerignore
6-
.git
7-
.gitignore
8-
.env
9-
*/bin
10-
*/obj
11-
README.md
12-
LICENSE
13-
.vscode
1+
**/.classpath
2+
**/.dockerignore
3+
**/.env
4+
**/.git
5+
**/.gitignore
6+
**/.project
7+
**/.settings
8+
**/.toolstarget
9+
**/.vs
10+
**/.vscode
11+
**/*.*proj.user
12+
**/*.dbmdl
13+
**/*.jfm
14+
**/azds.yaml
15+
**/charts
16+
**/docker-compose*
17+
**/Dockerfile*
18+
**/node_modules
19+
**/npm-debug.log
20+
**/obj
21+
**/secrets.dev.yaml
22+
**/values.dev.yaml
23+
README.md

01-contenedores/contenedores-iii/hello-world/.eslintrc.js

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,12 @@ module.exports = {
99
"ecmaVersion": 12
1010
},
1111
"rules": {
12+
// "semi" : ["error","always"],
13+
// "quotes": ["error", "double"],
14+
"no-debugger": ["error"],
15+
"no-console": ["warn"]
1216
},
1317
"globals": {
1418
"_": false
1519
}
16-
};
20+
};
Lines changed: 10 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,10 @@
1-
#Esta es la imagen que utilizaré como base de mi imagen
2-
FROM node:10.13-alpine
3-
4-
#Establezco la ruta /app como directorio de trabajo para alojar mi aplicación, instalar dependencias, etc.
5-
WORKDIR /app
6-
7-
#Copio los archivos package.json y package-lock.json en el raiz de mi directorio /app
8-
COPY ["package.json", "package-lock.json", "./"]
9-
10-
#Instalo las dependencias de Node.js definidas en el archivo package.json
11-
RUN npm install
12-
13-
#Copio el resto de archivos en el directorio
14-
COPY . /app
15-
16-
#Añado como metadato que el puerto que utiliza mi aplicación para comunicarse es el 3000. Se puede verificar en la linea 8 del archivo server.js
17-
EXPOSE 3000
18-
19-
#Indica el comando que se va a ejecutar cuando un contenedor se arranque a partir de esta imagen
20-
CMD [ "node", "server.js" ]
1+
FROM node:12.18-alpine
2+
LABEL maintainer="Gisela Torres"
3+
ENV NODE_ENV production
4+
WORKDIR /usr/src/app
5+
COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
6+
RUN npm install --silent --production && mv node_modules ../
7+
COPY . .
8+
# RUN npm run test
9+
EXPOSE 3000
10+
CMD ["npm", "start"]

0 commit comments

Comments
 (0)