Skip to content

Commit 3170947

Browse files
authored
Merge pull request #56 from Lemoncode/update-material-2-edition/docker
Update material 2 edition/docker
2 parents 8651ddd + e6b92c3 commit 3170947

File tree

141 files changed

+31286
-46335
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

141 files changed

+31286
-46335
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ wwwroot
99
dist/
1010

1111
# vs code
12+
.vscode
1213
.DS_Store
1314

1415
# exercise solution
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
{ "title": "Docker in Action, Second Edition", "author": "Jeff Nickoloff and Stephen Kuenzli" }
2+
{ "title": "Kubernetes in Action, Second Edition ", "author": "Marko Lukša" }

01-contenedores/contenedores-i/contenedores-i.sh

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,13 @@
11
# Día I: Introducción a Docker #
22

3+
#### Cómo instalar Docker Engine ###
4+
35
#Si estás en Windows o Mac: Revisar Docker Desktop:
46
https://docs.docker.com/docker-for-windows/
57
https://docs.docker.com/docker-for-mac/
6-
#Si trabajas con Linux elige tu distro aquí: https://docs.docker.com/engine/install/
8+
9+
#Si trabajas con Linux elige tu distro aquí
10+
https://docs.docker.com/engine/install/
711

812
# Una vez que tienes Docker instalado en tu máquina...
913

@@ -24,6 +28,8 @@ docker run hello-world
2428

2529
#Lista las imágenes que tienes descargadas en tu local
2630
docker image ls
31+
# O bien
32+
docker images
2733

2834
#¿Y estas imágenes de dónde vienen?
2935
#De Docker Hub :-) https://hub.docker.com/
@@ -64,19 +70,21 @@ docker rename NOMBRE_ASIGNADO_POR_DOCKER hello-world
6470
docker ps -a
6571

6672
#Ejecutar un contenedor y lanzar un shell interactivo en él
73+
docker run --interactive --tty ubuntu /bin/bash
74+
#o
6775
docker run -it ubuntu /bin/bash
76+
#Revisa la versión del SO que está instalado en tu contenedor
6877
cat /etc/os-release
6978
exit
7079

71-
# Ejecutar comandos desde mi local dentro del contenedor ####
72-
docker exec my-web ls /var/log/nginx
73-
7480
#Si quiero conectarme a un contenedor
7581
docker run --name webserver -d nginx #Con -d desatacho
7682
docker exec -it webserver bash #Ejecuto el proceso bash dentro del contenedor y con -it me atacho a él
7783
cat /etc/nginx/nginx.conf
7884
exit
7985

86+
# Ejecutar comandos desde mi local dentro del contenedor ####
87+
docker exec my-web ls /var/log/nginx
8088

8189
## Copiar un archivo desde mi local a dentro del contenedor ####
8290
#https://docs.docker.com/engine/reference/commandline/cp/
@@ -89,22 +97,19 @@ docker cp my-web:/var/log/nginx/access.log access.log
8997
mkdir nginx-logs
9098
docker cp my-web:/var/log/nginx/. nginx-logs
9199

92-
93100
# ¿Cómo paro un contenedor?
94101
docker stop my-web
95102

96-
# ¿Y si quiero volver a iniciarlo?
97-
docker start my-web
103+
# ¿Y si quiero volver a iniciarlo?
104+
docker start my-web
98105

99106
#¿Y si quiero eliminarlo del todo de mi ordenador?
100107
docker stop my-web
101108
docker rm my-web
102109
docker ps -a #El contenedor hello-world ya no aparece en el listado
103110

104-
105111
#Todo esto también es posible verlo desde la interfaz de Docker Desktop (A través de la opción Dashboard)
106112

107-
108113
## SQL Server dockerizado ####
109114
# Imagínate que estás desarrollando una aplicación que necesita de un SQL Server y no quieres tener que montarte uno y ensuciar tu máquina, o tener que crearte una máquina virtual, configurarla, bla, bla, bla
110115
# https://hub.docker.com/_/microsoft-mssql-server

01-contenedores/contenedores-i/deberes-i.sh

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -14,25 +14,18 @@ docker run -d --name some-mongo \
1414
-e MONGO_INITDB_ROOT_PASSWORD=secret \
1515
mongo
1616

17-
# Windows #
17+
# Desde Compass conectate a tu nuevo MongoDB. Haz clic en la opción Fill in connection fields individually y añade los valores:
18+
# hostname: localhost
19+
# port: 27017
20+
# Authentication: Username and Password
21+
# Las credenciales que hayas puesto
22+
# y haz clic en conectar
1823

