### STAGE 1: Build ###
FROM cachac/dockerlabs_base:node14 as build
WORKDIR /usr/src/app
### STAGE 2: Release ###
FROM nginx:stable-alpine as release
COPY --from=build /usr/src/app/dist /usr/share/nginx/html
RUN rm /etc/nginx/conf.d/default.conf
COPY nginx/nginx.conf /etc/nginx/conf.d
EXPOSE 8080
CMD ["nginx", "-g", "daemon off;"]
as build = establece el escenario build
as release = establece el escenario release
COPY --from = copia de un stage a otro
EXPOSE = expone el puerto 8080
nginx.conf escucha en el puerto 8080
docker build . -f demo.dockerfile -t dockerlabs
docker images
docker run -p 8080:8080 dockerlabs:latest
Error Conocido: Corregirlo y volver a ejecutar
listen tcp4 0.0.0.0:8080: bind: address already in use.
docker pull cachac/dockerlabs_base:node14
docker images
node14 (usada en el paso anterior): cachac/dockerlabs_base:node14 = ~1.59GB
Alpine: alpine3.12 = ~114MB
Comparar el tamaño de la imagen con stages dockerlabs y demowebsite (lab anterior)
docker image prune
docker container prune
Validar las imágenes borradas y la cantidad de espacio reclamada
docker tag <image_id> <dockerhub user>/dockerlabs
Ejemplo:
docker tag 12345678901234 cachac/dockerlabs
docker push <docker user>/dockerlabs
Resultado:
denied: requested access to the resource is denied
docker login
Login Succeeded
Para asegurar que todos los contenedores tengan comunicación.
docker network create lab
docker network ls
docker run --name multidocker_1 -d --network lab dockerlabs
docker run --name multidocker_2 -d --network lab dockerlabs
docker run --name multidocker_3 -d --network lab dockerlabs
En ese caso no especificamos los puertos (-p), por lo que no mapea con un puerto externo. Toma los puertos por defecto: 80 externo y 8080 interno (EXPOSE)
502 Bad Gateway
FROM nginx:stable-alpine
WORKDIR /etc/nginx/conf.d
COPY ./dockerfiles_demo/nginx-loadbalancer.conf .
RUN rm /etc/nginx/conf.d/default.conf
RUN mv nginx-loadbalancer.conf default.conf
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
COPY = copia el archivo de configuración Nginx Loadbalancer
docker build . -f loadbalancer.dockerfile -t loadbalancer
Asegurar que estén corriendo los 3 contenedores web
docker ps
docker run --name loadbalancer -dp 8080:80 --restart on-failure --network lab loadbalancer
docker ps
docker logs -f loadbalancer
Muestra el puerto mapeado 0.0.0.0:8080->80/tcp
Generar tráfico y validar logs
Nota importante: el balanceador no está realizando un health check a los contenedores, por lo que intenta enviar tráfico aunque estén caídos.
docker rm -f multidocker_3
docker rm -f loadbalancer