logoImagina

Qué es Docker Compose y cómo utilizarlo, Tutorial Completo

iconImage
Publicado 2023-06-29
Actualizado el 2024-02-26

¿Qué es Docker Compose?

Docker Compose es una herramienta versátil que te permite definir y gestionar aplicaciones multi-contenedor de forma sencilla. Con Docker Compose, puedes describir la configuración de tu entorno de desarrollo en un archivo YAML, especificando los servicios, volúmenes y redes necesarios para tu aplicación. Luego, con un solo comando, puedes crear y ejecutar todos los contenedores definidos en tu archivo de configuración.

Puedes consultar más información en la página de nuestro curso de Docker y Docker Compose.

¿Cuál es la diferencia entre Docker y Docker Compose?

Docker es una plataforma de contenedores que te permite empaquetar y distribuir aplicaciones en entornos aislados llamados contenedores. Proporciona una forma eficiente y consistente de ejecutar aplicaciones en diferentes sistemas operativos. Por otro lado, Docker Compose es una herramienta que complementa a Docker, permitiéndote definir y orquestar múltiples contenedores para crear un entorno de desarrollo completo.

Mientras que Docker se centra en la creación y ejecución de contenedores individuales, Docker Compose se encarga de coordinar y gestionar múltiples contenedores que trabajan juntos para formar una aplicación.

¿Cuál es la diferencia entre Docker Compose y Kubernetes?

Aunque tanto Docker Compose como Kubernetes son herramientas de orquestación de contenedores, hay algunas diferencias clave entre ellas. Docker Compose es más adecuado para entornos de desarrollo y pruebas, donde se requiere una configuración rápida y sencilla de múltiples contenedores. Proporciona una experiencia de desarrollo fluida al permitirte definir y gestionar fácilmente un entorno local de desarrollo con varios servicios.

Kubernetes, por otro lado, es una plataforma más robusta y escalable diseñada para desplegar y gestionar aplicaciones en producción a gran escala. Ofrece características avanzadas de orquestación, como la gestión de clústeres, el balanceo de carga y la autoescalabilidad, lo que lo hace ideal para entornos de producción complejos y de alto rendimiento.

¿Cuándo usar Docker Compose? ¿Por qué usar Docker Compose en vez de Docker?

Docker Compose es especialmente útil cuando necesitas configurar un entorno de desarrollo que involucra múltiples servicios o contenedores. Te permite definir la estructura de tu aplicación y sus dependencias en un solo archivo YAML, simplificando la creación y gestión de tu entorno de desarrollo.

Al utilizar Docker Compose en lugar de Docker solo, obtienes beneficios como la capacidad de definir volúmenes y redes personalizadas, la posibilidad de escalar servicios y la facilidad de compartir y replicar tu entorno de desarrollo con otros miembros del equipo. Docker Compose ofrece una solución más completa y eficiente para configurar y orquestar aplicaciones multi-contenedor en tu entorno de desarrollo.

¿Qué se necesita para utilizar Docker Compose?

Para utilizar Docker Compose, necesitarás tener instalado Docker en tu máquina. Docker Compose viene incluido como parte del paquete de instalación de Docker, por lo que no es necesario instalarlo por separado. Asegúrate de tener una versión compatible de Docker según tu sistema operativo. De todas formas, en el siguiente apartado revisaremos su instalación y la verificaremos.

Además, necesitarás un archivo de configuración docker-compose.yml en el directorio de tu proyecto. Este archivo es donde definirás los servicios, volúmenes y redes necesarios para tu entorno de desarrollo. Puedes crearlo desde cero o utilizar plantillas y ejemplos disponibles en la documentación de Docker Compose y en la comunidad de Docker. A continuación hablaremos más sobre este archivo.

Cómo instalar Docker Compose

A continuación, te mostraré cómo instalar Docker Compose en diferentes sistemas operativos:

Instalar Docker Compose en Windows

