¿Qué es?
En la página oficial del comando, http://docs.docker.com/compose/ indican lo siguiente:
Compose is a tool for defining and running multi-container Docker applications. With Compose, you use a YAML file to configure your application’s services. Then, with a single command, you create and start all the services from your configuration.
En pocas palabras, esta utilidad, nos permite desplegar desde un contenedor a x contenedores, sin tener que desplegar uno a uno cada contenedor, con sus puertos, volúmenes mapeados, etc.
Cómo ejemplo, os muestro el contenido de un fichero docker-compose.yml:
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: {}
Este docker compose, le indica a docker, lo siguiente:
Qué éste contenedor tiene una dependencia de base de datos
db:
Qué descargue, de no tener la imagen localmente, y despliegue un contenedor mysql:57
image: mysql:5.7
Qué este contenedor, se auto arranque siempre (fallo de host, reinicio del servicio docker, etc)
restart: always
Qué use las siguientes variables de entorno, para el contenedor de mysql:
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
Qué descargue, de no tener la imagen localmente, un contenedor wordpress, qué depende del contenedor de mysql
wordpress:
depends_on:
- db
image: wordpress:latest
Qué éste contenedor mapee el volumen db_data del host hacia la ruta /var/lib/mysql del contenedor
volumes:
- db_data:/var/lib/mysql
Qué el contenedor de wordpress, use públicamente el puerto 8000 e internamente el puerto 80
ports:
- "8000:80"
Qué este contenedor, se auto arranque siempre (fallo de host, reinicio del servicio docker, etc)
restart: always
Qué el contenedor de wordpress, use la siguiente configuración:
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
Y, finalmente, que mapee y use el volumen para mysql:
volumes:
db_data: {}
Un volumen, nos permite que los contenedores guarden siempre los datos, después de un reinicio o apagado, ya que de no tener un volumen, los datos desaparecen, dejando el contenedor tal como está en la imagen.
Después de todo este rollo, vamos a ver como descargarlo. Lá última versión en fecha 29/01/2019 es la 1.24.0-rc1. En la url http://github.com/docker/compose/releases siempre encontraréis está versión, como las futuras y anteriores.
Lo descargamos con los siguientes comandos:
curl -L "http://github.com/docker/compose/releases/download/1.24.0-rc1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Damos permisos de ejecución, con este otro comando
chmod +x /usr/local/bin/docker-compose
Y para usarlo, creamos el fichero docker-compose.yml y ejecutamos, desde la ruta donde tengamos este fichero, el siguiente comando:
docker-compose up
Veremos, qué primero, descarga la imagen de mysql:57, luego que descarga la imagen de wordpress
Una vez descargado, crea los contenedores, conecta estos, tal como le indicamos en el fichero docker-compose.yml, y arranca la base de datos y wordpress.
Aparecen errores 2002 de mysql!!!!
Sí, es normal, está configurando la base de datos ;P
Ahora sí que está operativa la base de datos y apache arrancado
Vemos que los contenedores están corriendo, y sólo el contenedor de wordpress es accesible públicamente, desde el puerto 8000
Esa captura, es de portainer (http://www.portainer.io/) , qué lo explico en el siguiente post
Si accedemos a la ip del servidor de docker, por el puerto 8000, lo vemos funcionando:
2 comentarios