David Guzman Lopez

Docker compose
Cuando trabajamos con múltiples contenedores Docker en un proyecto (por ejemplo, una aplicación web conectada a una base de datos, un sistema de caché y un proxy inverso), administrar cada contenedor de forma individual con comandos docker run larguísimos se vuelve insostenible y propenso a errores.
Docker Compose es la herramienta que nos permite definir y ejecutar aplicaciones Docker multi-contenedor de forma declarativa. Mediante un único archivo de configuración en formato YAML (docker-compose.yml), podemos describir la arquitectura de nuestros servicios, sus redes, volúmenes y la forma en que se comunican entre sí.
permite describir de forma declarativa la arquitectura de servicio de como se comunican entre si los contenedores
docker-compose up -d
(crea todo lo declarado en el archivo docker-compose.yml) creamos y ponemos en marcha toda la infraestructura declarada en segundo plano.

docker ps
comprobamos el nombre de la imagen en este caso es platziapp


comprobamos que sea igual en el docker compose

Subcomandos de Docker compose
docker network ls
(listo las redes)

docker network inspect docker_default
(veo la definición de la red)

docker-compose logs
(veo todos los logs)

docker-compose logs app
(solo veo el log de “app”)

docker-compose exec app bash
(entro al shell del contenedor app)

docker-compose ps
(veo los contenedores generados por docker compose)

docker-compose down
(borro todo lo generado por docker compose)
Docker compose como herramienta de desarrollo
docker-compose build
(crea las imágenes)




docker-compose up -d
(crea los servicios/contenedores)

Docker compose en equipo
touch docker-compose.override.yml (creo el archivo override)

docker-compose up -d (crea los servicios/contenedores)



docker-compose exec app bash
(entro al bash del contenedor app)

docker-compose ps
(veo los contenedores del compose)

docker-compose up -d --scale app=2
(escalo dos instancias de app, previamente tengo que
definir un rango de puertos en el archivo compose)

Doy un rango de dos puertos para que no se pisen los puertos disponibles para los dos contenedores


docker-compose down (borro todo lo creado con compose)
Administrando tu ambiente de Docker
docker container prune (borra todos los contenedores inactivos)
docker rm -f $(docker ps -aq) (borra todos los contenedores que estén corriendo o apagados)

docker network ls (lista todas las redes)
docker volume ls (lista todos los volumes)
docker image ls (lista todas las imágenes)
docker system prune (borra todo lo que no se esté usando)
docker run -d –name app –memory 1g platziapp (limito el uso de memoria)

docker stats (veo cuantos recursos consume docker en mi sistema)
docker inspect app (puedo ver si el proceso muere por falta de recursos)
Deteniendo contenedores correctamente: shell vs exec
docker build -t loop
(construyo la imagen que se llamara loop)



docker run -d --name looper loop
(corro el contenedor loop cuto name sera looper)


docker stop looper
(le envía la señal SIGTERM al contenedor)

docker ps -l
(muestra el ps del último proceso)

docker kill looper
(le envía la señal SIGKILL al contenedor)
docker exec looper ps -ef
(veo los procesos del contenedor)
contenedores ejecitables: entrypoint vs cmd
docker build -t ping .
(construyo la imagen que se llamara ping)



este dockerfile se basa en una imagen de ubuntu, el contenedor hacer tres veces ping a mi maquina local
docker run –name pinger ping <hostname> (ahora le puedo pasar un parámetro, previamente tengo que agregar el ENTRYPOINT en el Dockerfile)


El contexto de build
docker build -t prueba .(creo la imagen)

docker run -d --rm --name app prueba
(corro el contenedor)
en el archivo .dockerignore puedo poner todo lo que no quiero que copie del contexto de build

docker exec -it app bash
(entro al contenedor y verifico que no se haya copiado lo que está en el .dockerignore)

Conclusión
Docker Compose simplifica radicalmente la gestión de arquitecturas multi-contenedor, estandarizando los entornos de desarrollo y pruebas en cualquier equipo. Integrar estas buenas prácticas en tu flujo diario te permitirá mantener una infraestructura limpia, predecible y fácil de escalar.

