Crear contenedores de bases de Datos en Docker
Tags: docker, tutorial, spanish, beginners
Published: 2021-01-30 14:04:23

# ¿Por que usar Docker? 🤔
Docker es una incredible herramienta que todo programador Web debería conocer. Docker viene de los problemas de **crear, ejecutar, probar y mover las aplicaciones**, con problemas como librerías, dependencias o configuraciones de sistema, problemas que todo programador habrá tenido.
Docker viene a solucionar con los contenedores al aislar los programas con todo lo que necesita para ejecutarse y asegurando que en toda situación va a **ejecutarse no importa el sistema o entorno**.
## ¿No es lo mismo que una maquina virtual? 🤨
No, Docker es diferente al funcionamiento a una **maquina virtual, como su nombre dice es una maquina completa emulada**, por lo cual emula absolutamente todo, incluyendo el sistema operativo, el kernel y programas pre-instalados del sistema, lo que puede resultar en una varios GB de peso.
Docker por su parte solo **toma las dependencias y librerías necesarias** para que el programa se ejecute, aísla el programa en contenedores y permite ejecutarlo sobre el motor de docker que asegura que funcionara en cualquier lugar.
![docker_engine](https://dev-to-uploads.s3.amazonaws.com/i/zu84k94zn8y4do16ws9l.jpg)
## ¿Y esto en que se relaciona con las Bases de Datos? 😓
Docker puede usarse para ejecutar cualquier pieza de software de manera rápida y segura, **eso incluye los motores de bases de datos**. Esto es uno de los usos mas comunes de Docker, en vez de instalar la bases de datos en nuestro sistema y hacer la configuración manualmente, podemos usar las imágenes de docker, que son muy populares y crear una base de datos rápidamente.
### ¿Que es una imagen en Docker?
**Las imágenes Docker son plantillas** (que incluyen una aplicación, los binarios y las librerías necesarias) que se utilizan para construir contenedores Docker y ejecutarlos. Si has trabajado con lenguajes orientados a objetos, son como (valga la redundancia) objetos, una base y estructura para crear una nueva aplicación con características ya establecidas. Puedes ver todas las imágenes en [Docker Hub](https://hub.docker.com/).
![docker_hub](https://dev-to-uploads.s3.amazonaws.com/i/g8pkhdkewnjedgzql43b.png)
### Espera, dijiste que la aplicación se “aísla” ¿Como accedo a la bases de datos? 🙃
Si, eso dije y no estaba equivocado en eso. Es una de las maravillas de Docker, entre sus características esta la de permitir **exponer un puerto de tu aplicación al resto de tu equipo**. La forma en que funciona docker es que tiene su propia red interna, aislada del resto del equipo, tiene la opción de exponer esos puertos “como un espejo” ¿A que me refiero con “espejo”? es que se asigna un puerto de la computadora a uno de la red de docker. Esta imagen lo deja mas claro:
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/fbr7ixdctug6lgjd5q40.png)
## Bueno, me convenciste ¿Como creo una base de datos? 😅
¿Que se necesita para ejecutar una imagen en docker? obviamente Docker, vamos a la [pagina oficial de docker](https://www.docker.com/get-started) y descargar Docker Desktop: Para Windows y Mac es un simple instalador, se descarga y ejecuta. Para linux tiene algunos pasos extra, tendras que buscar una version para tu distribución de linux (aunque si estas en linux de seguro sabes mas que yo 😉)
Ahora para asegurarnos de que docker esta instalado ejecutamos en la linea de comando:
```bash
$docker -v
Docker version 19.03.13, build 4484c46d9d
```
## Ya tengo Docker ¿Como creo una base de datos?
Bueno, para este ejemplo, vamos a usar dos motores de bases de datos **PostgresSQL y MongoDB**. Para otros motores de bases de datos el procedimiento es el mismo.
### Crear un contenedor de PostgreSQL
Para este y cualquier imagen de Docker vamos a usar como base la pagina de docker hub, en este caso la de [Postgres](https://hub.docker.com/_/postgres). Abrimos una terminal de comandos y escribimos el siguiente código:
```bash
docker run --name tu-nombre -p 5432:5432 -e POSTGRES_PASSWORD=micontraseña -d postgres
```
* **docker run**: Comando de Docker para crear un contenedor.
* **--name**:Parámetro del nombre, seguido poner el nombre que desees del contenedor.
* **-p**:este es importante, este parámetro asigna los puertos para que pueda accederse desde el equipo. el puerto 5432 (el puerto 5432 es el puerto por defecto de Postgres)del equipo estará escuchando y las mandara a Docker.
* **-e**: Este parámetro significa “environment”, y crea `POSTGRES_PASSWORD` con la contraseña que se pase como parámetro.
* **-d**: Significa “Detached” y crea el contenedor de manera separada
* `postgres`: Y `postgres` hace referencia a la imagen de PostgreSQL, que usa como base de nuestra nueva imagen

¡Listo! tenemos una base de datos postgresSQL 😁

El comando debería ejecutar el contenedor después de crearlo, pero si no ejecuta este comando en la terminal:
```bash
docker start nombre
```
Esto ejecutara el contenedor y iniciara la DB. Para detenerla es muy similar:
```bash
docker stop nombre
```

### Crear un contenedor de MongoDB
Es muy similar al anterior con una pequeña diferencia, los conceptos generales de docker se aplican igual. Se ejecuta en la terminal:
```bash
docker run --name tu-nombre -p 27017:27017 -d mongo
```
¡Listo! ahora tenemos una base de Datos de MongoDB.

### Espera ¿Ahora como uso las bases de datos?
Si quieres conectarte a la base de datos solo tienes que conectarte a `localhost:puerto_de_DB` y podrás usarla como cualquier otra base de datos, pero **¿Y si quiero manipular los datos por consola?** buena pregunta, porque ahora la bases de datos están ejecutándose en Docker, para acceder a ellas tienes que hacerlo mediante un comando de docker llamado `docker exec`.

En postgres el comando es:
```bash
docker exec -it tu-contenedor psql -U postgres
```
esto se conectara a la base de datos Postgres y ejecutara `psql -U postgres`, permitiendo interactuar con nuestra base de datos PostgreSQL.

Y en mongo el comando es:
````bash
docker exec -it tu-contenedor mongo
```

Muchas gracias por leer, algún problema no duden en escribir un comentario 😁