Para instalar Docker Compose en Windows, sigue estos pasos:

  1. Abre tu navegador web y visita el sitio web oficial de Docker.
  2. Descarga el instalador de Docker Desktop para Windows y ejecútalo.
  3. Sigue las instrucciones del instalador para completar la instalación de Docker Desktop en tu máquina.
  4. Una vez que la instalación haya finalizado, abre una ventana de línea de comandos (Command Prompt) o PowerShell.
  5. Ejecuta el siguiente comando para verificar que Docker Compose se haya instalado correctamente: bash docker-compose --version Si el comando muestra la versión de Docker Compose instalada, ¡felicidades! Docker Compose está listo para su uso en tu sistema Windows.

Instalar Docker Compose en Linux

Para instalar Docker Compose en Linux, sigue estos pasos:

  1. Abre una terminal en tu sistema Linux.
  2. Ejecuta el siguiente comando para descargar la última versión estable de Docker Compose: bash sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  3. Asigna permisos de ejecución al archivo descargado: bash sudo chmod +x /usr/local/bin/docker-compose
  4. Verifica que la instalación haya sido exitosa ejecutando el siguiente comando: bash docker-compose --version Si el comando muestra la versión de Docker Compose instalada, la instalación ha sido exitosa.

Instalar Docker Compose en MacOS

Para instalar Docker Compose en MacOS, sigue estos pasos:

  1. Abre un terminal en tu sistema MacOS.
  2. Ejecuta el siguiente comando para descargar la última versión estable de Docker Compose: bash sudo curl -L "https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  3. Asigna permisos de ejecución al archivo descargado: bash sudo chmod +x /usr/local/bin/docker-compose
  4. Verifica que la instalación haya sido exitosa ejecutando el siguiente comando: bash docker-compose --version Si el comando muestra la versión de Docker Compose instalada, la instalación ha sido exitosa.

Creación del archivo de configuración

El primer paso para configurar un entorno de desarrollo con Docker Compose es crear el archivo de configuración docker-compose.yml. Este archivo define los servicios, contenedores, redes y volúmenes necesarios para tu aplicación. Veamos cómo se estructura este archivo y qué elementos debemos incluir.

Estructura básica del archivo docker-compose.yml

El archivo docker-compose.yml se define en formato YAML y sigue una estructura básica. A continuación se muestra un ejemplo de estructura básica:

version: '3.8'

services:
  service1:
    # Configuración del servicio 1

  service2:
    # Configuración del servicio 2

networks:
  network1:
    # Configuración de la red 1

volumes:
  volume1:
    # Configuración del volumen 1

En este ejemplo, tenemos una versión específica de Docker Compose definida (version: '3.8'). Luego, se definen los servicios, las redes y los volúmenes necesarios para nuestra aplicación.

Definición de servicios y contenedores necesarios

Dentro de la sección services del archivo docker-compose.yml, podemos definir los diferentes servicios y contenedores que formarán parte de nuestro entorno de desarrollo. Cada servicio se define con un nombre único y se especifica su configuración. A continuación, se muestra un ejemplo de definición de servicios:

services:
  service1:
    image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - ./app:/usr/share/nginx/html

  service2:
    image: mysql:latest
    environment:
      - MYSQL_ROOT_PASSWORD=password
      - MYSQL_DATABASE=mydb

En este ejemplo, hemos definido dos servicios: service1 y service2. El service1 utiliza la imagen de Nginx más reciente, mapea el puerto 8080 de la máquina anfitriona al puerto 80 del contenedor y monta el directorio ./app en el directorio /usr/share/nginx/html del contenedor. El service2 utiliza la imagen de MySQL más reciente y define variables de entorno para la contraseña de root y el nombre de la base de datos.

Parámetros y opciones comunes en Docker Compose

