Skip to content

Latest commit

 

History

History
307 lines (224 loc) · 14.2 KB

index.adoc

File metadata and controls

307 lines (224 loc) · 14.2 KB

Docker

Resumen

Resumen del tutorial de Docker

Objetivos
  • Conocer la herramienta Docker.

  • Realizar una pequeña introducción a Docker.

  • Instalar Docker.

  • Entrar en nuestra máquina Docker.

  • Aprender a usar Docker-Compose.

  • Conocer el concepto de Swarm dentro de Docker.

1. Introducción

Docker es una herramienta diseñada para hacer fácil crear, desplegar y hacer funcionar aplicaciones utilizando contenedores. Estos contenedores permiten al desarrollador empaquetar una aplicación con todas las partes que necesite: librerías, dependencias de la aplicación, software requisito de la aplicación, etc. Esto nos permite desplegarlo todo como un solo artefacto.

Gracias al los contenedores, el desarrollador se asegura que la aplicación funcionará en cualquier otra máquina sin importar los parámetros de configuración de la misma, aun cuando estos sean completamente distintos a los de la máquina donde se ha desarrollado y testeado el código.

Podemos decir que un contenedor se parece a una máquina virtual, pero al contrario que estas que lo que hacen es crear un sistema operativo completo Docker nos permite utilizar varios contenedores compartiendo el mismo kernel de Linux. Esto hace que haya una ventaja significativa tanto en rendimiento como en aprovechamiento del espacio.

dockervsvm

No menos importante es el hecho de que Docker es un proyecto de código abierto por lo que si cualquier persona repara en la necesidad de nuevas características, el mismo puede desarrollarlas. Y no solo eso, dado que es una herramienta utilizada por la gran mayoría de los proveedores de servicios en la nube (Microsoft Azure,Amazon AwS, Google Compute Engine, OpenStack, etc.) el soporte por parte de ellos es muy importante.

Note

En la web oficial de Docker podéis encontrar documentación sobre la herramienta así como una serie de tutoriales muy interesantes.

1.1. Preparando la máquina

Lo primero es comprobar que tenéis instalado y funcionando el siguiente Software.

  • Git.

Note

Para la realización del tutorial no es necesaria, pero es interesante que esta herramienta básica la tengáis instalada.

2. Desarrollo

2.1. Instalación de Docker

Para realizar la práctica nos vamos a descargar la community edition de Docker la cual podréis instalar en el siguiente enlace.

Una vez tengáis instalado Docker en vuestro sistema reiniciaremos el equipo, acto seguido comprobaremos que esta todo bien instalado, para ello lanzaremos en consola la orden docker --version y comprobaremos que sale algo parecido a la imagen que tenemos a continuación.

DockerVersion
Note
  • OSX: Se puede instalar también a través de una orden de Homebrew.

$ brew cask install docker
  • Linux: Podéis instalarlo mediante casi cualquiera de los packet manager de Linux.

$ apt install docker.io
$ yum install docker

Es importante que comprobéis si la versión que habéis instalado cuenta con docker-compose, para ello intentar escribir en consola el comando docker-compose --version tendreis que ver algo parecido a esto.

docker compose

En teoría solo os debería de faltar la herramienta compose si habéis instalado Docker en Linux, para ello seguid las instrucciones facilitadas en la documentación oficial de Docker. Instalación de docker-compose

Para finalizar, y solo si habéis instalado Docker en Windows debéis de comprobar en las preferencias de docker que carpetas de volumen tenéis compartidas, para ello tenéis la posibilidad de compartir una carpeta de vuestro sistema, en cuyo caso todo los proyectos que tengan que ver con docker deberán estar dentro de esa carpeta, o bien directamente compartís la unidad C:, esto hará que todas las carpetas del sistema sean validas para generar una carpeta de volumen, este concepto lo explicaremos mas adelante.

Para comprobar que todo este correcto en windows en la ventana de carpetas compartidas deberemos ver algo parecido a esto.

dockerWin1

A mas inri es interesante comprobar que recursos reserváis para que docker pueda ser utilizado sin que termine colapsando el funcionamiento de vuestro sistema. Los recursos reservados dependerán mucho de vuestro sistema, pero es recomendable que al menos reservéis dos cores y un par de GB de RAM.

