In uno de los artículos anteriores, exploramos el proceso de ejecutar un Docker contenedor a partir de una imagen. DockerEl concepto principal de gira en torno a que cada proceso individual tenga su propio contenedor dedicado con el entorno necesario adaptado a sus necesidades específicas. Sin embargo, cuando se trata de aplicaciones complejas, surge un desafío.
Considere una aplicación web que requiere una base de datos, un servidor web y, potencialmente, un intérprete PHP. Esto ya implica la gestión de tres contenedores separados y resulta incómodo configurarlos y ejecutarlos manualmente de forma individual. Para solucionar este problema, se introdujo la utilidad "docker-compose". Permite la gestión de grupos de contenedores, facilitando su creación, configuración y eliminación con un solo comando. Este tutorial tiene como objetivo presentar Docker Para principiantes, centrándose en el uso práctico de docker-compose.
Docker-componer configuración
En primer lugar, debes instalar el conjunto de paquetes 'base':
apt-get update && apt-get install -y ca-certificates curl gnupg && sudo install -m 0755 -d /etc/apt/keyrings && curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg && chmod a+r /etc/apt/keyrings/docker.gpg
echo \ "deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \ "$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \ sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt-get update && apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y
El proceso adicional es muy simple, basta con descargar el archivo precompilado:
curl -L "https://github.com/docker/compose/releases/download/1.27.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
Luego conceda permisos de ejecución:
chmod +x /usr/local/bin/docker-compose
Luego, verifique la versión del paquete:
docker-compose --version
Creando un proyecto
Si ha trabajado o visto proyectos utilizando DockerEs posible que hayas notado que en la carpeta del proyecto hay un archivo docker-compose ".yaml". En este archivo se configuran los contenedores que se deben crear para tu proyecto. Se crearán automáticamente mediante docker-compose. El archivo utiliza la sintaxis YAML y debe contener los siguientes datos:
version: 'file_version'
networks: 'used_networks'
volumes: 'used_storages'
services: 'used_containers'La versión indica la versión de sintaxis del archivo, diferentes versiones tienen diferentes palabras clave disponibles, lo cual se hace por compatibilidad con versiones anteriores. Usaremos la versión 3.5. A continuación, debemos enumerar los volúmenes, las redes y los propios contenedores.
La sintaxis de YAML es similar a JSON, hay pares clave-valor separados por dos puntos, pero aquí el valor puede estar completamente vacío, puede contener otras claves y también puede ser una matriz de valores, en cuyo caso cada elemento de la matriz comienza con un estrellarse "-". Pero a diferencia de JSON, la sangría aquí es muy importante para mostrar el anidamiento de valores, así que no te los pierdas.
Creemos una carpeta llamada 'serverspace-docker' y creemos un archivo llamado 'docker-compose.yaml' dentro de ella:
mkdir /opt/serverspace-docker && nano /opt/docker-compose.yamlY pon este código dentro:
version: '3.5'
services: docker-nginx: image: nginx 
Basta con ejecutar el contenedor.
Contenedores en ejecución
Para iniciar un grupo de contenedores configurados en docker-compose.yaml, debe navegar a la carpeta donde se encuentra este archivo de configuración y ejecutar el comando docker-componer allí. Por ejemplo:
cd /opt/serverspace-docker/
docker-compose up
Después de eso, se lanzarán los contenedores, sus flujos de salida se fusionarán en uno y verá información en la terminal. Para detener los contenedores, simplemente presione Ctrl+C. Si desea ejecutar los contenedores en segundo plano, utilice el -d :
docker-compose up -d
Para detener la ejecución de contenedores en segundo plano, puede utilizar el Detener docker-compose mando:

El docker-compose abajo El comando no solo detiene todos los contenedores en ejecución sino que también los elimina:

