Docker-compose como herramienta de desarrollo
Clase 22 de 25 • Fundamentos de Docker 2018
Contenido del curso
Clase 22 de 25 • Fundamentos de Docker 2018
Contenido del curso
José Antonio Arias Rodríguez
José Antonio Arias Rodríguez
Iván Toro
Pedro Roberto Capriles Morales
Ariel Jacob
Augusto Gonzalez
Kevin Costa
Edgar de Jesus Mendoza Ortegon
Luis Fernando Pedroza Taborda
Gonzalo Amador Hernández
Belen ST
Cesar Gonzalez Leyba
Gonzalo Amador Hernández
Rodolfo Carmona
Jonathan Jose Silva Ramos
Mario Garcia
Antonio Luis Gil Rodríguez
Luis Fernando Bustos Ramírez
Paul Cortes
Diego Joel Requejo Torero
William Schnaider Torres Bermon
Wilson Fernando Antury Torres
Anthony Farias
Wilson Fernando Antury Torres
Luis Fernando Bustos Ramírez
Jesus Manuel Herrera Miramontes
Manuel Andres Santizo Avila
Guido Vilariño
Cristian Camilo Perez Cardona
Víctor A. Echeverría
Jorge Humberto Nemogá Pinzón
Eso se resuelve usando un contenedor para el balanceo, por ejemplo haproxy
Esta seria la solución al reto
version: "3" services: app: build: . environment: MONGO_URL: "mongodb://db:27017/test" depends_on: - db db: image: mongo lb: image: dockercloud/haproxy links: - app ports: - '80:80' volumes: - /var/run/docker.sock:/var/run/docker.sock
Genial.
Para el reto del load balance, se agrega nuevo servicio en este caso se nombre “proxy” y se utiliza la imagen “dockercloud/haproxy” se tomo en cuenta ejemplo de implementación del mismo donde se expone el puerto 80.
version: "3" services: app: build: . environment: MONGO_URL: "mongodb://db:27017/test" depends_on: - db ports: - "3000-3010:3000" volumes: - ".:/usr/src" - "/usr/src/node_modules" db: image: mongo proxy: image: dockercloud/haproxy ports: - "80:80" depends_on: - app links: - app expose: - "80" volumes: - /var/run/docker.sock:/var/run/docker.sock
que genial es DOCKER y este profe explica de 10!
+1
version: "3" services: app: image: platziapp environment: MONGO_URL: "mongodb://db:27017/test" depends_on: - db ports: - "3000-3010:3000" volumes: - .:/Users/kevin/src # esto no me lo toques - /Users/kevin/src/node_modules db: image: mongo lb: image: dockercloud/haproxy links: - app ports: - '4000-4010:80' volumes: - /var/run/docker.sock:/var/run/docker.sock
imagen del balanceador de carga https://hub.docker.com/r/jwilder/nginx-proxy
url del ejemplo : http://167.71.102.229/
Abajo el docker-compose.yml
version: "3" services: app: build : . environment: MONGO_URL: "mongodb://db:27017/test" VIRTUAL_HOST: 167.71.102.229 depends_on: - db ports: - "3000" volumes: - .:/usr/src - /usr/src/node_modules db: image: mongo nginx: image: jwilder/nginx-proxy ports: - "80:80" volumes: - "/var/run/docker.sock:/tmp/docker.sock:ro"
Edgar, buen aporte para saber mas sobre la imagen del balanceador de carga
Eres un Crack!!!!
Para resolver el reto me guié utilizando este tutorial. Quedando el docker-compose.yml de la siguiente manera.
version: "3" services: app: build: . environment: MONGO_URL: "mongodb://db:27017/test" depends_on: - db expose: - "3000" volumes: - .:/usr/src - /usr/src/node_modules db: image: mongo nginx: image: nginx:latest volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - app ports: - "4000:4000"
y además agregué el archivo ** nginx.conf ** en el proyecto
user nginx; events { worker_connections 1000; } http { server { listen 4000; location / { proxy_pass http://app:3000; } } }
finalmente agregué unas lineas de logs para validar por que aplicación estaba ingresando el request y ejecuté el comando compose up junto con la flag de scale para crear los 4 nodes
docker-compose up -d --scale app=4
Gracias por el aporte! Muy interesante articulo
wow!!!! super increible!!!!
Docker es un monstruo! un gran docente! hasta ahora el cursos que más he disfrutado :D
Un loadbalancer super fácil de configurar
ingresen a localhost:8080 para ver el dashboard
version: "3" services: app: build: . environment: MONGO_URL: "mongodb://db:27017/test" depends_on: - db ports: - "3000-3010:3000" volumes: - .:/usr/src/ - /usr/src/node_modules labels: #- "traefik.backend=machine-echo" - "traefik.frontend.rule=Host:app.localhost" db: image: mongo lb: image: traefik command: --web --docker --docker.domain=docker.localhost --logLevel=DEBUG ports: - "80:80" - "8080:8080" - "443:443" volumes: - /var/run/docker.sock:/var/run/docker.sock - /dev/null:/traefik.toml
Hola josilva. yo tengo docker corriendo en otra maquina con ip 192.168.0.100 y mi maquina esta en el 192.168.0.55 y puedo ver el dashboard en http://192.168.0.100:8080 pero no puedo ver la app en el http://192.168.0.100:80
Con el archivo .dockerignore se puede conseguir lo mismo que se hizo para ignorar la carpeta node_modules?
Como dicen los demás compañeros debemos de usar nginx, pueden consultar la información de un ejemplo aqui
pero en resumen se tiene que crear un archivo llamado nginx.conf con los siguientes datos
user nginx; events { worker_connections 1000; } http { server { listen 4000; location / { proxy_pass http://app:3000; } } }
y modificamos nuestro docker-compose.yml de la siguiente manera
version: "3" services: db: image: mongo app: build: . #image: platziapp environment: MONGO_URL: "mongodb://db:27017/test" depends_on: - db #ports: # - "3000-3010:3000" expose: - "3000" volumes: - .:/usr/src - /usr/src/node_modules nginx: image: nginx:latest volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro depends_on: - app ports: - "4000:4000"
Escalar contenedores
para escalar los contenedores para que hayan mas para atender las solicitudes se puede usar el comando:
docker-compose scale [nombre_contenedor]=[cantidad_contenedores] docker-compose scale app=4
al momento de ejecutar esto si no esta preparado el archivo de docker-compose.yaml nos dara error porque ya se estan usando los puertos de la maquina local, porque intenta asignar el mismo que ya esta en uso:
version: "3" services: app: build: . environment: MONGO_URL: "mongodb://db:27017/test" depends_on: - db ports: - "3000-3010:3000" volumes: - .:/usr/src - /usr/src/node_modules db: image: mongo
agregando un rango de puertos a usar de la maquina local en:
ports: - "3000-3010:3000"
Utilicé un hapropxy como load-balancer, el docker compose quedó así:
version: "3" services: lb: image: dockercloud/haproxy links: - app ports: - 80:80 app: #image: platziapp build: . environment: MONGO_URL: "mongodb://db:27017/test" depends_on: - db ports: - 3000-3010:3000 volumes: - .:/usr/src - /usr/src/node_modules db: image: mongo
Referencia: acá
El comando docker-compose scale se encuentra deprecado según la documentación. Se recomienda usar:
docker-compose up --scale [name_service]=[num]
Veamos si entiendo, yo podría crear una imagen para mi contenedor con todo mi ambiente de trabajo para desarrollar aplicaciones web, por ejemplo, nodejs, webpack, terminal, express, react, nodemon, python, y todo lo que necesite, sin necesidad de tenerlo en una computadora localmente. Lo que quiero saber es que si llego a una computadora sin un ambiente de trabajo configurado, solo con instalar docker e iniciar mi contenedor con la imagen de mi repositorio, podría desarrollar sin problemas? está bien éste enfoque con respecto al de tener todo localmente? Gracias.
Eso es correcto. Con docker creas tus propias imagenes y las corres en cualquier lugar que tenga docker.
Hola anthony-farias, gracias por la respuesta. Entonces debería iniciar cada proyecto en un contenedor, verdad? Esto se hace comunmente en la industria?
😭 Es tan hermoso
docker-compose scale app=4
Podríamos utilizar un Service Discovery como Consul donde los contenedores se registren para que puedan ser encontrados no?
Se puede usar Consul, claro; todo depende de tu setup. Para correr dentro de la misma máquina, docker-compose y docker networking suele ser lo más simple. Para esquemas de múltiples computadoras, lo más sencillo es usar Docker Swarm.
Si quieres usar tu propio key/value store y planificador de contenedores, suele usarse mucho la combinación Consul + Nomad, ambos de HashiCorp
Mi nginx.config
upstream node-app { server app_1:3000; server app_2:3000; server app_3:3000; server app_4:3000; } server { listen 80; location / { proxy_pass http://node-app; } }
Solo utilizando los alias de las diferentes apps, todas en el puerto 3000. DONE
Buenas noches @gvilariño, al parecer lo logré con nginx configurado como balanceador, aunque tengo una duda: Para que el contenedor de balanceo no se conecte al host por medio de la red, se debería configurar en el nginx.conf las ips asignadas por docker a cada contenedor escalado en vez de localhost ??
docker'compose.yml
version: "3.8" services: connect_mongo: build: . environment: MONGO_URL: "mongodb://dbmongo:27017/test" depends_on: - dbmongo ports: - "3000-3010:3000" volumes: - .:/usr/src/ - /usr/src/node_modules networks: - app_net balancer: image: nginx:latest depends_on: - connect_mongo ports: - "8005:8005" volumes: - /home/vecheverria/Development/Docker/Nginx/:/etc/nginx/:ro network_mode: "host" dbmongo: image: mongo networks: - app_net networks: app_net: ipam: driver: default config: - subnet: "172.16.238.0/24"
nginx.conf
user nginx; worker_processes 1; error_log /var/log/nginx/error.log warn; pid /var/run/nginx.pid; events { worker_connections 1024; } http { upstream connect_mongo { server localhost:3000; server localhost:3001; server localhost:3002; server localhost:3003; } server { listen 8005; location / { proxy_pass http://connect_mongo; } } }
Con el archivo .dockerignore se puede conseguir lo mismo que se hizo para ignorar la carpeta node_modules?