Creada por Alejandro Escanero Blanco / Twitter: @aescanero Documentación y demo en https://github.com/aescanero/dockerevents/opensouthcode Presentación en Disasterproject
Fuente: What even is a container: namespaces and cgroups
Fuente: Cgroups, namespaces, and beyond: what are containers made from?
Fuente: Native Landscape (CNCF and OCI)
Fuente: INTRODUCING MOBY PROJECT
Fuente: Top 5 challenges with deploying containers in production
Fuente: DevOps, Microservices and containers - a high level overview
Los Engine ("Nodos" en modo Swarm) Docker se configuran para distribuir la carga y tendremos dos tipos.
Aquellos Nodos que se mantienen la configuración de todos los servicios Docker son los "Manager", se configuran para que se comuniquen entre ellos usando el protocolo Raft
Uno de los Managers será elegido lider, mientras que el resto son elegibles.
Todos los Nodos (incluso los Managers) reciben y ejecutan tareas enviadas por los Manager
Fuente: Raft consensus in swarm mode
Fuente: DevOps, Microservices and containers - a high level overview
Fuente: Swarm mode key concepts
Iniciando el primer nodo manager en la IP 192.168.8.2, nos devolverá un "token" que usaremos
para conectar los nodosdocker swarm init --advertise-addr "192.168.8.2" --listen-addr "192.168.8.2:2377"
Procedemos a consultar que "token" es necesario para añadir nuevos Managers
docker swarm join-token manager
Añadimos un nuevo manager con la IP 192.168.8.3
docker swarm join --advertise-addr "192.168.8.3" --listen-addr "192.168.8.3:2377" --token $key 192.168.8.2
Añadimos el resto de nodos no Manager
docker swarm join --token $key 192.168.8.2
Un resultado de un conjunto de nodos con dos Manager, podemos ver cual es el lider y que los
nodos están en Down (estan apagados)swarm-master-1:~$ sudo docker node ls ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS 1jl7pgsx23vpxnet7lvsyq9yf swarm-node-3 Down Active 5p00x5dn53xfz33v8ad1jwiyq swarm-node-2 Down Active mjxf52vga4t47ns92ym7pq8xq swarm-node-1 Down Active o7az8ubf8sk8yb9jp18gz53w8 * swarm-master-1 Ready Active Reachable q19pfkrgd2nphqmj1yd0wp2yz swarm-master-2 Ready Active Leader
Fuente: Docker Reference Architecture: Designing Scalable, Portable Docker Container Networks
Creamos dos redes overlay
sudo docker network create -d overlay be
sudo docker network create -d overlay fe
Comprobamos que efectivamente se despliegan
sudo docker network ls
NETWORK ID NAME DRIVER SCOPE
p13bh7pilb71 be overlay swarm
cca979284ca2 bridge bridge local
abedd882c417 docker_gwbridge bridge local
2k04q42d8l9v fe overlay swarm
0fab68cf1222 host host local
jsh8aaw7nebr ingress overlay swarm
3fba02d48df4 none null local
Fuente: How services work
Fuente: Attach services to an overlay network
Fuente: Reference Architecture: Universal Control Plane 2.0 Service Discovery and Load Balancing
Creamos un servicio para el registro
sudo docker service create --constraint=engine.labels.myproject.service==fe --endpoint-mode vip \
--network fe --publish 5000:5000 --restart-condition any --name registry registry:2
Comprobamos que efectivamente se despliega
sudo docker service list
ID NAME MODE REPLICAS IMAGE
qb5wpzv0z077 registry replicated 1/1 registry:2
Comprobamos donde se despliega
sudo docker service ps registry
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
sxuhruy385t3 registry.1 registry:2 swarm-master-2 Running Running about a minute ago
La dirección VIP es el nombre del servicio
/ # ping registry
PING registry (10.0.1.2): 56 data bytes
64 bytes from 10.0.1.2: seq=0 ttl=64 time=0.094 ms
Los contenedores que forman el servicio se publican como tasks.SERVICIO
/ # nslookup tasks.registry
Name: tasks.registry
Address 1: 10.0.1.3 8cad19f2c5dd
Fuente: Overview of Docker Compose
Fuente: Compose file version 3 reference
Ejemplo
version: '3.1'
services:
ldap:
image: localhost:5000/myproject:ldap_v1
deploy:
mode: replicated
replicas: 3
restart_policy:
condition: on-failure
placement:
constraints:
- engine.labels.myproject.service == be
resources:
limits:
cpus: '0.1'
memory: 100M
reservations:
cpus: '0.01'
memory: 50M
networks:
- be
fd:
image: localhost:5000/myproject:fd_v1
deploy:
placement:
constraints:
- engine.labels.myproject.service == fe
resources:
limits:
cpus: '0.1'
memory: 300M
reservations:
cpus: '0.01'
memory: 200M
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 1m30s
timeout: 10s
retries: 3
networks:
- fe
- be
ports:
- "3100:80"
tty: true
networks:
fe:
be:
Fuente: Container Performance Analysis
Fuente: Monitoring Docker Swarm with cAdvisor, InfluxDB and Grafana
Fuente: Configure logging drivers