Skip to content

Commit 1741569

Browse files
committed
Merge branch 'master' into terraform-updates
2 parents 5d5f89b + 3cf276f commit 1741569

108 files changed

Lines changed: 14732 additions & 37661 deletions

File tree

Some content is hidden

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

.gitignore

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,4 +33,6 @@ private.readme.md
3333
04-cloud/00-aks/03-virtual-kubelet/auth.json
3434

3535
# Vagrant
36-
.vagrant
36+
.vagrant
37+
01-contenedores/lemoncode-challenge/dotnet-stack/backend/obj/Debug/netcoreapp3.1/backend.assets.cache
38+
01-contenedores/lemoncode-challenge/dotnet-stack/backend/obj/Debug/netcoreapp3.1/backend.GeneratedMSBuildEditorConfig.editorconfig
Lines changed: 325 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,325 @@
1+
# Día I: Introducción a Docker
2+
3+
![Docker](imagenes/Contenedores%20I%20-%20Hello%20World%20-%20Lemoncode.jpeg)
4+
5+
## Cómo instalar Docker en tu máquina local
6+
7+
A día de hoy, la forma más sencilla de instalar Docker en tu máquina local es a través de Docker Desktop, el cual está disponible
8+
tanto para Windows, como para Linux y Mac. Para descargar el instalable que necesites para tu sistema operativo [desde la página oficial](https://www.docker.com/). Una vez que lo hayas instalado ya estamos listos para empezar a jugar ✨.
9+
10+
## Conociendo Docker desde Docker Desktop
11+
12+
En el momento que hayas instalado Docker Desktop te darás cuenta de que puedes empezar con el mismo de una forma muy visual. Pero es recomendable que sepas dominar la línea de comandos ya que no solo es la forma más rápida de trabajar con Docker sino que también es la forma más común de trabajar con Docker en la vida real. En primer lugar porque puedes versionar tus comandos, automatizarlos, compartirlos, etcétera y también porque habrá ocasiones en las que no tengas acceso a la interfaz gráfica de Docker Desktop.
13+
14+
Para esta primera clase te recomiendo que todos los comndos que aprendas los ejecutes directamente en el Terminal que ahora viene integrado como parte de Docker Desktop ya que te permite ver el resultado en la interfaz gráfica en el momento que ejecutas un comando.
15+
16+
![Terminal integrado en Docker Desktop](imagenes/Terminal%20integrado%20en%20Docker%20Desktop.png)
17+
18+
## Ejecuta tu primer contenedor
19+
20+
Ahora lo que vamos a hacer es ejecutar nuestro primer contenedor. Para ello, quedate en el apartado de contenedores y vamos a ejecutar el siguiente comando en el terminal:
21+
22+
```bash
23+
docker run hello-world
24+
```
25+
26+
`hello-world` es la imagen que estás usando para crear tu contenedor. Una imagen es un objeto que contiene un SO, una aplicación y las dependencias que esta necesita. Si eres desarrollador puedes pensar en una imagen como si fuera una clase. Si lo has lanzado a través del terminal integrado te habrás dado cuenta un nuevo contenedor ha aparecido se ha puesto en verde y rápidamente ha pasado a gris. Esto es así porque el contenedor hello-world es un contenedor que se ejecuta una vez y se para.
27+
28+
Como parte del proceso de creación de un contenedor, Docker descarga la imagen que le has indicado que necesita. Si quieres ver las imágenes que tienes descargadas en tu local puedes ejecutar el siguiente comando:
29+
30+
```bash
31+
docker image ls
32+
```
33+
34+
O bien
35+
36+
```bash
37+
docker images
38+
```
39+
40+
## ¿Y estas imágenes de dónde vienen?
41+
42+
Pues todas las que utiliza por defecto Docker vienen de un lugar llamado [Docker Hub](https://hub.docker.com/). Docker Hub es un repositorio de imágenes de Docker que puedes utilizar para tus propios proyectos. Puedes buscar imágenes en Docker Hub a través de la interfaz gráfica de Docker Desktop o bien a través del CLI. Por ejemplo, imaginate que ahora quiero buscar un servidor web, como Nginx. A través de la interfaz podría utilizar `Control + K`o `Command + K` y buscar `nginx` o bien a través del CLI podría ejecutar el siguiente comando:
43+
44+
```bash
45+
docker search nginx
46+
```
47+
48+
Y ahora para ejecutarlo podríamos hacerlo de la misma forma que lo hicimos para el que utilizó la imagen `hello-world`:
49+
50+
```bash
51+
docker run nginx
52+
```
53+
54+
En este caso, como puedes ver ocurren un par de cosas diferentes a las que vimos con el contenedor anterior: en primer lugar que este después de descargar la imagen se sigue ejecutando y en segundo lugar el terminal se queda "esperando" a que termines de ejecutar el contenedor. Esto es porque Nginx es un servidor web y si no se quedara "esperando" a que termines de ejecutar el contenedor, el servidor web se pararía y no podrías acceder a él. Sin embargo... ¿cómo puedo acceder a él? Pues vamos a verlo.
55+
56+
## Mapear puerto de contenedor a los puertos de mi máquina local
57+
58+
Para poder acceder a un contenedor desde nuestra máquina local necesitamos mapear el puerto del contenedor al puerto de nuestra máquina local. Por ejemplo, si queremos acceder a nuestro servidor web de Nginx necesitamos mapear el puerto 80 del contenedor al puerto 8080 de nuestra máquina local. Para ello, podemos hacerlo a través de la interfaz gráfica de Docker Desktop o bien a través del CLI. Si lo hacemos a través de la interfaz gráfica, cuando ejecutemos el contenedor nos aparecerá una ventana emergente en la que podremos indicar el puerto al que queremos mapear el puerto del contenedor. Si lo hacemos a través del CLI, podemos hacerlo de la siguiente forma:
59+
60+
```bash
61+
docker run --publish 8080:80 nginx
62+
```
63+
64+
O bien
65+
66+
```bash
67+
docker run -p 8080:80 nginx
68+
```
69+
70+
Ahora si accedes a [http://localhost:8080](http://localhost:8080) podrás ver el servidor web de Nginx.
71+
72+
## ¿Y si quiero ejecutar un contenedor en segundo plano?
73+
74+
Si bien es cierto que cuando ejecutas un contenedor por primer vez el ver sus logs directamente puede ser bastante útil, lo cierto es que cuando tienes que ejecutar varios contenedores es poco práctico. Es por ello que podemos pedirle que se ejecute en segundo plano a través de la opción `-d` o `--detach`.
75+
76+
```bash
77+
docker run --detach -p 8080:80 nginx
78+
```
79+
80+
O bien
81+
82+
```bash
83+
docker run -d -p 8080:80 nginx
84+
```
85+
86+
## Listar todos los contenedores que tengo en ejecución
87+
88+
Ahora que ya hemos lanzado varios contenedores te preguntarás ¿cómo puedo ver los que tengo ahora mismo ejecutándose? Pues bien, para ello puedes ejecutar el siguiente comando:
89+
90+
```bash
91+
docker ps
92+
```
93+
94+
Pero... yo he lanzado muchos más ¿dónde están? Pues bien, para ver todos los contenedores que tengo en ejecución puedes ejecutar el siguiente comando:
95+
96+
```bash
97+
docker ps --all
98+
```
99+
100+
O bien
101+
102+
```bash
103+
docker ps -a
104+
```
105+
106+
## Bautizar contenedores
107+
108+
En todos los ejemplos anteriores, Docker ha elegido un nombre aleatorio para nuestros contenedores (columna NAMES). Sin embargo, muchas veces es útil poder elegir nosotros el nombre que queramos. Para elegir el nombre de tu contenedor basta con utilizar la opción `--name`.
109+
110+
```bash
111+
docker run -d --name web -p 9090:80 nginx
112+
```
113+
114+
Y si vuelves a listar los contenedores verás que tienes uno nuevo llamado web:
115+
116+
```bash
117+
docker ps
118+
```
119+
120+
También puedes renombrar existentes
121+
122+
```bash
123+
docker rename NOMBRE_ASIGNADO_POR_DOCKER hello-world
124+
docker ps -a
125+
```
126+
127+
## Ejecutar un contenedor y lanzar un shell interactivo en él
128+
129+
Otra tarea común que solemos hacer con Docker es lanzar un shell interactivo en un contenedor. Para ello podemos utilizar el siguiente comando:
130+
131+
```bash
132+
docker run --interactive --tty ubuntu /bin/bash
133+
```
134+
135+
O bien
136+
137+
```bash
138+
docker run -it ubuntu /bin/bash
139+
```
140+
141+
Para comprobar que efectivamente estamos dentro del mismo, vamos a revisar la versión del SO que está instalado en tu contenedor:
142+
143+
```bash
144+
cat /etc/os-release
145+
exit
146+
```
147+
148+
## Vale ¿y cómo puedo ejecutar comandos en un contenedor que ya está en ejecución?
149+
150+
En este caso tenemos dos opciones: podemos ir directamente al contenedor al que queramos conectarnos en Docker Desktop o bien a través del CLI.
151+
152+
Por ejemplo, creamos un contenedor:
153+
154+
```bash
155+
docker run --name webserver -d nginx
156+
```
157+
158+
Y ahora nos conectamos a él a través del CLI:
159+
160+
```bash
161+
docker exec -it webserver bash #Ejecuto el proceso bash dentro del contenedor y con -it me atacho a él
162+
cat /etc/nginx/nginx.conf
163+
exit
164+
```
165+
166+
## ¿Y si quiero ejecutar comandos desde mi local dentro del contenedor?
167+
168+
Pues también es posible. Para ello podemos usar el subcomando `exec` de Docker. Por ejemplo, imagínate que quieres ver los logs de tu servidor web:
169+
170+
```bash
171+
docker exec web ls /var/log/nginx
172+
```
173+
174+
## ¿Cómo paro un contenedor?
175+
176+
Pues ya estamos llegando al final de las demos de hoy. Ahora lo que vamos a hacer es limpiar. Y para ello lo primero que debemos aprender es a parar los contenedores que tenemos en marcha.
177+
178+
```bash
179+
docker stop web
180+
```
181+
182+
Si quisiera volver a arrancarlo podría hacerlo a través del siguiente comando:
183+
184+
```bash
185+
docker start my-web
186+
```
187+
188+
## ¿Y si quiero eliminarlo del todo de mi ordenador?
189+
190+
En ese caso debemos asegurar que el contenedor está parado:
191+
192+
```bash
193+
docker stop my-web
194+
```
195+
196+
Y ahora lo que vamos a hacer es eliminarlo:
197+
198+
```bash
199+
docker rm my-web
200+
```
201+
202+
Si ahora comprobamos los contenedores que tenemos en ejecución veremos que ya no aparece:
203+
204+
```bash
205+
docker ps -a
206+
```
207+
208+
Por supuesto, estas acciones podemos hacerlas de forma sencilla utilizando la interfaz gráfica de Docker Desktop.
209+
210+
Otra forma también muy rápida de hacer todo esto es utilizando lo que yo llamo *comandos combinados*. Por ejemplo, imagínate que quieres parar y eliminar todos los contenedores que tienes en ejecución:
211+
212+
Podrías recuperar el ID de todos ellos utilizando este comando:
213+
214+
```bash
215+
docker ps -aq
216+
```
217+
218+
Y pasarle todos los IDs a los comandos `stop`:
219+
220+
```bash
221+
docker stop $(docker ps -aq)
222+
```
223+
224+
y `rm`:
225+
226+
```bash
227+
docker rm $(docker ps -aq)
228+
```
229+
230+
## SQL Server dockerizado
231+
232+
Para finalizar, vamos a ver un ejemplo de cómo podemos utilizar Docker para tener un SQL Server en nuestra máquina local. 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. Pues bien, para ello puedes utilizar Docker. Y ahora que ya sabes cómo hacerlo vamosa terminar utilizando otra imagen de Docker Hub. En este caso vamos a utilizar la imagen de SQL Server de Microsoft. Para ello, vamos a ejecutar el siguiente comando:
233+
234+
```bash
235+
docker run --name mysqlserver \
236+
-p 1433:1433 \
237+
-e 'ACCEPT_EULA=Y' \
238+
-e 'SA_PASSWORD=Lem0nCode!' \
239+
-d mcr.microsoft.com/mssql/server:2019-latest
240+
```
241+
242+
Este comando es un poco más complejo que los anteriores, así que vamos a verlo por partes:
243+
244+
- `docker run`: es el comando que utilizamos para lanzar un contenedor.
245+
- `--name mysqlserver`: es el nombre que le vamos a dar al contenedor.
246+
- `-p 1433:1433`: es el puerto al que vamos a mapear el puerto del contenedor.
247+
- `-e 'ACCEPT_EULA=Y'`: es una variable de entorno que necesitamos para aceptar la licencia de SQL Server.
248+
- `-e 'SA_PASSWORD=Lem0nCode!'`: es una variable de entorno que necesitamos para indicar la contraseña del usuario `sa`.
249+
- `-d mcr.microsoft.com/mssql/server:2019-latest`: es la imagen que vamos a utilizar para crear el contenedor.
250+
251+
Una vez que hayas ejecutado el comando, si vuelves a la interfaz gráfica de Docker Desktop verás que tienes un nuevo contenedor en ejecución. Ahora lo que vamos a hacer es conectarnos a él a través del CLI:
252+
253+
```bash
254+
docker exec -it mysqlserver /opt/mssql-tools/bin/sqlcmd -S localhost -U sa -P Lem0nCode!
255+
```
256+
257+
Y ahora lo que vamos a hacer es crear una base de datos, una tabla y unos registros:
258+
259+
```sql
260+
CREATE DATABASE Lemoncode;
261+
GO
262+
```
263+
264+
Selecciona la base de datos:
265+
266+
```sql
267+
USE Lemoncode;
268+
GO
269+
```
270+
271+
Crea una tabla:
272+
273+
```sql
274+
CREATE TABLE Courses(ID int, Name varchar(max), Fecha DATE);
275+
GO
276+
```
277+
278+
Inserta registros en la tabla:
279+
280+
```sql
281+
SET LANGUAGE ENGLISH;
282+
GO
283+
INSERT INTO Courses VALUES (1, 'Bootcamp DevOps', '2024-10-8'), (2,'Máster Frontend','2024-10-08');
284+
GO
285+
```
286+
287+
Y ahora conectate con Azure Data Studio a tu localhost:1433 y tendrás tu acceso a tu SQL Server dockerizado!
288+
289+
Una vez que termines, ya puedes parar y eliminar tu SQL Server dockerizado
290+
291+
```bash
292+
exit
293+
```
294+
295+
```bash
296+
docker stop mysqlserver && docker rm mysqlserver
297+
```
298+
299+
Y también puedes pararlo y eliminarlo de golpe
300+
301+
```bash
302+
docker rm -f mysqlserver
303+
```
304+
305+
¡Felicidades 🎉! En esta primera clase has aprendido a:
306+
307+
- Instalar Docker Desktop en tu máquina local.
308+
- Conocer Docker desde Docker Desktop.
309+
- Ejecutar tu primer contenedor.
310+
- Ver las imágenes que tienes descargadas en tu local.
311+
- Buscar imágenes en Docker Hub.
312+
- Mapear puerto de contenedor a los puertos de tu máquina local.
313+
- Ejecutar un contenedor en segundo plano.
314+
- Listar todos los contenedores que tienes en ejecución.
315+
- Bautizar contenedores.
316+
- Ejecutar un contenedor y lanzar un shell interactivo en él.
317+
- Ejecutar comandos en un contenedor que ya está en ejecución.
318+
- Ejecutar comandos desde tu local dentro del contenedor.
319+
- Parar un contenedor.
320+
- Eliminar un contenedor.
321+
- SQL Server dockerizado.
322+
323+
En la siguiente clase veremos cómo podemos crear nuestras propias imágenes de Docker.
324+
325+
Happy coding {🍋}

01-contenedores/contenedores-i/books.json

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

0 commit comments

Comments
 (0)