Docker es una plataforma de código abierto que facilita el desarrollo, el envío y la implementación de aplicaciones. Empaqueta todas las dependencias de una aplicación en un llamado contenedor y lo ejecuta como un entorno aislado. Para obtener más información sobre Docker, lea Introducción a Docker .
En un escenario típico, se necesitarán varios servicios para admitir una aplicación, como una base de datos, equilibrio de carga, etc. En este artículo, veremos cómo Docker Compose nos ayuda a configurar varios servicios.
También veremos un ejemplo de cómo instalar y usar Docker Compose.
Comencemos explicando brevemente algunos conceptos básicos.
Contenedor Docker
Un contenedor docker es un sistema ligero basado en Linux que empaqueta todas las bibliotecas y dependencias de una aplicación, precompiladas y listas para ejecutarse. Es una imagen en ejecución aislada que hace que la aplicación se sienta como si todo el sistema estuviera dedicado a ella.
Muchas organizaciones grandes se están moviendo hacia contenedores de máquinas virtuales, ya que son livianos y fáciles de usar y mantener.
Pero cuando se trata de usar contenedores para aplicaciones del mundo real, generalmente un contenedor no es suficiente. Por ejemplo, supongamos que Netflix usa una arquitectura de microservicios. Luego necesita servicios de autenticación, inicio de sesión, base de datos, pago, etc. y para cada uno de estos servicios queremos ejecutar un contenedor separado.
Se prefiere que un contenedor tenga un solo propósito.
Ahora, imagine escribir archivos acoplables separados, administrar la configuración y las redes para cada contenedor. Aquí es donde Docker compose entra en escena y nos facilita la vida.
Componer ventana acoplable
Para comprender mejor qué es una composición docker, debemos comenzar con por qué.
¿Por qué Docker Compose?
Como se discutió anteriormente, una aplicación del mundo real tiene un contenedor separado para cada uno de sus servicios. Y sabemos que cada contenedor necesita tener un Dockerfile. Significa que tendremos que escribir cientos de archivos acoplables y luego administrar todo lo relacionado con los contenedores individualmente, eso es engorroso.
Por lo tanto, usamos docker compose, que es una herramienta que ayuda en la definición y ejecución de aplicaciones de contenedores múltiples. Con docker compose usamos un solo archivo YAML para cada configuración y solo comandos únicos para iniciar y detener todos los servicios.
Si está utilizando una imagen personalizada, deberá definir sus configuraciones en un Dockerfile separado en contraste con el uso de una imagen prediseñada de Docker Hub , que puede definir con el archivo docker-compose.yaml .
Estas son las características que admite docker componen:
- Todos los servicios están aislados y se ejecutan en un solo host.
- Los contenedores se recrean solo cuando hay algún cambio.
- Los datos del volumen no se restablecen al crear nuevos contenedores, los volúmenes se conservan.
- Movimiento de variables y composición dentro de ambientes.
- Crea una red virtual para facilitar la interacción dentro de los entornos.
Ahora, veamos cómo podemos usar docker compose, usando un proyecto simple.
Un proyecto sencillo
En este proyecto, crearemos una API Restfull sencilla que devolverá una lista de frutas. Usaremos matraz para este propósito. Y una aplicación PHP solicitará este servicio y lo mostrará en el navegador. Ambos servicios se ejecutarán en sus propios contenedores.
- Primero, cree un directorio separado para nuestro proyecto completo. Utilice el siguiente comando.
mkdir dockerComposeProject
- Mover dentro del directorio.
cd dockerComposeProject
la API
crearemos una imagen personalizada que usará python para servir nuestra API Restful definida a continuación. Luego, el servicio se configurará aún más utilizando un Dockerfile.
- Luego crea un subdirectorio para el servicio al que llamaremos producto. y pasar a lo mismo.
mkdir product cd product
api.py
Python3
from flask import Flask from flask_restful import Resource, Api # create a flask object app = Flask(__name__) api = Api(app) # creating a class for Fruits that will hold # the accessors class Fruits(Resource): def get(self): # returns a dictionary with fruits return { 'fruits:': ['Mango', 'Pomegranate', 'Orange', 'Litchi'] } # adds the resources at the root route api.add_resource(Fruits, '/') # if this file is being executed then run the service if __name__ == '__main__': # run the service app.run(host='0.0.0.0', port=80, debug=True)
- Cree un Dockerfile para definir el contenedor en el que se ejecutará la API anterior.
El Dockerfile:
FROM python:3-onbuild COPY . /usr/src/app CMD ["python", "api.py"
Explicación :
FROM acepta un nombre de imagen y una versión que la ventana acoplable descargará desde el concentrador de la ventana acoplable. El comando Copiar se usa para copiar el contenido del directorio de trabajo actual a la ubicación desde donde el servidor espera que esté el código. Y el comando CMD acepta una lista de comandos que se ejecutarán una vez que se inicie el contenedor, que finalmente iniciará el servicio.
Un contenedor separado para el sitio web.
Creemos un sitio web simple usando PHP que usará nuestra API.
- Vaya al directorio principal y cree otro subdirectorio para el sitio web.
cd .. mkdir website cd website
índice.php
PHP
<!DOCTYPE html> <html lang="en"> <head> <title>Fruit Service</title> </head> <body> <h1>Welcome to India's Fruit Shop</h1> <ul> <?php $json = file_get_contents('http://fruit-service'); $obj = json_decode($json); $fruits = $obj->fruits; foreach ($fruits as $fruit){ echo "<li> $fruit </li>"; } ?> </ul> </body> </html>
- Ahora cree un archivo de redacción donde definiremos y configuraremos los dos servicios, la API y el sitio web.
- Salga del subdirectorio del sitio web usando el siguiente código.
cd ..
Y luego crea el siguiente archivo.
docker-compose.yaml
version: "3" services: fruit-service: build: ./dockerProject volumes: - ./dockerProject:/usr/src/app ports: - 5001:80 website: image: php:apache volumes: - ./website:/var/www/html ports: - 5000:80 depends_on: - fruit-service
Explicación:
La primera línea es opcional donde especificamos la versión de la herramienta docker-compose. Siguientes servicios define una lista de servicios que nuestra aplicación va a utilizar. El primer servicio es el servicio de frutas que es nuestra API y el segundo es nuestro sitio web. El servicio de frutas tiene una construcción de propiedad que contiene el archivo acoplable que se va a construir y creó una imagen. Los volúmenes definen la asignación de almacenamiento entre el host y el contenedor para que podamos realizar cambios en vivo. Finalmente, la propiedad del puerto expone el puerto 80 de los contenedores a través del 5001 del host.
El servicio del sitio web no usa una imagen personalizada, pero descargamos la imagen de PHP desde Docker Hub y luego asignamos la carpeta de sitios web que contiene nuestro index.php a /var/www/html (PHP espera que el código esté en esta ubicación). Los puertos exponen el puerto de contenedores. Finalmente, depende_en especifica todos los servicios de los que depende el servicio actual.
- La estructura de carpetas después de crear todos los archivos y directorios requeridos será la siguiente:
- Para iniciar la aplicación, ingrese el siguiente comando.
docker-compose up
Ahora todos los servicios se iniciarán y nuestro sitio web estará listo para ser utilizado en localhost:5000 .
- Abra su navegador e ingrese localhost:5000 .
Producción:
- Para detener la aplicación, presione CTRL + C o
docker-compose stop
Conclusión:
En este artículo, aprendimos sobre Docker Compose, por qué y cuándo usarlo. Y demostró su uso a través de un proyecto simple.