Docker Ecosystem
by @mario21ic
Agenda
Docker Engine
Docker Compose
Docker Machine
Docker Swarm
Docker Registry
Docker Engine
El problema
Solución
Docker Engine
Una plataforma abierta para aplicaciones distribuidas para developers y sysadmins
Desarrollado inicialmente en Python y migrado a Go
Servidor - Cliente
Open source
Docker Engine
Docker Engine
Demo Images: search & pull• En cli ejecutar:
$ docker search alpine
$ docker pull alpine:latest
• Verificar:
$ docker images
Demo Container: Hello• En cli ejecutar:
$ docker run -ti debian echo "Hello from container"
• Verificar en otro terminal:
$ docker ps -a
Docker Hub
Demo Container: Bash• En cli ejecutar:
$ docker run -ti debian:latest /bin/bash
• Verificar en otro terminal:
$ docker ps
Demo Container: Forward port• En cli ejecutar:
$ docker run --name mynginx -p 8080:80 -d nginx
• Abrir browser:
http://localhost:8080/
Demo Container: Volume• En cli ejecutar:
$ docker run --name mynginx -v $(pwd)/html:/usr/share/nginx/html -p 8080:80 -d nginx
• Abrir browser:
http://localhost:8080/
Container save as Image• En cli ejecutar:
$ docker run --name container_debian -ti debian bash
# echo "hello from container debian"
• En otro terminal:
$ docker commit container_debian debian_hola
• Verificar:
$ docker images
Dockerfile
Y como genero mi propio Docker Image personalizado?
Dockerfile• Generar archivo Dockerfile con contenido:
FROM nginx:latest
MAINTAINER Mario Inga <[email protected]>
!
RUN echo 'Building from Dockerfile'
COPY html/index.html /usr/share/nginx/html/index.html
Dockerfile• Ejecutar:
$ docker build -t image_from_dockerfile:latest .
• Verificar: $ docker images
• Usar:
$ docker run --name newcontainer -p 8088:80 -d image_from_dockerfile
Docker Link• Ejecutar:
$ docker run --name some-mysql -e MYSQL_ROOT_PASSWORD=myclavesecreta -d mysql:latest
$ docker run --name some-wordpress --link some-mysql:mysql -p 8080:80 -d wordpress
• Browser: http://localhost:8080/
Docker Compose
ProblemaContainers aislados
Configurar la ip cada vez que reinicia
Compartir configs
Construir cada Image desde Dockerfile
Escalar un container
Docker ComposePermite una facil orchestacion entre containers
Configuracion en un "docker-compose.yml"
Desarrollado en Python
Instalacion: pip install docker-compose
docker-compose.ymlnginx:
build: .
volumes:
- ./html:/usr/share/nginx/html
ports:
- "8080:80"
docker-compose.ymlwordpress:
image: wordpress
links:
- db
ports:
- 8080:80
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: example
Docker Compose
Demo
docker-compose.ymlweb:
image: odoo:8
volumes:
- ./odoo_vps:/mnt/extra-addons/odoo_vps
links:
- db
ports:
- "8069:8069"
db:
image: postgres:latest
environment:
POSTGRES_USER: odoo
POSTGRES_PASSWORD: odoo
Docker Compose
Demo
Docker Machine
Docker MachinePara la manipulacion de Docker hosts
Provee Docker hosts para: Digital Ocean, VirtualBox, Azure, Amazon, etc
Integración nativa con Docker Swarm
Docker Machine
Demo
Docker MachineCrear Host:
$ docker-machine create -d virtualbox devopsday
Listar: $ docker-machine list
Conectar:
$ eval "$(docker-machine env devopsday)"
Verificar: docker info
Docker MachineProbar:
$ docker run apline echo 'Hello from Machine'
Deploy:
$ docker-compose up
Docker Swarm
Docker Swarm
Cluster de forma nativa
Permite programacion
Discovery mediante TOKEN
Requiere de Master y Nodes
Docker Swarm
Demo con Docker Machine
Docker SwarmCrear token: $ docker run swarm create
Crear nodo master:
docker-machine create \
-d virtualbox \
--swarm \
--swarm-master \
--swarm-discovery token://<TOKEN> \
swarm-master
Docker SwarmCrear nodo agent-00:
$ docker-machine create \
-d virtualbox \
--swarm \
--swarm-discovery token://<TOKEN> \
swarm-node-00
Docker SwarmCrear nodo agent-00:
$ docker-machine create \
-d virtualbox \
--swarm \
--swarm-discovery token://<TOKEN> \
swarm-node-01
Docker SwarmConectarse a cada nodo:
$ eval "$(docker-machine env swarm-node-00)"
$ eval "$(docker-machine env swarm-node-01)"
Conectarse al master:
$ eval "$(docker-machine env --swarm swarm-master)"
Docker SwarmLanzar en cada nodo:
$ watch docker ps -a
En el master:
$ docker info
$ docker run alpine echo 'hello swarm 1'
$ docker run alpine echo 'hello swarm 2'
$ docker run alpine echo 'hello swarm 3'
Docker Registry
Docker Registry
Docker Registry
docker run -d -p 5000:5000 --restart=always --name registry registry:2
docker pull ubuntu && docker tag ubuntu localhost:5000/ubuntu
docker push localhost:5000/ubuntu
docker pull localhost:5000/ubuntu
Preguntas?