En este Meetup nos metemos en harina haciendo un repaso de los conceptos principales relacionados con docker y aplicando los casos de uso típicos con contenedores, siempre desde la perspectiva del programador.
El Meetup está dividido en 3 secciones:
* Docker como herramienta de ayuda a la programación
* Docker como sistema de empaquetado de nuestras apps.
* Docker como entorno de despliegue (docker-compose).
2. Bienvenido
Index
1. Introducción a Docker
2. Imágenes y Contenedores
3. Repositorio de imágenes
4. Creación de un contenedor
5. Docker como herramienta de ayuda al
desarrollo
6. Distribución de aplicaciones
7. Dockerfile
8. Ecosistema
9. Docker-Compose
4. Empaquetado de aplicaciones o sistemas
Encapsula (casi) cualquier
aplicación/sistema
Despliegue multi plataforma (Linux,
Windows, macOS)
Simplifica sistema de despliegue en
grandes infraestructuras IT.
Útil como herramienta de desarrollo.
Abstrae de las particularidades de cada
aplicación/sistema
Acceso vía consola o tcp (puertos)
a las aplicaciones embebidas en
contenedores
5. .
2. Imágenes y contenedores
Diferencia entre una imagen y un contenedor Docker
6. Imágenes VS Contenedores
CONTENEDORES docker ps –a
• Instancia en ejecución de una imagen
• Contiene datos “vivos”, que desaparecen si se
borra el contenedor (salvo uso de volúmenes)
• Pueden existir diferentes contenedores en
ejecución de una misma imagen
• Al crear el contenedor se establecen los parámetros
específicos requeridos o esperados por la imagen
(puertos, volúmenes, variables, …)
IMAGENES docker images
• Contiene la definición/contenido estático de una
aplicación o sistema
• Se almacenan en repositories (registros), tanto
en local como en remoto
• Las imágenes suelen estar definidas a partir de
otras imágenes
• Pueden existir diferentes versiones de una
imagen en un repositorio
• La imagen determina el software a ejecutar al
crear el contenedor y cómo va a interactuar con
el host (Puertos, volúmenes, variables de
entorno, …)
8. Imágenes locales
Listar imágenes en repo local
docker images
Descargar imagen desde repo remoto
docker pull image_name:tag
Borrar imagen de repo local
docker rmi image_name:tag
docker rmi image_id
9. Imágenes remotas
hub.docker.com
Generalmente de uso privado dentro de la
organización.
Otros repositorios
Repositorio principal y por defecto
Acceso público mediante registro
Todas las imágenes “oficiales” de los
principales fabricantes: Ubuntu, Fedora,
MySQL, Postgres, …
Acceso a imágenes de la comunidad open
source
Utilizados dentro del ciclo ALM
10. .
4. Creación de un contenedor
Como crear un contenedor a partir de una imagen
11. Ejemplos de contenedores
BBDD MySQL
docker volume create mysql_project1_data_vol
docker run --name project1-mysql -p 127.0.0.1:3306:3306 -v
mysql_project1_data_vol:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=holahola -d
mysql:8
Acceso contenedor en ejecución
docker exec -it project1-mysql /bin/bash
Listar contenedores en ejecución
docker ps
“Hola mundo” por consola
docker run -it --rm hairyhenderson/figlet ‘Hello world!’
12. .
5. Docker como herramienta
de ayuda al desarrollo
Uso de Docker en entorno de desarrollo local para
lanzar herramientas y backends
13. Gestión básica integrada
Ejemplo BBDD Postgres
docker volume create pgdata1
docker run --name qo-meetup-pg -v
"pgdata1:/var/lib/postgresql/data" -p 5432:5432 -e
POSTGRES_PASSWORD=holahola -d postgres:11
Gestión básica desde VSCode
Extensión “Docker” de Microsoft
https://marketplace.visualstudio.com/items?itemName=ms-
azuretools.vscode-docker
16. .
6. Distribución de aplicaciones
Empaquetado de aplicaciones propias en
Imágenes Docker
17. Cómo construir imágenes
Parametrizar todo lo que puede variar
entre entornos aunque usando valores
por defecto donde sea posible.
Definir información persistente
(volúmenes)
Reducir en la medida de lo posible los
pasos (Steps) de construcción
Sistema de versionado coherente
18. Ejemplos de construcción de imágenes
Ejemplo salida de comando
Sending build context to Docker daemon 12.8kB
Step 1/4 : FROM nginx
---> ab56bba91343
Step 2/4 : RUN rm
/etc/nginx/conf.d/default.conf
---> Using cache
---> 58500316034f
Step 3/4 : COPY index.html
/usr/share/nginx/html/index.html
---> Using cache
---> 25bc10d90fd9
Step 4/4 : COPY default.conf
/etc/nginx/conf.d/default.conf
---> Using cache
---> 0c53666127c0
Successfully built 0c53666127c0
Successfully tagged qualityobjects/appjava:2.5
Successfully tagged qualityobjects/appjava:latest
Construcción
docker build -f Dockerfile.myapp --build-arg jar_file=myapp_2.5.jar --
tag=qualityobjects/appjava:2.5 --tag=qualityobjects/appjava:latest .
SECURITY WARNING: You are building a Docker image
from Windows against a non-Windows Docker host. All
files and directories added to build context
will have '-rwxr-xr-x' permissions. It is
recommended to double check and reset permissions
for sensitive files and directories.
20. Composición Dockerfile
Preparación entorno de ejecución
RUN apt-get update && apt-get install -y package-bar package-baz package-foo
COPY myapp.jar /opt/myapp.jar
Parametrización runtime/building
ENV ADMIN_USER="mark"
ARG from_version="latest"
Puertos/volúmenes
EXPOSE 80 443
VOLUME ["/opt/data","/var/myapp"]
Origen y metadatos
FROM Ubuntu:18.04
LABEL myapp.version=“0.1” vendor=“Quality Objects”
Inicialización/ejecución del contenedor
ENTRYPOINT ["echo", "Hola"]
CMD ["Mundo"]
21. Ejemplos Dockerfile
Aplicación web
FROM nginx:latest
RUN rm
/etc/nginx/conf.d/default.conf
COPY default.conf
/etc/nginx/conf.d/default.conf
RUN chmod 644 /etc/nginx/conf.d/*
COPY index.html
/usr/share/nginx/html/index.html
RUN chmod 766
/usr/share/nginx/html/index.html
Aplicación Java SpringBoot
FROM ubuntu:18.04
LABEL vendor=“QO" description=“Java Example”
RUN apt update -y && apt install -y openjdk-11-
jre-headless && apt clean
ENV PORT=8080
RUN mkdir /opt/app
WORKDIR /opt/app
EXPOSE ${PORT}
COPY h3lp3r-back.jar ./h3lp3r-back.jar
ENTRYPOINT ["bash", "-c" ]
CMD ["/usr/bin/java -jar ${JARFILE} --
port=${PORT}"]
22. Building + Distribution I
FROM ubuntu:18.04 as builder
LABEL vendor="Quality Objects"
description="SpringBoot+Angular Builder"
RUN apt update -y && apt install -y curl
RUN curl -sL
https://deb.nodesource.com/setup_10.x | bash -
#Instalamos el JDK y node runtime
RUN apt install -y openjdk-11-jre-headless maven
nodejs && apt clean
RUN npm install -g @angular/cli
ENV WORKSPACE=/opt/workspace
ENV JARFILE=java-server.jar
RUN mkdir $WORKSPACE
WORKDIR "$WORKSPACE"
ADD workspace.tgz $WORKSPACE
RUN cd $WORKSPACE
RUN ng config -g cli.warnings.versionMismatch
false
RUN cd angular-front && npm i && node --max-old-
space-size=7000 /usr/bin/ng build --prod
RUN cd angular-front/dist/angular-front && tar
cvfz "${WORKSPACE}/angular-front.tgz" *
#Linea para servir el front desde java
RUN cd java_server/src/main/resources/static &&
tar xfz "${WORKSPACE}/angular-front.tgz"
RUN cd java_server && mvn package -DskipTests=true
&& mv target/*.jar
../${JARFILE}
Continua
Building
23. Building + Distribution II
FROM ubuntu:18.04 as executor
LABEL vendor="Quality Objects"
description="App runtime"
RUN apt update -y && apt install -y curl
openjdk-11-jre-headless && apt clean
ENV PORT=8080
ENV DB_HOST=localhost
ENV DB_NAME=mydb
ENV DB_USER=user1
ENV DB_PASSWORD=pass_user1
ENV JARFILE=java-server.jar
RUN mkdir /opt/app
WORKDIR /opt/app
EXPOSE ${PORT}
COPY --from=builder /opt/workspace/${JARFILE}
${JARFILE}
ENTRYPOINT ["bash", "-c" ]
CMD ["/usr/bin/java -jar ${JARFILE} --
port=${PORT} --db-host=${DB_HOST} --db-
name=${DB_NAME} --db-user=${DB_USER} --db-
password=${DB_PASSWORD}"]
DistributionSigue
26. Acceso centralizado (Docker HUB) a
imágenes de todo tipo de backends y
aplicaciones para su uso en local o en
entornos de producción
Resumen Docker
Entorno “sandbox” para probar nuevas
tecnologías
Herramienta para construir y distribuir
nuestras aplicaciones independientemente
del tipo de entorno (Docker-compose,
Kubernetes, …) o tipo de nube (Amazon,
Azure, Google Cloud, …)
Herramienta para pruebas de integración
27. Estandarización despliegue.
Ventajas
Multiplataforma.
Mejor aprovechamiento del HW entornos de
producción, frente a virtualización tradicional.
Facilita el upgrade (re-despliegue) de
aplicaciones y el rollback.
Facilita probar nuevas tecnologías sin
“ensuciar” el entorno local.
Facilita procesos CI/CD.
30. Despliegue de aplicación
Aplicación con 2 o más contenedores
Gestión integral del sistema desplegado
Definición de variables de entorno y
volúmenes
Fichero descriptor: docker-compose.yml
35. Recursos
Repositorios GIT de la app
https://gitlab.com/qo-oss/h3lp3r
Repositorio Docker con imágenes de la app
https://hub.docker.com/u/qualityobjects
Resumen de comandos
https://gitlab.com/qo-oss/h3lp3r/h3lp3r-back/-
/tree/master/etc/meetup/from_lost_to_the_docker