Webinar UNLu - Septiembre 2020
Como contactarnos
@tdelvechio - tdelvechio@unlu.edu.ar
agustinrodriguez206@gmail.com
El webinar dura 2 días
Hoy y mañana de 17 a 18:30
No es TALLER
Conviene prestar atención y hacer preguntas
Todo el material esta online...
...o va a estar (eventualmente)
Motivación de la charla
Es una introducción
No alcanza para salir usando Docker en proyectos
Pero esperamos que ayude a romper la inercia a la hora de arrancar
Como tecnologia, a veces Docker esta subvalorado (por complejo)
A veces esta sobrevalorado (proyectos chicos que no necesiten un entorno complejo)
La idea es que se pregunte al final de cada dia
Proceso donde se crea, vía software, algún recurso tecnológico que no existía previamente
Como concepto es casi tan antiguo como la computación en si
En las últimas 2 décadas la industria adoptó diversos mecanismos de virtualización para proveer servicios
Cloud Computing como caso paradigmático
2 tipos de virtualización
Contenedores
Hipervisores
2 tipos de virtualización
Contenedores
Hipervisores
Maquinas
Virtuales
Linux
Containers
Tecnología de virtualización ligera
Funciona por medio del aislamiento (isolation)
No son mutuamente excluyentes VMs y Containers
Aislamiento (seguridad)
Portabilidad
Eficiencia (Caso de Containers)
Tecnología de contenedores Open Source
Estándar (casi sinónimo de containers)
Despliegue de entornos de muy bajo costo (no solo económico)
Alguna terminología asociada
Engine
Build File
Imagen
Contenedor
Red y Almacenamiento
Comenzar a interactuar con docker
correr un contenedor y conocer su estado
docker ps
docker run
docker run hello-world
docker ps
docker ps -a
docker ps
CONTAINER ID - IMAGE - COMMAND - CREATED - STATUS - PORTS
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
78523e4c21ff hello-world "/hello" 3 seconds ago Exited (0) 2 seconds ago jovial_snyder
docker run kodekloud/simple-webapp
docker run -d kodekloud/simple-webapp
docker ps
docker ps -a
cat /etc/*release*
docker run -it ubuntu bash
cat /etc/*release*
Frenar y eliminar un contenedor
eliminar una imagen
docker stop
docker rm
docker rmi
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c2f46fc8f0c ubuntu "sleep 300" 7 seconds ago Up 7 seconds stupefied_hodgkin4
docker stop 5c2f46fc8f0c
docker run -d ubuntu sleep 300
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c2f46fc8f0c ubuntu "sleep 30" 7 seconds ago Up 7 seconds stupefied_hodgkin4
docker stop stupefied_hodgkin4
docker rm stupefied_hodgkin4
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5c2f46fc8f0c ubuntu "sleep 30" 7 seconds ago Up 7 seconds stupefied_hodgkin4
docker stop stupefied_hodgkin4
docker rm stupefied_hodgkin4
docker rmi ubuntu
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu latest adafef2e596e 3 seconds ago 73.9MB
Mostrar como vincular un puerto en el host con uno en el contenedor
docker run -p
docker run -p 5050:8080 -d kodekloud/simple-webapp
docker run -p 5051:8080 -d kodekloud/simple-webapp
docker run -p 5052:8080 -d kodekloud/simple-webapp
crear múltiples contenedores
docker ps
CONTAINER ID IMAGE COMMAND PORTS NAMES
6516cc6a267a kodekloud/simple-webapp "python app.py" 0.0.0.0:5050->8080/tcp cool_feynman
47d8534db6fa kodekloud/simple-webapp "python app.py" 0.0.0.0:5051->8080/tcp pedantic_zhukovsky
2800dda57efd kodekloud/simple-webapp "python app.py" 0.0.0.0:5052->8080/tcp competent_diffie
ip:puerto(host)->puerto(contenedor)
docker run -v
Mostrar como vincular un directorio en el host con uno en el contenedor
docker run -v scripts:/home/ ubuntu
Directorio(host):Directorio(contenedor)
HOST
CONTENEDOR
Se usa el CLI para generar containers, los cuales se construyen desde las imagenes
Los containers corren procesos (idealmente uno solo)
Se pueden usar imágenes pre-armadas
o generar propias (hoy veremos como)
(en lo cotidiano se da una mezcla de ambos enfoques)
Construir una imagen de Docker (y usarla)
Ejecutar un script php con el CLI del lenguaje sin tenerlo instalado en el Host. Para ello se creara una imagen que ejecute dicho contenedor
mkdir -p ~/webinar/construir-imagen/
cd ~/webinar/construir-imagen/
nano Dockerfile
FROM php:7-cli
COPY . /tmp/app
WORKDIR /tmp/app
CMD [ "php", "./script.php" ]
FROM indica desde que imagen base se construirá la nueva imagen que estamos definiendo
COPY copia los archivos indicados al momento de generar la imagen
source: https://docs.docker.com/engine/reference/builder/
WORKDIR establece el directorio actual (equivalente a cd)
CMD define el comando que se ejecutara por default al generar un contenedor
echo '<?php echo "Hola Mundo desde PHP\n";' > script.php
docker build --tag webinar/ejemplo-1 .
docker run webinar/ejemplo-1
Se crea el script de ejemplo
Se construye la imagen a partir del Dockerfile
Se genera un contenedor a partir de la imagen construida
Ciclo de Vida de un Contenedor
(o como ver que los contenedores son efímeros)
Entender que el ciclo de vida de los contenedores es efímero. Existen mientras dura un proceso ejecutado "en el" y luego se eliminan completamente. Se borra todo. No solo se borra lo que se hizo mientras estaba “vivo”. También se borran los datos generados en él
docker run -it alpine sh
Comando run en Docker CLI
docker run -it alpine sh
Comando CLI
docker run -it alpine sh
Imagen base
docker run -it alpine sh
opciones
docker run -it alpine sh
comando a ejecutar dentro
curl www.google.com
# Error!!!!!!
apk add curl
curl www.google.com
# Exito
exit
docker run -it alpine sh
¿Que es lo que hace el CLI de Docker?
Malas prácticas
Buenas prácticas
FROM alpine:latest
RUN apk add --no-cache curl
CMD curl www.google.com
docker run --rm curlimages/curl:7.72.0 www.google.com
Mejores prácticas!!!
Ejecución de servicios
Uno de los usos más populares de Docker es en el contexto de ejecutar servicios. Para Docker es un proceso más, con la diferencia que solo será detenido en caso de que el administrador lo haga explicito (vía comando stop).
docker run -d busybox /bin/sh -c "while true; do echo hello world; sleep 2; done"
docker run -d busybox /bin/sh -c "while true; do echo hello world; sleep 2; done"
comando
docker run -d busybox /bin/sh -c "while true; do echo hello world; sleep 2; done"
imagen
docker run -d busybox /bin/sh -c "while true; do echo hello world; sleep 2; done"
comando dentro del contenedor
docker run -d busybox /bin/sh -c "while true; do echo hello world; sleep 2; done"
opción
docker ps
docker logs <container_id>
docker logs -f <container_id>
docker stop <container_id>
docker rm <container_id>
¿Que limitaciones tiene Docker?
¿Porque Docker Compose?
Entornos multi-containers aislados entre si
LAMP: Linux, Apache, MySQL, PHP
MEAN: MongoDB, Express.js, Angular, Node.js
ELK: ElasticSearch, Logstash, Kibana
O lo que sea necesario
¿Como funciona?
Selección de
Imágenes
Propias
(Dockerfile)
Terceros
(Hub)
Definición del entorno
version: '2.0'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
docker-compose.yml
Build and
Run!!
version: '2.0'
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Formato yaml
Referencia y versiones
Versiona toda una pila de servicios...
... y sus interacciones
Puedo publicar mi app y que el resto la levanten sin mucho esfuerzo (salvo instalar Docker Compose)
Construir un entorno LAMP
mkdir -p ~/webinar/docker-compose/ejemplo-1
cd ~/webinar/docker-compose/ejemplo-1
echo "<?php phpinfo();" > index.php
vim docker-compose.yml
version: '3'
services:
web:
image: php:7.4.9-apache
ports:
- 8888:80
volumes:
- .:/var/www/html
links:
- 'db'
db:
image: mysql:8.0
volumes:
- mysql_volume:/var/lib/mysql
environment:
TZ: "Argentina/Buenos_Aires"
MYSQL_ALLOW_EMPTY_PASSWORD: "no"
MYSQL_ROOT_PASSWORD: "webinar-root-pass"
MYSQL_USER: 'webinar-user'
MYSQL_PASSWORD: 'webinar-pass'
MYSQL_DATABASE: 'webinar-db'
adminer:
image: adminer
ports:
- 8889:8080
volumes:
mysql_volume:
docker-compose up
Adaptar un entorno a necesidades propias
Se quiere incorporar en la imagen del contenedor de PHP del ejemplo 1, una libreria de PHP conocida como PDO. Esto cuenta como una personalización de un contenedor, y es lo que mostraremos en este ejemplo 2
version: '3'
services:
web:
image: php:7.4.9-apache
ports:
- 8888:80
volumes:
- .:/var/www/html
links:
- 'db'
...
version: '3'
services:
web:
build: .
ports:
- 8888:80
volumes:
- .:/var/www/html
links:
- 'db'
...
docker-compose.yml (ejemplo 1)
docker-compose.yml (ejemplo 2)
version: '3'
services:
web:
build: .
ports:
- 8888:80
volumes:
- .:/var/www/html
links:
- 'db'
...
docker-compose.yml
FROM php:7.4.9-apache
RUN docker-php-ext-install pdo pdo_mysql
Dockerfile
¿Que es docker-php-ext-install?
docker-compose build
docker-compose up
Despliegue completo del CMS Wordpress
Instalación de un software de tercero usando Docker Compose
version: '3.3'
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8888:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
docker-compose up -d
detached from process
docker-compose logs
docker-compose logs -f
docker-compose top
docker-compose ps
docker-compose stop
docker-compose start
docker-compose down
docker-compose down --volumes
¿Que lo caracterizaba?
Administradores que son los que conocen la infraestructura y los entornos
Los entornos se instalaron una vez y se van "actualizando", se los "cuida", tienen "nombre"
Si ocurre un problema o se rompe un server, generar el mismo entorno lleva tiempo
Los entornos no son "mascotas"
Son mas parecidos a "ganado"
Reproducibles en velocidad
Reproducibles en cantidad
Efimeros
Portables
Versionables
[1] T. Erl, R. Puttini, and Z. Mahmood, Cloud Computing: Concepts, Technology & Architecture, Edición: 1. Prentice Hall, 2013.
[2] J. Turnbull, The Docker Book: Containerization is the new virtualization, Edición: 18092. James Turnbull, 2014.
[3] Y. Brikman, Terraform: Up & Running: Writing Infrastructure as Code, Edición: 2. O’Reilly Media, 2019.
[4] O. Lamtzidis, “An IoT Edge-as-a-service (Eaas) Distributed Architecture & Reference Implementation,” 2019