viernes, 6 de abril de 2018

Usando Docker de manera práctica - Parte I

Hola de nuevo, en los posts anteriores sobre Docker he repasado un poco la teoría de operación de Docker y, de una manera muy básica, he realizado una introducción a ciertas características. Para poder profundizar un poco más en Docker y su funcionamiento vamos a ver unos cuantos casos prácticos.

Para empezar lo fundamental es instalar Docker. Esto podemos hacerlo de una manera muy sencilla con solo descargar el paquete correspondiente para nuestra distribución Linux. Por ejemplo, en sistemas como CentOS:
Instalación del motor de Docker.

con lo que nuestro motor de Docker ya estaría listo y disponible en nuestro sistema para empezar a usarlo.

Una vez instalado, el comando que vamos a utilizar para todo es docker, el cual interactua con el demonio docker que ahora estará arrancado en nuestro sistema.

El primer comando que vamos a utilizar, para comprobar que la instalación se ha realizado correctamente, nos dará la versión de Docker que estamos usando:

Comprobando la versión de Docker,.

Bien, una vez que tenemos nuestro motor de Docker instalado y funcionando correctamente vamos a realizar un ejemplo básico, pero en este caso no vamos a crear un contenedor que nos diga Hola mundo, sino vamos a hacer algo un poco más interesante, como montar con un solo comando un servidor web Apache.

Como ya expliqué, el motor de Docker permite ejecutar aplicaciones dentro de un entorno aislado a partir de una imagen que contendrá todo el software que dicha aplicación necesita. Ahora bien, ¿de donde salen esas imágenes? Al igual que las diferentes distribuciones de Linux tienen repositorios con paquetes de software, Docker dispone de un repositorio público que contiene miles de imágenes que podemos descargar y utilizar para crear nuestros contenedores. Puedes consultar dicho repositorio en la URL https://hub.docker.com/ previo registro, el cual es absolutamente gratuito. Este registro en Docker Hub nos permitirá, más adelante, subir nuestras imágenes y hacerlas públicas si así lo deseamos.

Al igual que nuestro gestor de paquetes favorito nos permite buscar software por su nombre, el comando docker dispone de un subcomando search el cual, salvo que especifiquemos otro repositorio, buscará siempre en Docker Hub. Como para estas operaciones no es necesario que tengamos un usuario registrado, vamos a buscar una imagen para instalar nuestro servidor Apache:

Busqueda de imágenes de Apache en Docker Hub.
Como véis aparecen muchos resultados ya que, al buscar una cadena con el comando docker search, este realizará la búsuqeda tnato el nombre de la imagen como en la descripción de la misma. Como se vé en la salida, las imágenes tienen valoraciones con estrellas y además, en algunas se indica que son oficiales. Más adelante intentaré profundizar un poco más en toda esta información pero, de momento vamos a quedarnos con la imagen docker.io/httpd y vamos a crear nuestro primer contenedor con ella. Para esto solo es necesario ejecutar el comando; docker run -d --name webserver httpd:latest, como podemos ver a continuación:

Creación de un contenedor con un servidor web Apache.
Tras descargarse las capas de sistemas de ficheros necesarias que forman la imagen, podemos comprobar con el comando docker ps -a si hay algún contenedor corriendo:

Lista de contenedores arrancados y parados en el sistema.
La salida del comando muestra que hemos creado un contenedor con la imagen httpd:latest, que el nombre del contenedor es webserver, el estado del contenedor y que está escuchando en el puerto 80. Por tanto, ¿quiere esto decir que con tan solo ese comando hemos levantado un servidor web Apache y que es accesible por el puerto 80? La respuesta es no. Por defecto, un contenedor tendrá acceso al exterior del host donde se está ejecutando pero no podremos acceder a él desde fuera del host, solo desde el propio host. La manera más sencilla de comprobar esto es arrancar nuestro contenedor webserver con una shell, para ello solo tenemos que hacer lo siguiente:

Usando una shell en un contenedor.

Al arrancar así el contenedor, especificando el comando, no se ejecutará el comando por defecto de la imagen y por tanto, no estará corriendo el servidor apache pero podremos interactuar con el contenedor. Desde esta shell, si comprobamos la dirección IP y lanzamos un ping podremos comprobar que el contenedor puede acceder a la red sin problemas:

Acceso a la red desde un contenedor.

Como lo que queremos es comprobar que nuestro contenedor es un servidor web que está funcionando correctamente, arrancamos nuestro contenedor de nuevo sin pasarle ningún comando y a probamos a acceder desde el propio host. Para esto primero necesitamos saber que dirección IP le ha asignado docker a este contenedor, para esto podemos ejecutar el comando ip addr dentro del contenedor del siguiente modo:
Ejecutando un comando dentro de un contenedor.
Esto nos muestra una funcionalidad muy interesante y es que, siempre que el comando exista dentro del contenedor, podremos ejecutarlo y realizar acciones dentro de un contenedor que está corriendo. Con este sencillo comando hemos obtenido la dirección IP que nuestro contenedor webserver tiene con lo que ahora, con nuestro querido comando lynx podemos comprobar si de verdad está sirviendo una página web:

Accediendo con lynx a nuestro servidor web.
Aunque no es muy gráfico, nos permite comprobar que efectivamente, con un solo comando, hemos levantado un servidor web Apache totalmente operativo.

En el próximo post vamos a darle una pequeña vuelta a esto y explicar un poco más los comandos que hemos utilizado en este post, así como cambiar la forma en que creamos nuestro contenedor para que sea accesible desde el exterior.