Este documento describe los conceptos fundamentales de Docker, incluyendo imágenes, contenedores, volúmenes, redes y Dockerfiles. Explica cómo Docker agrega capas de sólo lectura y sistemas de archivos de copia de escritura para permitir la creación eficaz de imágenes y su compartición. También cubre estrategias como el uso de contenedores para datos, desarrollo continuo, escalamiento y adopción gradual de Docker.
3. Modelos de aislación de aplicación
Kernel
Procesos
Network
IPC
Filesystem
Global
Imágen R/O
Filesystem
Contenedor
Filesystem
Chroot
Procesos
Network
IPC
Procesos
Network
IPC
FS R/W
Hardware
Hardware Emulado
Kernel VM
Procesos
Network
IPC
Filesystem
VM
Nativo Chroot Container Docker VM
+
4. Que agregó Docker a Contenedores
Union fs, imágen read-only + filesystem escribible (CoW)
Imágenes fáciles de generar, derivar de otras, compartir y versionar
Orientado a correr programas individuales, no sistemas
Interface CLI intuitiva y simple, API REST, ejecutable sin dependencias
Red por defecto
enmascaramiento de acceso a red
exposición explícita de puertos
Ecosistema y comunidad muy activos
5. Docker Filesystem
Potencialmente muchas capas
Imagen sólo lectura
Se pueden compartir imágenes (registry)
Contenedor escribible asociado
Volúmenes sin versionado
Diferentes FS base
AUFS (union fs, CoW de archivos)
Device Mapper (ThinP, CoW de bloques)
BtrFS (subvolumes, snapshots)
Mas a futuro (ZFS, OverlayFS, etc)
Depende de distribución/disponibilidad
Comparación en Project Atomic
6. Imágenes
Obtención/Creación
docker pull/run de Docker Hub, o
Docker registry propio
docker commit contenedor->imagen
docker export -> .tgz -> docker import
Crearlas a partir de Dockerfiles
Pueden tener capas a su vez
“Herencia” entre capas ya creadas
Capas “padre” están 1 sola vez en
disco/cache
Apuntar a menor tamaño busybox<alpine
<debian<ubuntu
Ubuntu 14.04 +npm +aplicación 1
+jvm
+aplicación 3
+aplicación 2
+memcache
CentOS 6
+jboss
+ruby 1.9.1
+ruby 2.1.4
+aplicación 4
+aplicación 5
7. Que se define en este ejemplo?
Imagen base (con versión)
Variables de entorno para construcción
Comandos a ejecutar en construcción
Archivos a agregar
Volúmenes del contenedor
Puertos que se exponen
Comando que se ejecuta por defecto
Cada línea operativa agrega capa, usar
volúmenes para directorios transitorios
Dockerfiles
FROM ubuntu:trusty
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update &&
apt-get -yq install mysql-server-5.6
ADD my.cnf /etc/mysql/conf.d/my.cnf
ADD run.sh /run.sh
VOLUME ["/etc/mysql", "/var/lib/mysql"]
EXPOSE 3306
CMD ["/run.sh"]
docker build <directorio del dockerfile> --tag mysql
8. Volúmenes
docker run …
-v /opt/c/mysql1data:/var/lib/mysql ....
Directorio del disco -> directorio del contenedor
docker run …
--volumes-from contenedor1 …
Usa volúmenes de otro contenedor
(contenedor1 no tiene porque estar corriendo)
Filesystem
Contenedor
/opt/c/mysql1data/var/lib/mysql
Contenedor Contenedor1
/var/lib/mysql /var/lib/mysql
Usos: backups, crons, transporte, área de compartición entre varios contenedores, captura de
logs, persistir datos en SAN/NFS, filesystems distribuidos, etc
9. Networking
Modo bridge (net=bridge/defecto)
Crea bridge docker0
Contenedores en subnet
detrás del bridge
Puertos expuestos
enmascarados en eth0
172.17.0.2 172.17.0.3
172.17.42.1
200.40.133.133
contenedor 1
eth0
docker0
contenedor 2
Modo host (net=host)
Usa la red del host
Publica directamente servicios en la misma interfaz de red
Modo none (net=none)
No configura la red
Útil para configurar red por nuestros propios medios
después, o usos que no requieren red
Modo container (net=container_id)
Similar a modo host, pero usa la red de otro contenedor,
previamente creado, en vez de la del host
“eth0”
10. Enlaces entre contenedores
Contenedor1
docker run -p <puerto> --name Contenedor1 ...
Dockerfile EXPOSE <puerto>
Contenedor2
docker run --link Contenedor1 ...
● <puerto> es accesible directamente
● variables de entorno que dicen puerto/ip
● /etc/hosts contiene Contenedor1
Contenedores “embajador” sirven de puente para enlazar contenedores entre distintos
servidores físicos/VMs
Contenedor1 Contenedor2Embajador1 Embajador2
11. Agrupando contenedores
wordpress:
image: wordpress
links:
- db:mysql
ports:
- 8080:80
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: example
● Trata varios contenedores como una
unidad
● Define cómo se construye/obtiene
c/u
● Define puertos y volúmenes
compartidos
● Permite definir variables de entorno,
como se ve el grupo desde afuera
● archivo de definición yaml
Docker-compose
12. Algunas herramientas para redes
docker-machine
Prepara máquinas/vms para correr docker
docker-swarm/fleet/etc
distribuye contenedores entre máquinas
Consul
directorio dinámico de servicios
Kubernetes
Ejecución de grupos de contenedores en clúster
13. Donde correrlos?
Cluster
Mesosphere
RedHat Openshift
Openstack/Magnum
Amazon ECS
Google Compute engine
IBM Bluemix
PAAS varios (Flynn, Deis,
etc)
etc
Maquina
Cualquier linux con kernel
reciente corre
Distribuciones orientadas a
contenedores
CoreOS
Rancher
Atomic OS
Ubuntu Snappy
VMWare Photon
Intel ClearLinux
15. Que debería tener un contenedor?
imagen
conf datos
● Inmutable
● En repositorio privado/público
● Dockerfile para crearla
● Versionada
● aplicación sigue 12factor.net
● Pasada x entorno/
etcd/ volúmenes/
línea de comando
● Depende/informa
de contexto
● Dónde están mis
datos?
● Debug info?
● Claves/certs
● En volúmenes
● Distintos sets de datos
● Accesible desde distintos
procesos/contenedores
● Respaldos/crons trabajan fuera
de este contenedor
Contenedor
ideal
16. Backups
imagen
conf datos
● Definido en Dockerfile
● Respaldado en repositorio
● Solo cuando se (re)construye
● Versionado en
git
● Sólo cuando hay
cambios de
configuración
● Lo que importa
respaldar o distribuir
● En volúmenes
18. Continuous Delivery
Configuración/Datos pueden variar dependiendo del contextoDesarrollo
Testing QA Staging Producción
Imagen se mantiene inmutable en todo el proceso UsuariosRouter
Las etapas pueden correr en distintos equipos físicos, uso de registry para transporte
20. docker run -v /server/datos --name datacontainer1 tianon/true /bin/true
Contenedores de datos
Server
Backup
Reportes
cron
shell
125 bytes
● No depende de donde queda en host
● Permisos/uid/gid consistentes
● No tienen que estar corriendo un
proceso para usarse
inicialización
Data
container
21. NO usar como VMs
Monitoreo
● No correr agente
● /sys/fs/cgroup para métricas
● Monitorear aplicación/puertos
● Sysdig
Logs
● Montar /dev/log como volumen y usarlo desde otro
contenedor con (r)syslog (syslog-docker)
● docker logs muestra stdout/stderr de lo que corre
dentro
Acceso a contenedor en ejecución
● No correr sshd en contenedor
● Usar docker exec para shell/comando
● Usar volúmenes para archivos que
tengan que ser accedidos por otros
procesos/contenedores (cron, backup)
Invocación
● Se pueden crear y descartar muy rápido
● Eficientes en memoria, pueden quedar
cargados y enviarles tráfico desde
balanceador cuando se precisen
● Fácil iterar con ellos
● Persistencia vía volúmenes
22. Adopción gradual
Convivencia con HW/SW existente
Implementación de nuevos servicios
Necesidad de correr apps que requieren librerías/
dependencias diferentes/ conflictivas con lo instalado
Agilizar desarrollo/ testing/ QA
Replicación sistemas/ servicios para testear cambios/
configuraciones
Implica cambio de mentalidad, no forzar si no se entiende
23. Pequeña escala
Pruebas limpias de software/servicios
Aislación de aplicaciones en escritorio
Alternativa a manejo de paquetes
Instalación simple de sistemas complejos
Replicación ambientes de producción
Entornos rápidos de otras distribuciones