- Notifications
You must be signed in to change notification settings - Fork2
curso-devops/3-docker-compose
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
- Crear una orquestación compleja con imágenes independientes
- Ejecutar, administrar y probar la orquestación
- Escalar servicios con docker-compose (múltiples instancias)
- Redes virtuales en docker y múltiples entornos
Descargamos el repositorio con los servicios diferenciados. En este caso tendremos un dockerfile por cada servicio:
- Para la aplicación ángular:
FROM nginx:alpine# use a volume is more efficient and speed that filesystemVOLUME /tmpRUN rm -rf /usr/share/nginx/html/*COPY nginx.conf /etc/nginx/nginx.confCOPY billingApp /usr/share/nginx/html#expose app and 80 for nginx appEXPOSE 80CMD ["nginx","-g","daemon off;"]
RUN se usa básicamente para correr un comando, ya sea instalar un servicio, eliminar ficheros, crear directorios, … Se puede ejecutar las veces que lo necesitemos dentro del dockerfile.CMD se utiliza para ejecutar un comando por defecto, cuando se crea el contenedor
- Para el microservicio java:
FROM openjdk:8-jdk-alpineRUN addgroup -S devopsc && adduser -S javams -G devopscUSER javams:devopscENV JAVA_OPTS=""ARG JAR_FILEADD ${JAR_FILE} app.jar# use a volume is mor efficient and speed that filesystemVOLUME /tmpEXPOSE 8080ENTRYPOINT ["sh","-c","java $JAVA_OPTS -Djava.security.egd=file:/dev/./urandom -jar /app.jar" ]
Por seguridad, todos los contenedores deberían tener una configuración de grupo/usuario.
- Para la base de datos, tenemos un script que crea la base de datos por defecto sobre un contenedor dePostgres de docker-hub.
#!/bin/bashset-epsql-v ON_ERROR_STOP=1--username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQLCREATEUSERbillingapp WITH PASSWORD'qwerty';CREATEDATABASEbillingapp_db;GRANT ALL PRIVILEGESON DATABASE billingapp_db TO billingapp;EOSQL
- Por último tenemos el archivo de configuraciónstack-billling.yml que usaremos en el docker compose con que definimos los cuatro servicios que vamos a utilizar:
- Postgres
- Adminer
- App back
- App front
version:'3.1'services:#database engine servicepostgres_db:container_name:postgresimage:postgres:latestrestart:alwaysenvironment:ports: -5432:5432volumes:#allow *.sql, *.sql.gz, or *.sh and is execute only if data directory is empty -./dbfiles:/docker-entrypoint-initdb.d -/var/lib/postgres_data:/var/lib/postgresql/dataenvironment:POSTGRES_USER:postgresPOSTGRES_PASSWORD:qwertyPOSTGRES_DB:postgres#database admin serviceadminer:container_name:adminerimage:adminerrestart:alwaysdepends_on: -postgres_dbports: -9090:8080#Billin app backend servicebillingapp-back:build:context:./javaargs: -JAR_FILE=*.jarcontainer_name:billingApp-backenvironment: -JAVA_OPTS=-Xms256M-Xmx256Mdepends_on: -postgres_dbports: -8080:8080#Billin app frontend servicebillingapp-front:build:context:./angularcontainer_name:billingApp-frontdepends_on: -billingapp-backports: -80:80
En este caso para Postgres y Adminer no vamos a utilizar una imagen personalizada, sino que usaremos la imagen que proporciona docker-hub.
En la definción de postgres, en la etiquetavolumes indicamos el punto de entrada de la BBDD y establecemos un volumen para poder compartir datos entre la máquina host y el contenedor, de forma que queden persistentes si eliminamos el contenedor.
Para las aplicaciones back y front indicamos en el yaml el docker file desde donde tiene que construir la imagen.
Ejecutamos el docker compose para construir todas las imágenes del archivo yaml:
docker-compose -f stack-billing.yml build
Podemos levantar todas las imágenes necesarias usando el comando:
docker-compose -f stack-billing.yml up
Al persistir los datos mediante un volumen, si laramos la ejecución de las imágenes con el comando:
docker-compose -f stack-billing.yml down (o stop)
Tras volver a levantarlo, veremos que los datos no se han perdido.
Vamos a levantar varias instancias del frontal. Primero debemos comentar en el yaml el nombre del contenedor para no provocar conflictos al tener las nuevas instancias el mismo nombre. También debemos modificar el puerto de entrada y aplicar un rango.
#Billin app frontend servicebillingapp-front:build:context:./angular# container_name: billingApp-frontdepends_on: -billingapp-backports: -80-85:80
Utilizamos el siguiente comando para levantar las instancias:
docker-compose -f stack-billing.yml up --scale billingapp-front=3 -d --force-recreate
El escalado se puede definir en el archivo yaml, permitiendo además limitar recursos en cada réplica.DEPRECADO
#Billin app frontend servicebillingapp-front:build:context:./angulardeploy:replicas:3resources:limits:cpus:"0.15"memory:250Mreservations:cpus:"0.1"memory:128M# container_name: billingApp-frontdepends_on: -billingapp-backports: -80-85:80
Levantamos las instancias con el comando:
docker-compose -f stack-billing.yml up -d --force-recreate
DEPRECADO Sólo se va a instanciar una imagen y mostrará un warning indicándolo...
El comandodocker stats
muesta las estadísticas de cada uno de los contenedores.
Podemos tener diferentes redes virtules para separar las aplicaciones o los entornos.
Debido a que el uso de deploy en el docker-compose está deprecado, sólo crearemos nodo para el front en cada entorno.
La configuración que vamos a tener es de dos entornos (PRE Y PRO, ya que obviaremos dev por ser igaul a lo que hemos realizado hasta ahora) con dos nodos en cada uno de ellos para tener tolerancia a fallo.
En el yml de configuración podemos ver las siguientes modificaciones con respecto a lo que hemos hecho previamente:
Cuando no se establece el atributo networks, todos los servicios definidos se despliegan sobre la misma red virtual. Para este ejemplo vamos a configurar el atributo network para separar los entornos en dos redes virtuales distintas:
networks:env_prod:driver:bridge#activate ipv6driver_opts:com.docker.network.enable_ipv6:"true"#IP Adress Manageripam:driver:defaultconfig: -subnet:172.16.232.0/24 -subnet:"2001:3974:3979::/64"env_prep:driver:bridge#activate ipv6driver_opts:com.docker.network.enable_ipv6:"true"#IP Adress Manageripam:driver:defaultconfig: -subnet:172.16.235.0/24 -subnet:"2001:3984:3989::/64"
A nivel de servicios, debemos clonarlos para tener servicios diferenciados en cada uno de los entornos:
services:#database engine servicepostgres_db_prod:container_name:postgres_prodimage:postgres:latestrestart:alwaysnetworks: -env_prodenvironment:ports: -5432:5432volumes:#allow *.sql, *.sql.gz, or *.sh and is execute only if data directory is empty -./dbfiles:/docker-entrypoint-initdb.d -/var/lib/postgres_data_prod:/var/lib/postgresql/dataenvironment:POSTGRES_USER:postgresPOSTGRES_PASSWORD:qwertyPOSTGRES_DB:postgres#database engine servicepostgres_db_prep:container_name:postgres_prepimage:postgres:latestrestart:alwaysnetworks: -env_prepenvironment:ports: -4432:5432volumes:#allow *.sql, *.sql.gz, or *.sh and is execute only if data directory is empty -./dbfiles:/docker-entrypoint-initdb.d -/var/lib/postgres_data_prep:/var/lib/postgresql/dataenvironment:POSTGRES_USER:postgresPOSTGRES_PASSWORD:qwertyPOSTGRES_DB:postgres...
Debemos tener en cuenta que hemos de cambiar:
- Nombre del servicio
- Nombre del contenedor
- Puertos (cambiar el puerto externo para diferentes entornos, el interno debe ser el mismo)
- Volumen
- Definir a qué red pertenece el servicio
Para el adminer no es necesario replicar el servicio, ya que al ser un gestor de BBDD puedo conectarme al postgres de cada entorno desde la misma instancia. Únicamente hemos de definir que este servicio será común a las dos redes virtuales.
#database admin service#Use for All enviromentsadminer:container_name:adminerimage:adminerrestart:alwaysnetworks: -env_prod -env_prepdepends_on: -postgres_db_prod -postgres_db_prepports: -9090:8080
Para el microservicio en java, además de lo anterior, debemos indicar el jar correspondiente en cada entorno:
#Billin app backend servicebillingapp-back-prod:build:context:./javaargs: -JAR_FILE=billing-0.0.3-SNAPSHOT.jarnetworks: -env_prodcontainer_name:billingApp-back-prodenvironment: -JAVA_OPTS=-Xms256M-Xmx256Mdepends_on: -postgres_db_prodports: -8080:8080#Billin app backend servicebillingapp-back-prep:build:context:./javaargs: -JAR_FILE=billing-0.0.2-SNAPSHOT.jarnetworks: -env_prepcontainer_name:billingApp-back-prepenvironment: -JAVA_OPTS=-Xms256M-Xmx256Mdepends_on: -postgres_db_prepports: -7080:7080
About
Resources
Uh oh!
There was an error while loading.Please reload this page.