19-
docker ps
20-
# - Acceder a través del CLI para mongo y crear una colección llamada books con este formato {name: 'Kubernetes in Action', author: 'Marko Luksa'} en la base de datos test
21-
docker exec -it some-mongo mongo --username mongoadmin --password secret
22-
db.getName()
23-
use test
24-
db.books.insert({
25-
name: 'Kubernetes in Action',
26-
author: 'Marko Luksa'
27-
})
28-
db.books.find({})
29-
exit
30-
# - Ver los logs de tu nuevo mongo
24+
#Crea una base de datos que se llame Library y una colección llamada Books.
25+
# Accede a ella e importa el archivo llamado books.json que se encuentra en el directorio de este ejercicio.
26+
# - Ver los logs de tu nuevo mongo
3127
docker logs some-mongo
32-
# - Descargar MongoDB Compass (https://www.mongodb.com/try/download/compass)
33-
# - Accede a tu MongoDB en Docker con la siguiente cadena de conexión: mongodb://mongoadmin:secret@localhost:27017 y tus credenciales
34-
# - Revisa que tu colección está dentro de la base de datos test y que aparece el libro que insertaste.
35-
# - Intenta añadir otro documento
28+
3629

3730
# 2. Servidor Nginx
3831
# - Crea un servidor Nginx llamado lemoncoders-web y copia el contenido de la carpeta lemoncoders-web en la ruta que sirve este servidor web.

01-contenedores/contenedores-ii/contenedores-ii.sh

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -45,9 +45,6 @@ docker run mcr.microsoft.com/mcr/hello-world
4545
# 3. Buscar imágenes en Docker Hub
4646
docker search microsoft
4747

48-
# El CLI no te devuelve los tags, pero puedes hacerlo así, instalando JQ (https://stedolan.github.io/jq/)
49-
curl -s -S 'https://registry.hub.docker.com/v2/repositories/library/nginx/tags/' | jq '."results"[]["name"]' | sort
50-
5148
docker search google
5249
docker search aws
5350

@@ -61,6 +58,9 @@ docker search --filter is-official=true nginx
6158
docker search --format "{{.Name}}: {{.StarCount}}" nginx
6259
docker search --format "table {{.Name}}\t{{.Description}}\t{{.IsAutomated}}\t{{.IsOfficial}}" nginx
6360

61+
# El CLI no te devuelve los tags, pero puedes hacerlo así, instalando JQ (https://stedolan.github.io/jq/)
62+
curl -s -S 'https://registry.hub.docker.com/v2/repositories/library/nginx/tags/' | jq '."results"[]["name"]' | sort
63+
6464

6565
#Crear un contenedor a partir de una imagen de docker
6666
docker run -d --rm -p 9090:80 nginx
@@ -80,6 +80,16 @@ docker build . --tag simple-nginx:v1
8080
#o bien
8181
docker build . -t simple-nginx:v1
8282

83+
cd ..
84+
docker build . -t simple-nginx:v1
85+
86+
#Le decimos dónde está el Dockerfile, pero sigue fallando
87+
docker build . -f contenedores-ii/Dockerfile -t simple-nginx:v1
88+
89+
#Cambio el contexto
90+
docker build contenedores-ii/ -t simple-nginx:v1
91+
92+
8393
docker images
8494
#Ahora verás que tienes la imagen alpine descargada, al utilizarla como base, y una nueva llamada simple-nginx que tiene el tag v1
8595

@@ -109,7 +119,7 @@ docker run -d --name my_nginx -p 8080:80 simple-nginx:v1
109119

110120
docker ps
111121

112-
#Reetiquetar una imagen para subirla a Docker Hub
122+
#Etiquetar una imagen para subirla a Docker Hub
113123
docker tag simple-nginx:v1 0gis0/simple-nginx:v1
114124

115125
#Comprobamos que la nueva etiqueta se ha generado correctamente
@@ -121,11 +131,11 @@ docker push 0gis0/simple-nginx:v1
121131
#Para comprobar que podemos utilizar nuestra imagen ya en Docker Hub, debemos eliminar la copia que tenemos en local:
122132

123133
#Borramos la imagen de local, utilizando el ID
124-
docker rmi 53a5fb4d6607
134+
docker rmi simple-nginx:v1
125135
#No nos va a dejar porque tenemos un contenedor ejecutandose con dicha imagen
126136
docker rm -f my_nginx
127137
#Ahora debería de dejarnos
128-
docker rmi 53a5fb4d6607 #como tiene varias etiquetas tampoco le molará.
138+
docker rmi simple-nginx #como tiene varias etiquetas tampoco le molará.
129139
docker rmi simple-nginx:v1 0gis0/simple-nginx:v1
130140