En el archivo docker-compose.yml, podemos utilizar varios parámetros y opciones para configurar nuestros servicios y contenedores. Algunos ejemplos comunes incluyen:

  • image: especifica la imagen del contenedor a utilizar.
  • ports: mapea los puertos del contenedor a puertos de la máquina anfitriona.
  • volumes: monta volúmenes o directorios del sistema de archivos en el contenedor.
  • environment: define variables de entorno para el contenedor.
  • depends_on: especifica las dependencias entre servicios.

Configuración de servicios y redes

Una vez que hayamos creado el archivo docker-compose.yml y definido nuestros servicios y contenedores, podemos proceder a configurar aspectos adicionales como enlaces entre contenedores y la creación de redes personalizadas.

Configuración de cada servicio en el archivo docker-compose.yml

Dentro de cada definición de servicio en el archivo docker-compose.yml, podemos incluir configuraciones específicas para ese servicio. Esto nos permite ajustar parámetros como puertos, volúmenes, variables de entorno y más. A continuación, se muestra un ejemplo de configuración específica para un servicio:

services:
  service1:
    image: nginx:latest
    ports:
      - 8080:80
    volumes:
      - ./app:/usr/share/nginx/html
    environment:
      - ENVIRONMENT=development

En este ejemplo, hemos añadido una variable de entorno ENVIRONMENT con el valor development al servicio service1.

Enlaces y dependencias entre contenedores

En Docker Compose, podemos establecer enlaces entre servicios para permitir la comunicación entre ellos. Esto se logra mediante la sección links dentro de la definición de un servicio. También podemos especificar dependencias entre servicios utilizando el parámetro depends_on. A continuación, se muestra un ejemplo de enlaces y dependencias entre servicios:

services:
  frontend:
    build: ./frontend
    ports:
      - 3000:3000
    depends_on:
      - backend

  backend:
    build: ./backend
    ports:
      - 8080:8080

En este ejemplo, el servicio frontend depende del servicio backend, lo que significa que Docker Compose garantizará que el servicio backend esté en funcionamiento antes de iniciar el servicio frontend.

Creación y configuración de redes en Docker Compose

Docker Compose nos permite crear y configurar redes personalizadas para nuestros servicios y contenedores. Esto nos brinda mayor control sobre la comunicación y la conectividad de nuestra aplicación. A continuación, se muestra un ejemplo de creación y configuración de redes en Docker Compose:

services:
  frontend:
    build: ./frontend
    ports:
      - 3000:3000
    networks:
      - frontend_network

  backend:
    build: ./backend
    ports:
      - 8080:8080
    networks:
      - backend_network

networks:
  frontend_network:
    driver: bridge

  backend_network:
    driver: bridge

En este ejemplo, hemos definido dos redes personalizadas: frontend_network y backend_network. Los servicios frontend y backend están conectados a sus respectivas redes. Esto permite una comunicación controlada entre los servicios dentro de las redes específicas.

Con esta configuración, has completado la configuración básica de servicios y redes en Docker Compose. En el siguiente paso, podrás comenzar a construir y ejecutar tu entorno de desarrollo utilizando los comandos adecuados.

Gestión de volúmenes en Docker Compose

En Docker Compose, podemos gestionar volúmenes para mantener y compartir datos entre contenedores y el host. Los volúmenes nos permiten persistir datos y asegurar que no se pierdan al detener o reiniciar los contenedores. A continuación, exploraremos cómo trabajar con volúmenes en Docker Compose.

Creación de volúmenes en Docker Compose

Para crear un volumen en Docker Compose, podemos utilizar la sección volumes en nuestro archivo docker-compose.yml. A continuación se muestra un ejemplo de cómo definir un volumen:

services:
  service1:
    volumes:
      - my_volume:/path/to/mount

En este ejemplo, hemos creado un volumen llamado my_volume y lo hemos vinculado al directorio /path/to/mount en el contenedor del servicio service1.

Uso de volúmenes preexistentes