Reenvío de puertos de contenedores
El contenedor está funcionando, pero de momento nos sirve de poco. Con Docker, podemos reenviar el puerto 80 del contenedor al sistema operativo host y obtener acceso a él. Para hacer esto, use el 'puertos'directiva. La sintaxis es la siguiente:
ports:
- external_port:internal_portEntonces, reenviemos el puerto 80 al 8098.

Como resultado podemos abrir nginx en el puerto 'externo':

Carpetas de montaje
Para montar almacenamiento externo o carpetas de host en el contenedor, se utiliza la sección "volúmenes". La sintaxis es muy similar a trabajar con puertos:
volumes:
- /path/to/external/folder:/path/to/internal/folderCreemos un archivo llamado "index.html" en la carpeta del proyecto actual y montemos esta carpeta en lugar de la carpeta "/usr/share/nginx/html/" del contenedor:
echo "You're the best!" > index.html
Y agregue la directiva de montaje de carpeta al archivo docker-compose:

Después de reiniciar el contenedor, verá su propia página en el navegador.

Configurar volúmenes
Podemos montar no sólo carpetas externas sino también volúmenes creados en Docker al contenedor. Para ello, primero debe agregar el volumen a la sección principal de "volúmenes". Por ejemplo, "serverspace-vl". La mayoría de las aplicaciones web requieren una base de datos, como MySQL. Agreguemos otro contenedor para esta base de datos y agreguemosle nuestro volumen. El volumen se agrega de la misma manera que una carpeta externa, excepto que en lugar de una carpeta, se especifica el nombre del volumen. agreguemos MySQL a nuestra configuración:
docker-mysql:
image: mysql
volumes:
- serverspace-vl:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=VeryStr0ngPassword
- MYSQL_DATABASE=database
- MYSQL_USER=user
- MYSQL_PASSWORD=AnotherPassw0rd
Aquí, también agregamos la sección "entorno" donde configuramos variables de entorno para el contenedor. Son necesarios para especificar el nombre de la base de datos predeterminada y la contraseña de root.

Configurando redes
Los contenedores necesitan comunicarse entre sí. Nosotros ya tenemos Nginx y MySQLy no necesitan comunicarse entre sí todavía. Pero una vez que tengamos un contenedor para PhpMyAdmin, que necesita acceder a MariaDB, la situación cambiará. Las redes virtuales se utilizan para la comunicación entre contenedores y se pueden agregar de manera similar a los volúmenes. Primero, agregue la red al " principal "telecomunicaciones " sección:
networks:
serverspace-network:Luego, agregue esta red para cada contenedor que necesite acceso "externo". Posteriormente, los contenedores estarán disponibles en la red por sus nombres. Por ejemplo, agreguemos PhpMyAdmin y démosle acceso a la base de datos:
docker-phpmyadmin:
image: phpmyadmin/phpmyadmin:latest
ports:
- "8099:80"
environment:
- PMA_HOST=docker-mysql
networks:
- serverspace-network
Aquí, en la variable PMA_HOST, hacemos referencia al host "docker-mysql", al que se puede acceder gracias a la red compartida entre estos contenedores. De forma similar, en el contenedor "docker-mysql", nuestro contenedor PhpMyAdmin es accesible como "docker-phpmyadmin". Puedes abrir la dirección http://docker-server:8099 y autenticarse para comprobar si la base de datos está funcionando.

Conexión a un contenedor
Con docker-compose, puede conectarse a cualquier contenedor del grupo. Simplemente use el ejecutivo dominio. Por ejemplo, inicie el proyecto en segundo plano:
docker-compose up -dLuego vamos a conectarnos al contenedor con Nginx:
docker-compose exec docker-nginx /bin/bash
Conclusiones
En este artículo, cubrimos el uso de Docker Para principiantes. También describimos cómo usar algunos contenedores Docker como una unidad compleja. El tema es bastante extenso y complejo, pero muy interesante. Al implementar el proyecto en una máquina de esta manera, puede implementarlo donde lo necesite simplemente copiando la configuración allí. Es por eso que esta tecnología ha ganado tanta popularidad entre los desarrolladores y DevOps.