Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
NotificationsYou must be signed in to change notification settings

curso-devops/3-docker-compose

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 

Repository files navigation

  1. Crear una orquestación compleja con imágenes independientes
  2. Ejecutar, administrar y probar la orquestación
  3. Escalar servicios con docker-compose (múltiples instancias)
  4. Redes virtuales en docker y múltiples entornos

1. Crear una orquestación compleja con imágenes independientes

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.


2. Ejecutar, administrar y probar la orquestación

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.


3. Escalar servicios con docker-compose (múltiples instancias)

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.


5. Redes virtuales en docker y múltiples entornos

Podemos tener diferentes redes virtules para separar las aplicaciones o los entornos.

Image 1

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

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

[8]ページ先頭

©2009-2025 Movatter.jp