En ocasiones, podemos necesitar utilizar volúmenes preexistentes en Docker Compose. Para lograrlo, podemos especificar el nombre del volumen preexistente en lugar de crear uno nuevo. A continuación se muestra un ejemplo:

services:
  service1:
    volumes:
      - existing_volume:/path/to/mount

En este caso, hemos utilizado el volumen existing_volume en lugar de crear uno nuevo. Esto nos permite acceder a los datos existentes en ese volumen.

Compartir volúmenes con el host

Docker Compose también nos permite compartir volúmenes con el host, lo que facilita el acceso y la edición de los datos desde fuera de los contenedores. Para lograrlo, podemos utilizar la sintaxis ruta_en_host:ruta_en_contenedor. A continuación se muestra un ejemplo:

services:
  service1:
    volumes:
      - /ruta/en/el/host:/ruta/en/el/contenedor

En este ejemplo, hemos vinculado la ruta /ruta/en/el/host en el host con la ruta /ruta/en/el/contenedor en el contenedor del servicio service1.

Con la gestión de volúmenes en Docker Compose, podemos mantener y compartir datos entre contenedores y el host de manera eficiente.

Despliegue y gestión del entorno

Una vez que hayamos definido nuestro entorno de desarrollo en Docker Compose, podemos utilizar diferentes comandos para construir, desplegar y administrar los contenedores.

Construcción y despliegue de los contenedores definidos

Para construir y desplegar los contenedores definidos en el archivo docker-compose.yml, podemos utilizar el comando docker-compose up. Este comando se encargará de crear y ejecutar los contenedores según las configuraciones especificadas. A continuación se muestra cómo utilizar el comando:

docker-compose up

Durante el proceso, veremos la salida de los contenedores en la terminal, lo que nos permitirá monitorear su estado y detectar posibles errores.

Comandos básicos para administrar y monitorizar el entorno de desarrollo

Docker Compose proporciona una serie de comandos para administrar y monitorizar el entorno de desarrollo. Algunos de los comandos más comunes incluyen:

  • docker-compose start: inicia los contenedores existentes en el archivo docker-compose.yml.
  • docker-compose stop: detiene los contenedores existentes en el archivo docker-compose.yml.
  • docker-compose restart: reinicia los contenedores existentes en el archivo docker-compose.yml.
  • docker-compose ps: muestra el estado de los contenedores definidos en el archivo docker-compose.yml.
  • docker-compose logs: muestra los logs de los contenedores definidos en el archivo docker-compose.yml.

Estos comandos nos permiten controlar y supervisar el entorno de desarrollo de manera eficiente.

Escalado de servicios

En Docker Compose, podemos escalar servicios para aumentar la cantidad de contenedores que se ejecutan para un servicio específico. Esto nos permite distribuir la carga de trabajo y mejorar el rendimiento de nuestra aplicación. Para escalar un servicio, podemos utilizar el comando docker-compose up junto con la opción --scale. A continuación se muestra un ejemplo:

docker-compose up --scale servicio=n

En este ejemplo, servicio representa el nombre del servicio que deseamos escalar y n representa la cantidad de contenedores que queremos ejecutar para ese servicio.

El escalado de servicios en Docker Compose es útil cuando necesitamos aumentar la capacidad de nuestra aplicación para manejar más solicitudes o procesar tareas en paralelo.

Importancia de usar Docker Compose

En resumen, Docker Compose es una herramienta esencial para configurar y gestionar entornos de desarrollo con contenedores de manera eficiente. Ofrece opciones para definir servicios, gestionar volúmenes, redes y escalar aplicaciones.

Si deseas adquirir habilidades sólidas en Docker y Docker Compose, te recomendamos nuestro curso de Docker y Docker Compose, donde aprenderás desde los conceptos básicos hasta técnicas avanzadas para maximizar el potencial de estas tecnologías. ¡Inscríbete ahora y lleva tu desarrollo al siguiente nivel!

iconClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClienticonClient