Docker - Introducción parte 2
Tags: docker, beginners, spanish
Published: 2019-10-28 08:04:48

En éste artículo hablaremos sobre cuales son los elementos con los que interactuamos al trabajar con Docker. Los principales elementos al trabajar con Docker son:

1. Contenedores
2. Imágenes
3. Volúmenes
4. Redes

Los **contenedores** son cada uno de los ambientes dentro de nuestro sistema operativo donde se están ejecutando las aplicaciones de forma aislada. Estos ambientes tienen disponible todos los recursos de nuestro sistema (CPU, Ram, Red con salida a internet) a no ser que le hayamos especificado límites. Los contenedores se crean a partir de las imágenes y están llamados a ser **efímeros** y **"stateless"** (sin estado), es decir, no deberían alojar datos que necesiten persistir (ver Volúmenes más abajo).

Las **imágenes** son los paquetes donde se encuentran la aplicación que podemos ejecutar junto con todas sus dependencias. Los contenedores son instancias de imágenes en ejecución y se pueden crear N cantidad de estas. Las imagenes se crean a partir de un simple archivo de definición llamado Dockerfile, el cual contiene una sintáxis muy sencilla y unas pocos comandos o palabras clave.

Los **volúmenes** son el mecanismo de agregar persistencia de datos a los contenedores. En ocasiones estos volúmenes son un enlace entre un directorio del sistema de archivos principal y el del contenedor. Cuando un contenedor es eliminado el volumen sobrevive y seremos capaces de adjuntarlo a un nuevo contenedor para que tenga disponible los datos allí guardados. También es muy utilizado cuando se requiere compartir datos entre contenedores.

Las **redes** son el mecanismo que se utiliza para habilitar la comunicación entre dos o más contenedores. Una vez dos contendores conviven en la misma red estos se pueden comunicar a través del nombre del contenedor o algún alias configurable.

## Instalación

Sabiendo lo básico de Docker procedamos a instalarlo.

El proceso varía de un sistema operativo a otro. Aquí puedes ir a la documentación oficial y buscar el procedimiento en tu sistema operativo: https://docs.docker.com/v17.09/engine/installation/#supported-platforms

## Manos a la obra

Una vez tengamos instalado Docker, vamos a ejecutar contenedores y veamos lo rápido y fácil que es todo esto.

Abre la terminal y ejecuta el siguiente comando:

```bash
docker --version
```

El resultado debería ser algo como esto:

```
Docker version 19.03.4, build 9013bf583a
```

Si es así, tienes Docker correctamente instalado. Sino, debes regresar a la documentación y seguir los pasos con cuidado, atento a cualquier error que podría aparecer en el proceso.

Ahora vamos a ejecutar el famoso NGINX con el siguiente comando:
```bash
docker run nginx
```

¡Listo! Tenemos nuestro primer contenedor ejecutandose.

## ¿Y ahora qué sigue?

Entendamos qué ha pasado aquí.

La primera palabra del comando *docker* hacer referencia al binario de docker que no es más que el cliente que le envía órdenes al servidor Docker desde nuestra línea de comandos. La segunda palabra *run* es el comando que indica que se debe crear e inmediatamente iniciar un contenedor a partir de una imagen. La última palabra hace referencia a la imagen de Docker que queremos ejecutar, en este caso *nginx*.

Con este comando y sin necesitar nada más podemos decir que tenemos instalado en nuetro computador un servidor de Nginx. 

¿Cómo comprobamos eso?


Abriremos otra terminal y ejecutaremos el siguiente comando:

```bash
docker ps
```

Nos saldrá algo como ésto:
```
CONTAINER ID        IMAGE                        COMMAND                  CREATED             STATUS                          PORTS                  NAMES
946cf26c846b        nginx                        "nginx -g 'daemon of…"   14 seconds ago      Up 13 seconds                   80/tcp                 lucid_lichterman

```

Éste comando nos indica los atributos de nuestro contendor: el Id, la imagen del que fue creado, el tiempo ejecutándose, un nombre que docker le otorgó de manera aleatoria y el puerto en el que está ejecutandose la aplicación. Pero si tratamos de acceder a Nginx por el puerto 80 con nuestro navegador o con curl veremos que NO obtendremos la respuesta que esperabamos debido a que, como hemos mencionado en algunas ocasiones de esta serie de artículos, los contenedores están aislados hasta que definamos lo contrario.

¡Vamos a hacerlo! Primero detengamos nuestro contenedor con el comando *docker stop <id o nombre del contenedor>* y *docker rm <id o nombre del contenedor>*, en mi caso sería:

```bash
docker stop lucid_lichterman
docker rm lucid_lichterman
```
Si volvemos a ejecutar *docker ps* veremos el listado de contenedores ejecutandose vacío.

Ahora ejecutaremos nueva vez el contenedor de Nginx pero en esta ocasion especificaremos que queremos mapear o redirigir el puerto 8085 de nuestro sistema al puerto 80 del contenedor y además le pondremos el nombre *server* a nuestro contenedor de Nginx de la siguiente manera:

```bash
docker run --name server -p 8085:80 nginx
```

¡Ahora si! Si vamos a nuestro navegador y colocamos *localhost:8085* veremos la respuesta de Nginx desde nuestro contenedor.

En el siguiente artículo veremos más detalles sobre cómo esto fué posible y trabajaremos con las imágenes.