|
| 1 | +# Día I: Introducción a Docker |
| 2 | + |
| 3 | + |
| 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 | + |
| 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 {🍋} |
0 commit comments