131141
#Ahora intentamos crear un contenedor pero con la imagen que ahora está en Docker Hub
@@ -135,8 +145,9 @@ docker run -d --name my_nginx -p 8080:80 0gis0/simple-nginx:v1
135145
docker rmi simple-nginx:v1
136146

137147
#Eliminar una imagen
138-
docker image rm c5bb82490acc
139-
docker image rm 48fdbab01aa6 a24bb4013296
148+
docker image rm 0gis0/simple-nginx:v1
149+
docker rmi 0eb3967e4af2
150+
docker image rm nginx 0gis0/simple-nginx:v1
140151

141152
#Eliminar SOLO las imágenes que no se están utilizando
142153
docker image prune -a
Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
cd contenedores-ii
22
# 1. Crear una imagen con un servidor web Apache y el mismo contenido que en la carpeta content (fijate en el Dockerfile con el que cree simple-nginx)
3-
docker build . -t simple-apache
3+
docker build . -t simple-apache:new
44
# 2. Ejecutar un contenedor con mi nueva imagen
5-
docker run -d --name myapache -p 8080:80 simple-apache:1.0
5+
docker run -d --name myapache -p 5050:80 simple-apache:new
66
# 3. Averiguar cuántas capas tiene mi nueva imagen
7-
docker inspect simple-apache:1.0 #En el apartado "Layers" pueden contarse cuántas capas hay
8-
docker history simple-apache:1.0 #Todas las acciones que son < 0B son capas
7+
docker inspect simple-apache:new #En el apartado "Layers" pueden contarse cuántas capas hay
8+
docker history simple-apache:new #Todas las acciones que son < 0B son capas
9+
dive simple-apache:new #Puedes ver todas las capas de una imagen

01-contenedores/contenedores-iii/Dockerfile.no.multistages

Lines changed: 0 additions & 10 deletions
This file was deleted.

01-contenedores/contenedores-iii/contenedores-iii.sh

Lines changed: 46 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,13 @@ https://code.visualstudio.com/docs/containers/overview
66
cd 01-contenedores/contenedores-iii/hello-world
77

88
#Ejecutar la app sin contenerizar
9+
#1. Instalar las dependencias de la aplicación
910
npm install
11+
#2. Ejecutar ESLint
1012
npm run test
13+
#3. Ejecutar la app
1114
node server.js
15+
#4. Ejecutar la app usando Nodemon
1216
npm run start-dev
1317

1418
#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.
@@ -32,28 +36,53 @@ cat Dockerfile
3236
cat .dockerignore
3337

3438
#Generar la imagen en base al Dockerfile
35-
docker build --tag=hello-world .
39+
docker build -t hello-world:prod .
3640

37-
#Comprobamos las imágenes que ahora tenemos disponibles, así como el peso de hello-world
41+
#Ejecutar un nuevo contenedor usando tu nueva imagen:
42+
docker run -p 4000:3000 hello-world:prod
43+
44+
# Hacer lo mismo con la extensión de Visual Studio Code
45+
# 1. Generar la imagen
46+
# 2. Ejecutar un contenedor en base a la imagen
47+
# 3. Abrir el navegador usando la extensión
48+
# 4. Engancharse al terminal del contenedor
49+
50+
# El por qué del multi-stage
51+
52+
#Comprobamos las imágenes que ahora tenemos disponibles, así como el peso de helloworld
3853
docker images
3954

4055
#Ver el historico generado para la imagen
41-
docker history hello-world #Los que tienen valor 0B son metadatos
56+
docker history helloworld #Los que tienen valor 0B son metadatos
4257

43-
#Ejecutar un nuevo contenedor usando tu nueva imagen:
44-
docker run -p 4000:3000 hello-world
4558

4659
#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
60+
# FROM node:14-alpine
61+
62+
# LABEL maintainer="Gisela Torres <gisela.torres@returngis.net>"
63+
64+
# # ENV NODE_ENV=production
65+
5066
# WORKDIR /usr/src/app
67+
5168
# COPY ["package.json", "package-lock.json*", "npm-shrinkwrap.json*", "./"]
69+
70+
# # RUN npm install --production --silent && mv node_modules ../
5271
# RUN npm install
72+
5373
# COPY . .
54-
# RUN npm run test
74+
# #Ejecuta los tests de eslint
75+
# RUN npm test
76+
5577
# EXPOSE 3000
78+
79+
# RUN chown -R node /usr/src/app
80+
81+
# USER node
82+
5683
# CMD ["npm", "start"]
84+
docker build --tag=helloworld . -f Dockerfile.dev
85+
5786