dockerWin2

2.2. Aprovisionamiento de un servidor de nginx mediante Docker

Una vez tenemos instalado Docker en nuestro sistema vamos a realizar un uso básico de la plataforma para levantar un contenedor con nginx. Para ello muchas empresas ofrecen imágenes de Docker para utilizar su software las cuales podremos encontrar en Docker Hub. Una vez estamos en Docker hub buscamos la imagen que nos interese, en nuestro caso vamos a utilizar la que aparece en el siguiente enlace.

En el enlace podemos ver una serie de instrucciones de como personalizar parámetros de la nuestro servidor de nginx, en nuestro caso vamos a centrarnos en un uso básico. Lo primero que vamos a hacer es bajar la imagen del contenedor para ello utilizaremos la orden.

$ docker pull nginx
dockerPull

Esto lo que hace es descargarse la imagen de nginx junto con el resto de imagenes de las cuales esta depende. Una vez descargada la imagen crearemos una carpeta donde lanzaremos la orden para levantar el contenedor, por el terminal nos crearemos una carpeta y dentro de ella crearemos otra llamada data/.

mkDirData
Note

Creamos una carpeta data/ para que los datos persistan en nuestra máquina local, y así poder llevarnos esos datos a cualquier otra máquina o hacerle copias de seguridad.

Una vez tengamos las carpetas creadas nos situaremos dentro de la carpeta de dra y ejecutaremos la siguiente orden.

$ docker run -p 8080:80 -v /Users/manelme/Desktop/dra/data:/usr/share/nginx/html/ -d nginx
Note

Importante!!, poner ruta absoluta a el directorio que queréis utilizar como carpeta compartida de volumen.

Una vez lancemos la orden ya tendremos levantada nuestro servidor de nginx por el puerto 8080 de nuestra maquina local. Para comprobar que se ha lanzado podéis utilizar la orden docker ps y os saldrá algo parecido a esto.

dockerPs

Para comprobar que todo funciona nos metemos en nuestro navegador y comprobamos que http://localhost:8080 funciona correctamente.

Note

Si tenéis algo levantado en vuestro sistema por el puerto 8080 el ejercicio no funcionara.

Vamos a analizar un poco la instrucción utilizada a la hora de lanzar nuestro contenedor de nginx:

  1. La instrucción docker run indica a Docker que debe levantar un nuevo contenedor.

  2. El comando -p 8080:80 le dice a nuestro motor de dockers que debe levantar una máquina con salida en el puerto 8080 de nuestra máquina local cuyo punto de entrada será el puerto 80 del contenedo, es decir, cualquier petición que entre por el 8080 será redirigida al 80 del contenedor.

  3. -v /Users/manelme/Desktop/dra/data:/usr/share/nginx/html indica que cualquier cosa que este en la carpeta /Users/manelme/Desktop/dra/data irá a parar a la carpeta /usr/share/nginx/html de nuestro contenedor y viceversa.

  4. El comando -d nginx le indica a docker que debe ejecutar la ultima imagen de nginx proveniente de docker-hub.

Note

En la sección 3 tenéis las opciones mas comunes usados por la mayoría de imágenes cuando ejecutamos un docker run, así como los comando mas útiles del cliente docker.

Gracias a que hemos generado una carpeta de volumen a levantar nuestro contenedor podemos hacer cosas como generar un index.html en la carpeta /data, esto hará que al momento tengamos esa web levantada ya en el servidor. Hagamos la prueba:

Example 1. Creamos un archivo index.html dentro de /data.
<!doctype html>
<html>
<head>
    <title>DRA(ual) example nginx</title>

    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;

    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 50px;
        background-color: #fff;
        border-radius: 1em;
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        body {
            background-color: #fff;
        }
        div {
            width: auto;
            margin: 0 auto;
            border-radius: 0;
            padding: 1em;
        }
    }
    </style>
</head>

<body>
<div>
    <h1>DRA(ual) example nginx</h1>
    <p>Esta es una página de ejemplo referente a la práctica de nginx</p>
    <p><a href="https://ualdra.github.io/docker_101/">More information...</a></p>
</div>
</body>
</html>

Una vez hemos generado el archivo, comprobamos que el enlace de nuevo http://localhost:8080 funciona correctamente.

nginxex

