La nube es cada vez más grande y cada día cuenta con más y más usuarios que la utilizan . Existen un gran número de entornos de trabajo para los diferentes sistemas operativos aplicables a los servicios en la nube, el desarrollo de aplicaciones ha crecido en gran medida y el hecho que existan tantos entornos hace que cada vez sea más difícil mantener los sistemas actualizados y con los requisitos necesarios para ejecutar las mismas aplicaciones.
Normalmente los administradores de sistemas y los desarrolladores suelen ser ajenos unos de los otros, por lo que a veces pueden surgir problemas a la hora de la poner en común los trabajos, por culpa de diferencias de versiones, librerías, etc. El desarrollo de aplicaciones y softwares se da tan rápidamente que es posible que en cuestión de meses, una aplicación determinada requiera actualización y esto comporta cambios a todos los niveles, desde código hasta el mismo servidor de la aplicación.
¿Qué es un contenedor de software?
Un contenedor de software envuelve una pieza de software en un completo sistema de archivos que contiene todo lo que necesitas para ejecutar la aplicación. Consiste en uno entorno a ejecución completo, un paquete de elementos que además de contener la aplicación en si contendrá sus dependencias, así como las librerías y ficheros binarios y de configuración necesarios para el buen funcionamiento de esta.
Estos son parecidos a los sistemas de virtualización con la diferencia de que a las máquinas virtuales utilizadas en la virtualización se incluye un sistema operativo completo así como la aplicación, por el que es necesaria la utilización de un hipervisor, que gestione las máquinas virtuales. Mientras que los contenedores mantienen la plataforma de la aplicación y sus dependencias, y el sistema operativo es compartido en los diferentes contenedores.
A la siguiente imagen gráfica obtenida del blog oficial de Docker podemos comprobar las diferencias entre sistemas implementados en máquinas virtuales y sistemas implementados en Docker, donde se observa como este se pueden compartir tanto librerías como binarios entre diferentes aplicaciones.
Imágen 1. Contenedores vs máquinas virtuales. blog.docker.com
Las ventajas de los contenedores:
- Facilidad de instalación: Dado que los contenedores se inician a partir de imágenes portables son mucho más rápidos de ejecutar.
- Independencia: De las plataformas y por lo tanto se puede mover de un sistema a otro con la seguridad que funcionará correctamente.
- Recursos: Los contenedores además de no necesitar el sistema operativo tampoco necesitan una copia del hardware, por lo tanto utiliza menos RAM, y menos CPU que una máquina virtual.
- Capacidad: Un contenedor puede ocupar decenas de megabytes, mientras que una máquina virtual con su propio sistema operativo puede ocupar varios gigabytes. Por el que un sólo servidor podrá alojar más contenedores que máquinas virtuales.
Los inconvenientes de los contenedores:
- Seguridad: El contenedor son menos seguros, porque comparten el mismo sistema operativo, el cual si experimenta una vulnerabilidad, esta tendrá acceso a todos los contenedores que comparte, quedando así menos aisladas que en el caso de las máquinas virtuales.
¿Qué es Docker?
Según la web oficial de Docker, este es una plataforma mundial de contenedores de software. Donde los desarrolladores comparten sus códigos formando una comunidad más amplía de trabajo. En definitiva Docker es una herramienta destinada a la creación, implementación y ejecución de aplicaciones a través de contenedores, un proyecto de software libre el cual permite la virtualización a nivel de sistema operativo.
Sus principales características son la portabilidad, ligereza y autosuficiencia que permite mejorar a la hora de trabajar sobre la nube, ya que, la gestión de contenedores se realiza mediante comandos y esta basada en técnicas propias de Linux como Cgroups y Namespaces para poder separar los recursos de cada contenedor.
La idea de Docker es crear contenedores ligeros y portables para que las aplicaciones puedan ejecutarse en cualquier máquina que previamente tenga instalar Docker, independientemente del sistema operativo de la máquina lo que facilita en gran mida los despliegues.
Aplicaciones
El sistema de contenedores de Docker se compone de principalmente, de un proceso de la plataforma llamado demonio y de un cliente, que será el binario que forma la plataforma que permite al usuario interactuar con el demonio.
Una imagen, normalmente es una plantilla para crear el contenedor, los registros o directorios donde se almacenan las imágenes y los mismos contenedores, o directorios donde se almacenan las librerías, dependencias, binarios, etc., necesarios para ejecutar la aplicación.
Docker además también cuenta con una serie de repositorios, similares a los de Linux donde los usuarios comparten sus propios contenedores con otros usuarios. Docker nos permite un mecanismo de enlace entre contenedores también llamados túneles a través de los cuales los contenedores se comunican entre sí. Para establecer la asociación entre contenedores es necesario utilizar el nombre del contenedor, porque será el punto de enlace con otros contenedores. Y de los cuales trataremos y detallaremos más adelante.
Las aplicaciones de Docker tienen grandes ventajas para los desarrolladores los cuales pueden disponer de entornos de desarrollo iguales a producción de forma rápida y evita tener que instalar nuevas aplicaciones. Si todos los contenedores son gestionados por la misma herramienta, se hace posible autorizar todas las aplicaciones de forma centralizada, por todo esto Docker es una buena herramienta para desarrolladores.
Instalación
Docker tiene ejecutables y aplicaciones para la instalación sobre los más comunes sistemas operativos, como Mac, Windows, Linux, AWS y Azure. Su instalación es muy simple y se puede seguir por pasos desde la documentación oficial de Docker.
Como ejemplo de instalación, detallaremos la instalación sobre un sistema Linux, como podría ser Ubuntu, el cual podemos instalar de dos formas, directamente desde la tienda de software de Ubuntu o mediante comandos.
A continuación tenemos un ejemplo de los comandos a seguir para su instalación en Ubuntu previa preparación del sistema:
Actualización del sistema:
$ sudo aptitude update </ br> $sudo aptitude -y upgrade
Añadimos la clave del repositorio Docker a la lista de APT para la verificación del paquete:
$ sudo sh -c "wget -qO- https://get.docker.io/gpg | apt-key add -"
Añadimos el repositorio de Docker:
$ sudo sh -c "echo deb http://get.docker.io/ubuntu docker main\ > /etc/apt/sources.list.d/docker.list"
Actualizar el repositorio con la nueva adición y añadir la clave de Docker:
$ sudo aptitude update
Para acabar, instalar Docker:
$ sudo aptitude install lxc-docker-1.9.1
También puedes encontrar el instalador directo para la distribución que necesites en la web oficial de Docker: https://docs.docker.com/engine/installation/#server
Ejecución
Siguiendo con la utilización de Docker sobre una distribución Ubuntu, para empezar a trabajar con Docker es necesario ejecutar el demonio de este, con permisos de administrador y se tienen que conocer los coomandos que podemos usar.
Para ejecutar el demonio Docker, ejecutaremos el comando:
$ docker -d &
Comandos básico
- attach: Adjunta a un contenedor corriendo
- add: Copia un archivo desde el hueste en el contenedor
- build: Construye un contenedor de un archivo Docker
- commit: Crea una nueva imagen de los cambios del contenedor
- cp: Copia archivos/carpetas de los contenedores del sistema de archivos a la ruta de hueste
- entrypoint: Ajusta el punto de entrada por defecto de la aplicación desde el contenedor
- env: Inicializa variables de entorno (por ejemplo, «clave=valor»)
- events: Obtiene acontecimientos en tiempo real desde el servidor
- export: Transmite el contenido de un contenedor como un archivo tar
- expose: Expone un puerto en el exterior
- from: Configura la imagen base para usar
- history: Muestra el historial de una imagen
- images: Lista las imágenes
- importe: Crea una nueva imagen del sistema de archivos de los contenidos a partir de un archivo tar
- load: Carga una imagen desde un archivo tar
- logs: Obtiene los registros de un contenedor
- mantenaint: Establece los datos de autor/propietario del archivo Dockerfile
- port: Busca el puerto público el cual está NATO-eado y lo hace privado (PRIVATE_PUERTO)
- ps: Lista los Contenedores
- pull: Descarga una imagen o un repositorio del servidor de registros Docker
- push: Empuja una imagen o un repositorio del servidor de registro Docker
- restart: Reinicia un contenedor en ejecución (corriendo)
- rm: Elimina uno o más contenedores
- rmi: Elimina una o más imágenes
- run: Ejecuta un comando en un contenedor
- save: Guarda una imagen en un archivo tar
- start: Inicia un contenedor detenido
- stop: Detiene un contenedor en ejecución (corriendo)
- tag: Etiqueta una imagen en un repositorio
- top: Busca los procesos en ejecución de un contenedor
- user: Establece el usuario para ejecutar los contenedores de la imagen
- volumen: Monta un directorio desde el hueste al contenedor
Ejecuciones básicas
Una vez conocidas los comandos principales ya se puede empezar a trabajar con Docker. A continuación las ejecuciones de comandos básicos para trabajar con contenedores:
- Listar contenedores:
$ docker ps
- Listar imágenes:
$ docker images
- Crear imágenes en Docker a partir de Dockerfiles:
$ docker build -t
- Crear un contenedor a partir de una imagen y acceder automáticamente a este:
$ docker run -it --name -p -d
- Crear una imagen con un link a otro contenedor:
$ docker run --name -p --link : -d
- Comprobar los links que tiene un contenedor:
$ docker inspect -f "{{ .HostConfig.Links }}"
- Iniciar contenedor, sin acceder a él:
$ docker start
- Parar contenedor:
$ docker stop
- Conectarnos al contenedor
$ docker attach
- Commit de un contenedor
$ docker commit
- Eliminar un contenedor
$ docker rm
- Eliminar una imagen
$ docker rm
Utilización
La utilización de Docker se amplía mucho y es muy extensa. Nos centraremos en detallar un ejemplo de creación de un entorno web a partir de WordPress y sobre un sistema operativo Debian. Para que el sistema web funcione independientemente otros sistemas, necesitaremos instalar un servicio MySQL y Apache.
Ejemplo de creación de un entorno web en un contenedor
Iniciamos Docker:
$ docker -d &
Descargamos imagen de un sistema operativo como por ejemplo Debian:
$ docker pull debian
Y a continuación ejecutamos el comado run para levantar un nuevo contenedor con la imagen Debian previamente descargada y al cual accederemos automáticamente:
$ docker run -y -t debian /bin/*bash
Una vez dentro, instalamos aquellos paquetes que nos facilitan el trabajo así como el paquetes necesarios para la configuración de Apache, PHP y de MySQL que necesitaremos para hacer funcionar nuestro WordPress:
$ apt-*get update && apt-*get install apache2 -y && apt-*get install wget -y && apt-*get install unzip -y && apt-*get install vim -y && apt-*get install mysql-*server -y && apt-*get install php5 php-*pear php5-*mysql php5-*gd -y
Ya podemos, preparar y descargar la última versión de WordPress:
$ cd /var/www/html/
$ wget https://wordpress.org/latest.zip
$ unzip latest.zip
$ chown -R www-data:www-data wordpress
Preparados ya el entorno procedemos a crear la base de datos necesaria para WordPress:
$ service mysql start // Levantamos servicio mysql $ mysql -u root -p // Accedemos a la consola de mysql con la clave creada para root mysql> CREATE DATABASE wordpress; mysql> GRANT ALL PRIVILEGES ON wordpress.* TO userdb@localhost IDENTIFIED BY 'password'; mysql> FLUSH PRIVILEGES; mysql> exit
Para acceder por web necesitaremos configurar el fichero de apache y por eso necesitamos saber la IP que tenemos asignada:
$ a2enmod proxy proxy_http // Configuración de proxy
$ ip a // Ver IP asignada
$ vim /etc/apache2/sites-enabled/nuevaweb.com.conf
Ejemplo de fichero de configuración de apache:
Imágen 2. Exemplo de configuración Virtual Host Apache.
Después de configurar el servicio apache, procederemos a reiniciarlo:
$ service apache2 restart
Y ya podemos acceder desde nuestro navegador a la instalación de WordPress introduciendo la IP del contenedor en el navegador, y acabar de configurar la base de datos de nuestro nuevo entorno web.
Cómo hemos visto este método nos permite tener un entorno con todos los servicios que necesitamos instalado, y el cual además podemos mover en forma de imagen a cualquiera otro sistema con la seguridad que se ejecutará sin problemas de versiones.
Conclusiones
La informática evoluciona cada día más rápidamente y cada vez implementa más funcionalidades que requieren de más trabajo y esfuerzo, tanto para mantenerlas cómo para desarrollarlas. Docker es una potente herramienta tanto para desarrolladores como para administradores de sistemas, que ha sido diseñada para el beneficio de estos en relación a los entornos donde se ejecutan las aplicaciones, procesos de despliegue, etc.
El trabajo con contenedores facilita y agiliza el trabajo así como permite el transporte de la información de manera ordenada sin porque esta se vea afectada por cambios de versiones y actualizaciones.
La plataforma Docker además presenta unas funcionalidades de seguridad para entornos en producción que son muy interesantes, así como la restricción de acceso por carpetas o las restricciones de acceso por puerto. Lo que nos permite un mayor control de la seguridad de nuestras aplicaciones.
En general podemos decir que Docker es una nueva tecnología que ha aparecido y se ha implantado con mucha fuerza y que seguramente será muy utilizada tanto por profesionales cómo para cualquier usuario con intención de construir nuevas aplicaciones.