/ HOWTO

Aprendiendo a utilizar Docker Compose

Docker Compose es una herramienta que permite simplificar el uso de Docker, generando scripts que facilitan el diseño y la construcción de servicios. Aquí resumimos algunos tips.

Con Docker Compose puedes crear diferentes contenedores y al mismo tiempo, en cada contenedor, diferentes servicios.

En vez de utilizar una serie de comandos bash y scripts, Docker Compose implementa recetas similares a las de Ansible, para poder instruir al engine a realizar tareas, programaticamente.

¿Cómo instalarlo?

En Windows, Mac y Linux, los pasos son diferentes

Mac OS: Ya viene instalado dentro de Docker for Mac. Con solo instalar Docker for Mac es suficiente.

Linux:

sudo curl -L https://github.com/docker/compose/releases/download/1.17.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

luego le damos permisos de ejecución:

sudo chmod +x /usr/local/bin/docker-compose

y listo! El siguiente comando te permitirá que todo está instalado correctamente.

docker-compose --version
docker-compose version 1.17.0, build 1719ceb

¿Cómo usarlo?

Aquí viene lo mejor. Una vez aprendidos los comandos principales, es muy fácil crear templates y levantar diferentes contenedores para dar servicio a aplicaciones multiservicio.

Supongamos que quisieramos rapidamente, montar un container con Jekyll, para poder producir este sitio.

Jekyll es un generador de contenido estático hecho en Ruby. Jekyll esta basado en Ruby y requiere una cantidad de Gemas como parte de su instalación.

Gestionar Ruby no es tan standard, y muchas veces requiere que usemos RVM o RBENV como manejadores de versiones de Ruby. También las Gemas deben ser siempre cierta version en particular.

Para simplificar esto, construiremos una receta de Docker-Compose que nos permita armar un contenedor con Ruby 2.4.1, instalar todas las gemas necesarias, y ademas habilitar la funcionalidad LiveReload para generar el sitio automaticamente.

Paso 0: Instalamos Jekyll localmente

Creamos una carpeta de proyecto ./site.

Es necesario instalarlo en localmente, para poder crear el sitio por primera vez. El host (o tu ordenador de desarrollo) debe tener Ruby 2.1 instalado.

gem install bundler
gem install jekyll
jekyll new site

Paso 1: Creamos un Dockerfile.

El DockerFile nos permitirá definir las funciones basicas del contenedor. Debemos crearlo dentro de la carpeta site, junto con el source del sitio en Jekyll.

FROM ruby:2.4-alpine
RUN apk update && apk add build-base nodejs tzdata

RUN mkdir /app
WORKDIR /app

COPY Gemfile Gemfile.lock ./
RUN gem install bundler
RUN bundle install --binstubs

COPY . .
  • FROM indica que Docker debe utilizar una receta de Ruby 2.4 preparada para la distribución Alpine Linux. Esta receta la obtendrá de Docker Hub. La version Alpine de linux contiene recetas de imagenes Docker que ocupan muy poco espacio y memoria. Para aplicaciones sencillas, donde el uso de Ruby no es extremo, es mas que suficiente.

  • El resto del Dockerfile, lo que hace es crear un directorio para la aplicación en el contenedor (/app), copiar allí el codigo de Jekyll de nuestro sitio, e instalar todas las RubyGems necesarias (con el comnado bundle install).

De este modo, el contenedor, en la carpeta /app, tendrá el sitio Jekyll instalado, junto con sus gemas, todo en Ruby 2.4

  • Importante: Todo Dockerfile debe terminar en un comando CMD o en un ENTRYPOINT, pero en este caso, no lo utilizamos, ya que lanzaremos un comando directamente desde la receta de Docker Compose. Es decir, este Dockerfile se utiliza solamente para construir el contenedor y configurarlo. No es autoejecutable.

Paso 2: Creamos un docker-compose.yml

Docker Compose, por defecto, busca instrucciones en el archivo docker-compose.yml.

Ejemplo:

version: '3'

services:
  jekyll:
    build: .
    command: bundle exec jekyll serve --incremental --host 0.0.0.0
    ports:
      - "4000:4000" # jekyll serve
    volumes:
      - .:/app
  • “version ‘3’: Los archivos docker-compose.yml son versionados, lo que significa que es muy importante indicar la version de las instrucciones que queremos darle. A medida de que Docker evoluciona, habrá nuevas versiones, pero de todos modos, siempre hay compatabilidad hacia atras, al indicar la version de la receta.

  • “jekyll”: Indica el nombre del servicio. Podria ser cualquier nombre. La idea es que el nombre indique el tipo de servicio que estamos construyendo. Ej: MySQL, FrontEndNGINX, etc.

  • “build .”: Se utiliza para indicar donde está el Dockerfile que queremos utilizar para crear el contenedor. Al poner “.” automaticamente considerará el Dockerfile existene en directorio actual.

  • “command”: Una vez creado el contenedor, aqui lanzamos el comando que permite ejecutar Jekyll, en modo servidor. El comando “–host 0.0.0.0” sive para mapear el contenedor al sistema operativo host (el cual estamos utilzando para desarrollar).

  • “ports”: Aqui mapeamos los puertos locales 4000 (webserver jekyll) y 35729 (livereload) al servidor host. Esto permitirá que accediendo a Localhost:4000 podamos probar el sitio generador por Jekyll

  • “volumes”: Aqui hacemos que el directorio actual se mapee directamente con el /app, lugar donde hemos creado la aplicación. De este modo, cualquier cambio en el directorio local en el host, se hará de inmediato en el contenedor.

Luego, con el comando docker-compose up, le damos instrucciones a Docker para que cree el contenedor, segun Dockerfile y lo ejecute, con el comando en el Docker-Compose.

Algunas consideraciones:

  • docker-compose up: da instrucciones a Docker para crear el contendor, y ejecutarlo segun docker-compose.yml

  • docker-compose down: apaga todo los servicios que levantó con docker-compose up.

  • *docker-compose ps *: permite ver los contenedores funcionando.

  • docker-compose exec: permite ejecutar un comando a uno de los servicios levantados de Docker-compose.

Por ultimo, accede con tu browser a http://localhost:4000 para poder ver su sitio dentro del contenedor Docker.

Subscríbete y recibirás los últimos artículos semanalmente en tu email.

pcorral

Pablo Corral

Hacker mindset, dad and savy inlineskater. Me encanta le tecnología y hacer cosas.

Read More