/ HOWTO

Aprendiendo a utilizar Docker Compose


Docker Compose es una herramienta que permite simplificar el uso de Docker. A partir de archivos YAML es mas sencillo crear contendores, conectarlos, habilitar puertos, volumenes, etc. Aquí resumimos algunos tips.

Con Compose puedes crear diferentes contenedores y al mismo tiempo, en cada contenedor, diferentes servicios, unirlos a un volúmen común, iniciarlos y apagarlos, etc. Es un componente fundamental para poder construir aplicaciones y microservicios.

En vez de utilizar Docker via una serie inmemorizable de comandos bash y scripts, Docker Compose te permite mediante archivos YAML para poder instruir al Docker Engine a realizar tareas, programaticamente. Y esta es la clave, la facilidad para dar una serie de instrucciones, y luego repetirlas en diferentes ambientes.

¿Cómo instalar Docker Compose?

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:

Instalar la version Stable.

Hay otras versiones de Docker Compose, aunque preferimos la stable siempre.

sudo curl -L "https://github.com/docker/compose/releases/download/1.26.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 por último, verificar de que todo funciona:

docker-compose -v
docker-compose version 1.26.0, build d4451659

¿Cómo usar Docker Compose?

¡Aquí viene lo mejor!. Una vez aprendidos los comandos principales, es muy fácil crear recetas y levantar diferentes contenedores, coordinadamente.

Escenario: Crear un contenedor con Jekyll

Supongamos que quisieramos crear un container con Jekyll, para poder producir este sitio consistentemente. El contenedor deberia tener la version correcta de Ruby, y todas las gemas que necesita Jekyll, independientemente de lo que haya instalado en el host.

Jekyll es un generador de contenido estático hecho en Ruby. Requiere una cantidad de gemas importante como parte de su instalación.

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

Para simplificar, construiremos una receta de Docker Compose que nos permita armar un contenedor con Ruby (2.4.1=, instalar todas las gemas necesarias, y además 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. Para aplicaciones sencillas, donde el uso de Ruby no es extremo, es mas que suficiente y recomendable.

  • 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 gemas necesarias (con el comando “bundle install”).

De este modo, el contenedor incluirá en la carpeta /app, el sitio Jekyll instalado, junto con sus gemas, todo en Ruby 2.4 (version alpine)

  • 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 definier “.” automaticamente considerará el Dockerfile existente 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.

  • 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, una vez que el contenedor está ejecutando, accede con tu browser a http://localhost:4000 para poder ver su sitio dentro del contenedor Docker.

Resumen

Un paso a paso de como instalar Docker Compose en este video:

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