2.3. Docker-Compose

El próximo paso es ver que es y como funciona docker-compose. Compose es un herramienta (cliente de docker) que te permite definir y hacer funcionar una aplicación multi-contenedor de Docker. En el archivo docker-compose.yml definimos tanto la version de la herramienta que vamos a utilizar asi como las máquinas que formarán parte de la aplicación. Esto hace que todas las máquinas, salvo que digamos los contrario, se levanten en la misma red virtual, veamos un ejemplo de archivo de definición de compose:

Example 2. Archivo de definición docker-compose.yml para levantar Wordpress.
version: '3.3'

services:
   db:
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: somewordpress
       MYSQL_DATABASE: wordpress
       MYSQL_USER: wordpress
       MYSQL_PASSWORD: wordpress

   wordpress:
     depends_on:
       - db
     image: wordpress:latest
     ports:
       - "8000:80"
     restart: always
     environment:
       WORDPRESS_DB_HOST: db:3306
       WORDPRESS_DB_USER: wordpress
       WORDPRESS_DB_PASSWORD: wordpress
volumes:
    db_data:

El archivo de definición como podeis ver es muy intuitivo, en el veis como declaramos la version que se va a utilizar de compose, y a continuación se definen los servicios. como se puede observar en este caso estamos levantando un wordpress, el mismo se compone de dos servicios:

  • Por un lado una base de datos, como se ve, con la palabra clave image se indica que estamos tirando de la imagen base de mysql que encontramos en docker-hub, la siguiente palabra clave volumes indica que la carpeta /var/lib/mysql ira a parar a la carpeta donde esta definido el volumen db_data, la palabra clave restart define que politica hay que seguir a la hora de restablecer el servicio cuando este se ve afectado por un problema que provoque una interrupción del mismo, por último con environment definimos las variables de entorno que la imagen necesita para configurarse.

  • En segundo lugar definimos la propia wordpress donde vemos que hay dos palabras claves nuevas. Primero, la palabra clave depends_on definimos de que microservicios incluidos en el compose dependemos, esto fuerza a que estos servicios se inicien antes, en nuestro caso la base de datos se tiene que iniciar antes de que wordpress se ponga a funcionar (algo totalmente lógico), por último en con ports definimos un puerto público de la máquina local y su correspondencia en el contenedor.

Una vez hemos visto el archivo compose vamos a proceder a ejecutarlo, para ello lanzaremos la siguiente instrucción.

dockerComUpd

La ejecución se encarga de generar una carpeta de volumen que como en este caso no la hemos creado en una ruta de manera explicita se generará en la carpeta de volumenes docker. Al igual que el volumen también se genera una red que al no nombrarla se genera con la coletilla default. Cuando termina de ejecutarse podemos comprobar con docker ps como se han levantado las dos maquinas definidas en el compose, y a su vez en este ejemplo vemos como hemos levantado de manera muy sencilla un Wordpress en el puesto 8000.

dockerPsWordpress
webInstalacionWordpress
Note

El comando -d en docker-compose hace que no se bloquee la ventana del terminal con la ejecución, asi podremos seguir utilizarla.

Por último cuando queramos detener las máquinas que estan incluidas en el archivo compose en bloque, utilizaremos la instrucción docker-compose stop.

3. Cheat-Sheets

Es interesante que veáis la documentación de cada una de las herramientas de las que hemos hablado, no obstante aquí tenéis unas pequeñas imágenes con referencias de comandos de cada una de ellas.

3.1. Docker

dockerCs

3.2. Docker-Compose

dockerComCs
Note

Consultar la documentación oficial de compose donde podreis encontrar la sintaxis de las nuevas versiones.

3.3. Docker-swarm

Por último es interesante entender que es el modo swarm dentro de docker. Cuando trabajamos con docker-swarm lo que estamos haciendo es hacer un pool de todos los recursos de los que disponenmos, esos recursos serán gestionados por docker-swarm, de esa manera docker será la que se encarge de elegir por ejemplo donde se levantará (en qué máquina) nuestro contenedor y de gestionar todos lo recursos como si fuesen un todo. Una alternativa muy conocida a swarm puede ser Kubernetes, pero preferimos utilizar swarm dado que es una herramienta que ya viene incluida dentro de docker y es perfectamente funcional.