DOCKER COMPOSE
Uso de Docker Compose
El uso de Compose es esencialmente un proceso de tres pasos:
1. Defina el entorno de su aplicación con un Dockerfile para que pueda reproducirse en
cualquier lugar.
2. Definir los servicios que componen la aplicación en el archivo [Link]
3. Ejecutar docker compose up
Características
Compose usa un nombre de proyecto para aislar los entornos entre sí. El nombre del proyecto
predeterminado es el nombre base del directorio del proyecto. Puede establecer un nombre de
proyecto personalizado mediante la -p o --project-name NAME opción de línea de comandos
(especifica un nombre de proyecto alternativo (por defecto: nombre del directorio)) o la
COMPOSE_PROJECT_NAME variable de entorno.
El directorio del proyecto predeterminado es el directorio base del archivo Compose. Se puede
definir mi valor personalizado con --project-directory opción de línea de comando.
Compose conserva todos los volúmenes utilizados por sus servicios. Cuando se ejecuta docker
compose up si encuentra contenedores de ejecución anteriores, copia los volúmenes del
contenedor al contenedor nuevo.
Compose almacena en caché la configuración utilizada para crear un contenedor. Cuando reinicia
un servicio que no ha cambiado, Compose reutiliza los contenedores existentes. La reutilización de
contenedores significa que puede realizar cambios en su entorno muy rápidamente.
Admite variables en el archivo compose. Se pueden usar estas variables para personalizar su
composición para diferentes entornos o diferentes usuarios.
Casos de uso comunes de Docker Compose
-En entornos de desarrollo, permite crear un entorno aislado e interactuar con él.
-En entornos de prueba automatizados, las pruebas automatizadas de extremo a extremo
requieren un entorno en el que ejecutar las pruebas. Compose proporciona una forma
conveniente de crear y destruir entornos de prueba aislados para su conjunto de pruebas .
[Link]
Formas de establecer variables de entorno en Compose
Las variables de entorno pueden ayudarlo a definir varios valores de configuración. También
mantienen su aplicación flexible y organizada. Son tratadas tanto por el archivo compose como la
CLI. Existen varias formas en que se pueden sustituir o establecer las variables de entorno.
Sustituir con un .env archivo
El .env es útil si se tiene varias variables de entorno que se necesitan almacenar. Ejemplo:
Cuando se ejecuta docker compose up, el web servicio definido en el archivo compose sustituye a
la imagen webapp:1.5 que se configura en el .env archivo.
El archivo .env debe colocarse en la raíz del directorio del proyecto junto al [Link]
archivo. Se puede utilizar una ruta con uno de los siguientes métodos:
• La --file opción en la CL
• La --env-file opción en la CLI
• Usando el env_fileatributo en el archivo Compose
Nota: No es compatible con Swarm, cuando se ejecuta docker stack deploy.
Con el atributo enviroment
En el propio archivo compose.
Se puede optar por no establecer un valor y pasar las variables de entorno desde la shell
directamente a los contenedores de un servicio. docker run -e VARIABLE
Usando el env_file atributo
Se puede pasar varias variables de entorno desde un archivo externo a los contenedores de un
servicio con la env_file opción. docker run –env-file=FILE (Si se especifican varios archivos, se
evalúan en orden y pueden anular los valores establecidos en archivos anteriores)
Nota: Las variables de entorno declaradas en el archivo no se pueden volver a referenciar por
separado en el archivo de Compose ni se pueden usar para configurar Compose.
Sustituir desde la shell
Suponiendo que el shell contiene POSTGRES_VERSION=9.3 y proporcionas la siguiente
configuración en el compose:
Al ejecutar docker compose up se buscará la variable en la shell sustituyéndola por su valor, sino se
establece la sustituye por una cadena vacía.
Nota: Los valores establecidos en el entorno de shell anulan los establecidos en el .env archivo, el
environment atributo y el env_file atributo.
[Link]
Compartir las configuraciones de composer entre archivos y proyectos
El uso de varios archivos de Compose le permite personalizar una aplicación de Compose para
diferentes entornos o diferentes flujos de trabajo.
Compose admite dos métodos para compartir una configuración común:
1. Ampliar un archivo de Compose completo mediante el uso de varios archivos de Compose
2. Ampliar los servicios individuales con el campo extends.
De forma predeterminada, Compose lee dos archivos, uno [Link] y un docker-
[Link] archivo opcional. Por convención, [Link] contiene su
configuración base. El archivo de anulación, puede contener anulaciones de configuración para
servicios existentes o servicios completamente nuevos.
Si se define un servicio en ambos archivos, Compose fusiona las configuraciones usando las reglas
descritas en [Link]
Para usar varios archivos de reemplazo, o un archivo de reemplazo con un nombre diferente,
puede usar la -f opción para especificar la lista de archivos.
Cuando utiliza varios archivos de configuración, hay que asegurarse de que todas las rutas de los
archivos sean relativas al archivo base de Compose (el primer archivo de Compose especificado
con -f). Esto es necesario porque los archivos de anulación no necesitan ser archivos Compose
válidos. Los archivos de anulación pueden contener pequeños fragmentos de configuración.
[Link]
Redes en compose
De forma predeterminada, compose configura una sola red para la aplicación. Cada contenedor
para un servicio se une a la red predeterminada y otros contenedores en esa red pueden acceder
a ellos y pueden descubrirlo en un nombre de host idéntico al nombre del contenedor.
Ejemplo:
Una aplicación está en un directorio llamado myapp.
[Link] tiene la siguiente configuración:
Cuando ejecutamos docker compose up ocurriría lo siguiente:
1º Se crea una red llamada myapp_default
2º Un contenedor se crea usando la configuración de web y se une a la red myapp_default bajo el
nombre web.
3º El otro contenedor se crea usando la configuración de db y se une a la red myapp_default bajo
el nombre db.
Cada contenedor ahora puede buscar el nombre de host web y db recuperar la dirección IP del
contenedor apropiado.
Importante tener en cuenta la distinción entre HOST_PORT y CONTAINER_PORT. En el ejemplo,
para db, el HOST_PORT es 8001 y el puerto del contenedor es 5432 (por defecto de postgres). La
comunicación de servicio a servicio en red utiliza el CONTAINER_PORT. Cuando HOST_PORT se
define, el servicio también es accesible fuera del enjambre.
Actualización de contenedores en la red
Si se realiza un cambio de configuración en un servicio y se ejecuta docker compose up para
actualizarlo, el contenedor anterior se elimina y el nuevo se una a la red con una dirección IP
diferente pero con el mismo nombre. Los contenedores en ejecución pueden buscar ese nombre y
conectarse a la nueva dirección IP, pero la dirección IP anterior deja de funcionar.
Importante: Hacer referencia a los contenedores por nombre, no por IP, siempre que sea posible.
De lo contrario hay que actualizar constantemente la dirección IP que utiliza.
Enlazar contenedores
Los enlaces le permiten definir alias adicionales mediante los cuales se puede acceder a un servicio
desde otro servicio. links define un enlace de red a contenedores en otro servicio. Especifique el
nombre del servicio y un alias de enlace (SERVICE:ALIAS), o solo el nombre del servicio
Especificar redes personalizadas
En lugar de usar las redes predeterminadas, se puede especificar redes propias con network. Esto
permite crear topologías más complejas. También puede usarlo para conectar servicios a redes
creadas externamente que no son administradas por Compose.
Cada servicio puede especificar a que redes conectarse con networks a nivel de servicio. Luego hay
que hacer referencia en networks del nivel superior.
Ejemplo:
Se definen dos redes personalizadas. El servicio proxy está aislado del servicio db, no comparten
una red en común. Solo app puede hablar con ambos.
También se les puede dar un nombre personalizado:
Además se puede cambiar la configuración de la red predeterminada de toda la aplicación
definiendo una entrada en networks con default.
[Link]