CONTAINERS LAB
Fedora México
Alex Callejas
Senior Technical Support Engineer | Red Hat
Febrero 2019
About me
Alex Callejas
Senior Technical Support Engineer @Red Hat
@dark_axl
/rootzilopochtli
[Link]
2 Containers Lab
AGENDA
Containers Lab
Kernel-based Virtual Machine
Hipervisor KVM standalone
podman
Utilidad proporcionada como parte de la biblioteca libpod, para crear y mantener
contenedores.
buildah
Herramienta que facilita la creación de imágenes de contenedores OCI (Open Container
Initiative)
3 Containers Lab
Laboratorio de Pruebas
Laboratorio de Pruebas
Containers Lab
Mi configuración:
● Fedora 28
○ KVM
■ Cloud images
5 Containers Lab
Laboratorio de Pruebas
Containers Lab
Pre-requisitos:
● Procesador Intel con Intel VT-x e Intel 64 virtualization extensions for x86-based
systems; ó
● Procesador AMD con AMD-V y AMD64 virtualization extensions
# grep -E 'svm|vmx' /proc/cpuinfo
6 Containers Lab
Laboratorio de Pruebas
Containers Lab
Paquetes a instalar: Almacenamiento:
● qemu-kvm ● 5 - 10 Gb
● virt-manager ○ /var/lib/libvirt/images/
● virt-viewer
● libguestfs-tools
● virt-install
● genisoimage
7 Containers Lab
Virtualización y Contenedores
Máquinas Virtuales y Contenedores
Máquinas Virtuales Contenedores
VM aísla el hardware Container aísla el proceso
9 Containers Lab
Máquinas Virtuales y Contenedores
● Aislamiento de VM ● Aislamiento de contenedores
● OS completo ● Kernel compartido
● Computo estático ● Computo escalable
● Memoria estática ● Memoria escalable
● Alto uso de recursos ● Bajo uso de recursos
10 Containers Lab
Virtualización
11 Containers Lab
Arquitectura KVM
● Management: libvirt (virt tools, C
API, bindings, etc)
● qemu-kvm (user-level hardware
abstraction layer)
● KVM itself (linux kernel)
● Virtio paravirt drivers (Linux and
Windows)
● Spice paravirt drivers (linux and
windows
12 Containers Lab
Cloud Images
KVM y QEMU
QEMU soporta varios tipos de imágenes. El tipo "nativo" y más flexible es qcow2, que admite la
copia en escritura, el cifrado, la compresión y los snapshots de VM.
La forma más sencilla de obtener una máquina virtual que funciona con KVM es descargar una
imagen que alguien más ya haya creado:
● Fedora Cloud. Cloud Base Images [[Link]
● Atomic Host [[Link]
● OpenStack: Get images [[Link]
13 Containers Lab
Containers Lab
Creando VM’s - Fedora
Copiar imagen
$ sudo cp Fedora-Cloud-Base-29-1.2.x86_64.qcow2 /var/lib/libvirt/images/vmtest01.qcow2
Configurar VM
$ sudo virt-customize -a /var/lib/libvirt/images/vmtest01.qcow2 \
--hostname [Link] --root-password password:redhat \
--ssh-inject 'root:file:[Link]' --uninstall cloud-init --selinux-relabel
Importar VM
$ sudo virt-install --name vmtest01 --memory 1024 \
--vcpus 1 --disk /var/lib/libvirt/images/vmtest01.qcow2 \
--import --os-variant fedora29 --noautoconsole
14 Containers Lab
Containers Lab
Creando VM’s - Fedora
Abrir consola
$ sudo virsh console vmtest01
Listar / Apagar / Arrancar VM
$ sudo virsh list --all
$ sudo virsh [destroy | start] vmtest01
Eliminar VM
$ sudo virsh undefine vmtest01
15 Containers Lab
Containers Lab
Creando VM’s - Fedora
virt-viewer
$ virt-viewer --connect qemu:///system vmtest01 &
virt-manager
$ virt-manager &
16 Containers Lab
Containers
Un contenedor es la unidad de cómputo más pequeña
Los contenedores se crean a partir de imágenes
17 Containers Lab
Containers
Las imágenes del contenedor se almacenan en un registro de imágenes,
que contiene todas sus versiones
18 Containers Lab
¿Cómo funciona Docker?
Docker proporciona toda la funcionalidad necesaria para:
● Pull & push imágenes de un registro de imágenes
● Administrar contenedores locales:
○ Copy, add layers, commit & remove
● Pedir al kernel que ejecute un contenedor con el
name-space y cgroup correctos, etc.
Esencialmente, el demonio Docker hace todo el trabajo con
registros, imágenes, contenedores y el kernel. La línea de
comandos (CLI) de Docker le pide al demonio que haga
esto en su nombre.
19 Containers Lab
PODMAN
El enfoque de podman es simplemente interactuar
directamente con el registro de imágenes, con el
contenedor y el almacenamiento de imágenes, y con el
kernel de Linux a través del proceso de ejecución del
contenedor runC (no un demonio)
20 Containers Lab
PODMAN
podman está incluido en el último Fedora 29
Un CLI/API sin daemon para ejecutar, administrar y
depurar contenedores y pods OCI
● Rápido y ligero
● runC leverage
● Proporciona una sintaxis "tipo docker" para trabajar
con contenedores
● API de gestión remota a través de varlink
● Proporciona integración de sistemas y aislamiento
avanzado de namespace
21 Containers Lab
PODMAN
Primeros pasos
Instalar podman y buildah
# dnf -y install podman buildah skopeo
Bajar una imagen del registro e inspeccionarla
# podman pull [Link]/f29/httpd
# podman images
# podman inspect httpd
22 Containers Lab
PODMAN
Primeros pasos
Ejecutando el contenedor
# podman run httpd
Revisamos el proceso
# systemctl status podman
# podman ps
# podman ps -a
How does Docker generate default container names?
23 Containers Lab
PODMAN
Primeros pasos
Ejecutando el contenedor en background
# podman run --name myhttpservice -d httpd
Inspeccionamos el contenedor en busca de ip y puertos expuestos
# podman inspect myhttpservice | grep -i ipaddr
# podman inspect myhttpservice | grep expose-services
# curl [Link]:8080
24 Containers Lab
PODMAN
Inmutabilidad
Ejecutamos el contenedor en background
# podman run -d httpd
Ejecutamos bash dentro del contenedor (sesión interactiva)
# podman exec -ti c94e745f6414 /bin/bash
Creamos un archivo dentro del contenedor
bash-4.4$ echo "MySecretData" > [Link]
25 Containers Lab
PODMAN
Inmutabilidad
Detenemos el contenedor
# podman kill c94e745f6414
Ejecutamos el contenedor nuevamente y entramos en sesión interactiva
# podman run -d httpd
# podman exec -ti 40f5b5fd89bb /bin/bash
bash-4.4$ ls
26 Containers Lab
CONSTRUYENDO CONTENEDORES
¿Porqué usar buildah?
● Crea imágenes compatibles con OCI
● No daemon - sin socket docker
● No requiere un contenedor en ejecución
● Puede utilizar las suscripciones de hosts y otros
secretos
● Control preciso sobre los comandos y el contenido de
la capa (s)
● Una sola capa, desde cero, las imágenes se hacen
fáciles y aseguran un manifiesto limitado
● Si es necesario, puede mantener el flujo de trabajo
basado en Dockerfile
27 Containers Lab
CONSTRUYENDO CONTENEDORES
Probando buildah
Hola Mundo
# echo "hello world" > $(buildah mount $(buildah from
[Link]/fedora-minimal))/etc/[Link]
Revisamos la creación de la imagen base
# buildah containers
Hacemos commit a la imagen local
# buildah commit fedora-minimal-working-container fedora-hello
# buildah images
28 Containers Lab
CONSTRUYENDO CONTENEDORES
Probando buildah
Eliminamos la imagen base
# buildah delete fedora-minimal-working-container
Ejecutamos el contenedor
# podman run -ti localhost/fedora-hello:latest cat /etc/[Link]
hello world
29 Containers Lab
CONSTRUYENDO CONTENEDORES
Dockerfile
Creamos el Dockerfile
# Base on the Fedora
FROM [Link]/fedora
MAINTAINER darkaxl017 email [Link]@[Link] # not a real email
# Install httpd on image
RUN echo "Installing httpd"; dnf -y install httpd
# Expose the default httpd port 80
EXPOSE 80
# Run the httpd
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
30 Containers Lab
CONSTRUYENDO CONTENEDORES
Dockerfile
Ejecutamos buildah para la construcción de la imagen
# buildah bud -f Dockerfile -t fedora-httpd .
Revisamos la creación de la imagen
# buildah images
Probamos el contenedor
# buildah run $(buildah from fedora-httpd) httpd -v
31 Containers Lab
CONSTRUYENDO CONTENEDORES
Dockerfile
Ejecutamos el contenedor
# podman run -d fedora-httpd
Revisamos el proceso del contenedor
# podman ps
Revisamos los procesos
# ps auxf | tail -6
32 Containers Lab
CONSTRUYENDO CONTENEDORES
Dockerfile
Validamos el servicio
# curl localhost
curl: Failed to connect to localhost port 80: Connection refused
Revisamos los logs del contenedor
# podman logs 517495e24317
Revisamos los puertos
# netstat -tulpn
33 Containers Lab
CONSTRUYENDO CONTENEDORES
Dockerfile
Detenemos el contenedor y ejecutamos el contenedor exponiendo el puerto
# podman run -d -p 80:80 fedora-httpd
Validamos el servicio
# curl localhost
34 Containers Lab
Persistent Storage
Los contenedores son efímeros...
Creamos directorio compartido para el contenedor
# mkdir -p /opt/var/www/html ; cd /opt/var/www/html
Creamos el contenido a compartir
# wget --page-requisites --convert-links [Link]
Ejecutamos el contenedor compartiendo puerto y directorio
# podman run -d --name myhttpservice -p 8080:8080 -v
/opt/var/www/html:/var/www/html:Z [Link]/f29/httpd
35 Containers Lab
Containerized System Services
Los contenedores son portátiles y están listos para usar: ¿por qué no usarlos como servicios del sistema?
/etc/systemd/system/[Link]
[Unit]
Description=Just a http service with Podman Container
[Service]
Type=simple
TimeoutStartSec=30s
ExecStartPre=-/usr/bin/podman rm "myhttpservice"
ExecStart=/usr/bin/podman run --name myhttpservice -p 8080:8080 -v
/opt/var/www/html:/var/www/html:Z [Link]/f29/httpd
ExecReload=-/usr/bin/podman stop "myhttpservice"
ExecReload=-/usr/bin/podman rm "myhttpservice"
ExecStop=-/usr/bin/podman stop "myhttpservice"
Restart=always
RestartSec=30
[Install]
WantedBy=[Link]
36 Containers Lab
Containerized System Services
Los contenedores son portátiles y están listos para usar: ¿por qué no usarlos como servicios del sistema?
Refrescamos systemd
# systemctl daemon-reload
Revisamos status del servicio
# systemctl status [Link]
Iniciamos el servicio
# systemctl start [Link]
# systemctl status [Link]
37 Containers Lab
Podman pods
Lo que necesitas saber
El concepto de Pod fue introducido por Kubernetes. Los podman pods
son similares a esa definición.
● Cada podman pod incluye un contenedor "infra"
○ Mantiene los namespaces asociados con el pod y permite a
podman conectarse a los otros contenedores
○ Se basa en la imagen [Link]/pause
○ Se le asignan los port bindings, cgroup-parent values, y
kernel namespaces del pod
○ Una vez que se crea el pod, estos atributos se asignan al
contenedor "infra" y no se pueden cambiar
● Cada contenedor tiene su propio monitor (conmon)
○ Monitorea el proceso primario del contenedor y guarda el
exit code si se termina o muere el contenedor
○ Permite que podman se ejecute en modo detached
(background)
38 Containers Lab
Podman pods
Primeros pasos
Creamos el podman pod
# podman pod create
Listamos los pod’s
# podman pod list
Agregamos un contenedor al pod y lo revisamos
# podman run -dt --pod container_name [Link]/library/alpine:latest top
# podman ps -a --pod
39 Containers Lab
Podman pods
Ejemplo práctico: MariaDB container
Creando el podman pod
# podman run -dt -e MYSQL_ROOT_PASSWORD=x --pod new:db
[Link]/f28/mariadb:latest
Revisamos el status de los pod’s
# podman pod ps
Agregamos un contenedor al pod y revisamos la base de datos
# podman run -it --rm --privileged --pod db [Link]/library/alpine:latest /bin/sh
/ # apk add mariadb-client / # mysql -u root -P 3306 -h [Link] -p
40 Containers Lab
Podman pods
Siguientes pasos?
41 Containers Lab
Podman pods
Siguientes pasos: ejemplo práctico
Creamos un contenedor demo y lo validamos
# podman run -dt -p 8000:80 --name demo [Link]/libpod/alpine_nginx:latest
# podman ps # curl [Link]
Generamos snapshot para crear el archivo YAML de Kubernetes
# podman generate kube demo > [Link]
Con el archivo yml podemos recrear el contenedor/pod en kubernetes
# kubectl create -f [Link]
42 Containers Lab
Kubernetes
Configuración inicial
● Fedora (Single Node) -
[Link]
● Introduction to Kubernetes with Fedora -
[Link]
● Clustered computing on Fedora with Minikube -
[Link]
43 Containers Lab
Referencias
Links y documentación
● Fedora Classroom: Containers 101 with Podman
● Getting Started with Buildah
● Managing containerized system services with Podman
● Podman: Managing pods and containers in a local container runtime
● Podman can now ease the transition to Kubernetes and CRI-O
● [Link]
● [Link]
● [Link]
● [Link]
● Daniel Walsh - @rhatdan
44 Containers Lab
Gracias!
[Link]/latam
[Link]
[Link]