5887
#Si vuelves a generar tu imagen, después de que arregles los errores que reporta eslint, comprobarás que ha engordado
5988
docker images
@@ -66,14 +95,13 @@ docker images
6695
#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
6796
#El objetivo final es tener una imagen productiva lo más slim posible y segura.
6897
#Mismo ejemplo con multi-stages
69-
docker build hello-world -t multi-stage -f Dockerfile.multistages
70-
docker run -p 5000:3000 multi-stage
98+
DOCKER_BUILDKIT=0 docker build -t helloworld:multi-stage . -f Dockerfile.multistages
7199

100+
# si revisamos las imágenes finales, helloworld:multi-stage y helloworld:prod deberían de tener el mismo peso
72101
docker images
73102

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
76-
103+
#Limpiar las imagenes dangling (intermedias de los multi-stages)
104+
docker image prune
77105

78106
#### Ejemplo de contenerización de una aplicación en un entorno .NET #####
79107
#Visual Studio 2019
@@ -87,31 +115,11 @@ docker build hello-world -t no-multi-stage -f Dockerfile.no.multistages --no-cac
87115
### Ejemplo de aplicación en Java - IntelliJ IDEA/Eclipse ####
88116
https://www.jetbrains.com/help/idea/running-a-java-app-in-a-container.html
89117

90-
# FROM openjdk:14
91-
# COPY ./out/production/HelloDocker/ /tmp
92-
# WORKDIR /tmp
93-
# ENTRYPOINT ["java","HelloWorld"]
94-
95-
#Ejemplo de aplicación con un contenedor Windows
96-
#Windows Base OS images: https://hub.docker.com/_/microsoft-windows-base-os-images
97-
docker pull mcr.microsoft.com/windows/nanoserver:1903
98-
docker images
99-
100-
docker run -it mcr.microsoft.com/windows/nanoserver:1903 cmd.exe
101-
echo "Hello World!" > Hello.txt
102-
exit
103-
104-
docker ps -a
105-
106-
#Crea una nueva imagen que incluya los cambios del primer contenedor que has ejecutado
107-
#https://docs.docker.com/engine/reference/commandline/commit/
108-
docker commit 7e5e29758e43 helloworld
109-
110-
#Cuando se complete tendrás una nueva imagen con el archivo Hello.txt
111-
docker images
118+
# FROM openjdk:16
119+
# WORKDIR /app
120+
# COPY ./out/production/HelloDocker/ .
121+
# ENTRYPOINT ["java","com.example.lemoncode.HelloWorld"]
112122

113-
#Ahora ejecuta un nuevo contenedor con la imagen que acabas de crear
114-
docker run --rm helloworld cmd.exe /s /c type Hello.txt
115123

116124
##### Buenas prácticas en la construcción de imágenes #########
117125
# - Una aplicación por contenedor (que el contenedor tenga el mismo ciclo de vida que una aplicación. Además, facilita la monitorización).

01-contenedores/contenedores-iii/deberes-iii.sh

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -10,25 +10,8 @@ npm start
1010
#Una vez comprobado, utiliza Comand + P (Mac) o Control + P (Windows) y busca lo siguiente:
1111
# > Add Docker Files to Workspace > Node.js > selecciona el package.json de la lista y el puerto es el 3000
1212
# Esto debería de generar el archivo Dockerfile dentro de hello-lemoncoder
13-
# Para generar la imagen podemos hacerlo con este comando:
14-
docker build . -t hellolemoncoder --no-cache
1513
#O bien seleccionando el archivo Dockerfile con el botón derecho y hacer clic en Build Image...
1614

17-
# 2. Ejecutar un contenedor con tu nueva imagen
18-
docker run --name hello -p 3000:3000 hellolemoncoder
15+
# 2. Ejecutar un contenedor con tu nueva imagen usando Visual Studio Code
16+
1917

20-
# 3. Añade un archivo de prueba en el contenedor y crea una nueva imagen a partir de dicho contenedor.
21-
#Creo un archivo en local
22-
echo "Hello, World!" > hello-lemoncoder.txt
23-
#Lo copio dentro del contenedor. En mi ejemplo en la ruta donde está el código fuente de mi app
24-
docker cp hello-lemoncoder.txt hello:/usr/src/app/hello-lemoncoder.txt
25-
#Compruebo que se ha copiado correctamente
26-
docker exec hello ls -l /usr/src/app/
27-
#Hago un commit con el cambio
28-
docker commit hello newhelloimage
29-
#Compruebo que tengo una nueva imagen
30-
docker images
31-
#Genero un nuevo contenedor con la nueva imagen
32-
docker run -d --name newhello -P newhelloimage
33-
#Compruebo que mi nuevo archivo está donde lo copie
34-
docker exec newhello ls -l /usr/src/app/

0 commit comments

Comments
 (0)