Docker

 

Docker - características

  • No es virtualización
  • Sandbox
  • Solo aplicación
  • Imágenes
  • Rápida paso testing - producción
  • Integración con CI
  • Portabilidad - Imágenes de la nube
  • Docker como contenedor de aplicaciones
Docker corre procesos NO CORRE INSTANCIAS DE SERVIDORES

Arquitectura de Docker

Arquitectura de Docker

Arquitectura de Docker

Docker client

  • Interfaz de usuario
  • CLI, web, etc...
  • API proveída por el engine

Arquitectura de Docker

Docker daemon

  • API
  • Mantiene los containers
  • Puede o no correr en el mismo equipo

Arquitectura de Docker

Docker Registry

  • No controlado por nosotros
  • Distintos proveedores
  • Imagenes oficiales y no oficiales
  • Punto de partida
  • AMI

Componentes de Docker

Componentes de Docker

  • Imágenes:
    • templates
    • RO
  • Containers
    • Instancias de las imagenes
    • No copias
    • Capas
    • Código
    • No existen si no salen de una imagen
    • Como un direcotrio: Todo lo necesario para que corra una app

Componentes de Docker

  • Registries
    • Donde viven las imágenes
    • Docker Hub
    • ECR
  • Capas
    • UFS - branches
    • Squash
    • Historial
    • Imagen nueva = solo updates de la imagen

Ahora, ¿Como funciona todo junto?

Instalación, comandos básicos y ejecución de containers

Instalación

apt-get install curl
curl -sSL https://get.docker.com/ | bash

Directorio principal

/var/lib/docker

Acceso no root

groupadd docker
usermod -aG docker <usuario>

Docker Hub

https://hub.docker.com/

Login Docker hub

docker login

Revisando los tres componentes: containers - imágenes - registry

docker images
docker ps
cat .docker/config.json 
docker run debian:jessie /bin/echo 'Hello world'
docker ps -a

Descargando una imagen

Corriendo un container

docker pull debian:jessie
docker images

Eliminación

docker rm <id o nombre>
docker rmi <id o nom:tag>
docker stop <id>
docker start <id>

Detener y levantar

docker run -d ubuntu:latest \
/bin/sh -c "while true; do echo hello world; sleep 1; done"

Container demonizado y si no tenemos la imagen

docker logs -f <id>

Ver logs

Revisión de procesos containers, etc...

docker top <id>
docker inspect <id-container>
docker inspect <id-imagen>
docker inspect -f '{{ .NetworkSettings.IPAddress }}' <id-conainer>

Ejemplo de ejecución de un container con opciones

docker run -d \
--name caba-web-training \
--hostname caba-web-training \
-p 5000:5000 \
training/webapp \
python app.py
docker exec -it caba-web-training  echo "Hola mundo"
docker exec -it caba-web-training  /bin/bash

Ejecutando comandos en el container

Revisión de procesos containers, etc...

docker run -d \
-e AUTOR="Line 64" \
-e NOMBRE="Ale Drabenche" \
--name caba-web-training \
--hostname caba-web-training \
-p 5000:5000 \
training/webapp python app.py

Ejemplo de ejecución de un container con opciones

docker run -d \
--name caba-web-training \
--hostname caba-web-training \
-p 5000:5000 \
training/webapp \
python app.py
docker exec -it caba-web-training  /bin/bash
echo $AUTOR
echo $NOMBRE

Ejecutando comandos en el container

Volumen

Editemos el app.py y hagamos restart

mkdir /srv/containers/caba-web-training -p

docker run -d \
--name caba-web-training \
--hostname caba-web-training \
-v /srv/containers/caba-web-training:/opt/webapp \
-p 5000:5000 \
training/webapp \
python app.py
docker restart caba-web-training

Dockerfile y build de nuestras propias imágenes

Dockerfile

Dockerfile y construcción de imágenes

FROM: Imagen base

MAINTAINER: Quien mantiene esta imagen

ENV: Variables de Entorno

RUN: Comandos que se ejecutan antes del run

EXPOSE : Puertos en los que escuchará el container

ADD o COPY: Copia archivos locales al container; pero ADD tiene la chance de
descomprimirlo

CMD: Instrucción para correr la aplicación.

ENTRYPOINT: Como se desea correra la aplicación. Generalmente
es ENTRYPOINT CMD para los parametros

WORKDIR: Cambiamos el Directorio en el cual trabajamos

Ejemplo

Crear un archivo Dockerfile

FROM ubuntu:14.04
MAINTAINER Alejandro Drabenche <alejandro.drabenche@line64.com>

RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q python-all python-pip 
ADD ./webapp/requirements.txt /tmp/requirements.txt
RUN pip install -qr /tmp/requirements.txt
ADD ./webapp /opt/webapp/

WORKDIR /opt/webapp

EXPOSE 5000

CMD ["python", "app.py"]

Ejemplo

Armando la imagen

docker build -t caba-web:v1 .
docker build -t adrabenche/caba-web:v1 .
docker push adrabenche/caba-web:v1

Armando la imagen; pero con push al registry

¿Por que las imagenes tienen el mismo id?

Clonamos el repo:

git clone https://github.com/docker-training/webapp.git

Ejemplo práctico - LAMP

Ejemplo práctico - WORDPRESS

docker login adrabenche


docker run -d --name caba-mysql-wordpress \
-e MYSQL_ROOT_PASSWORD=linux \
-p 3306:3306 \
mysql:5.7


docker run -d --name caba-web-wordpress \
--hostname caba-web-wordpress \
-p 80:80 \
-e WORDPRESS_DB_HOST=192.168.1.208 \
-e WORDPRESS_DB_USER=root \
-e WORDPRESS_DB_PASSWORD=linux \
wordpress

Y listo

Veamos de donde sale todo esto

  • Mi repositorio github
  • Clonar
  • Hacer cambio y armar nueva imagen
  • Si funciona, pushearla al repo de Docker Hub
Made with Slides.com