Preparación de entorno de pruebas local para docker
Conseguir imagenes en docker hub desde la terminal

Uso básico de docker

uso básico de docker

3 componentes de Docker-engine (Aplicación cliente-servidor)

  • Docker Engine – Demonio que corre sobre distro Linux y expone una API externa para la gestión de contenedores e imágenes
  • Docker Client – Cliente en línea de comandos (CLI) que gestiona Docker Engine local o remoto.
  • Docker Registry – Almacena las imágenes generadas por Docker Engine. Podemos distribuir nuestras imágenes o tenerlas en un registro privado. Se pueden publicar en Docker Hub

Además:

  • Imagen. Sistema de archivos de un SO con la aplicación instalada. El sistema de archivos que forman las imágenes puede tener varias capas, cada capa son implementaciones que se le da a la imagen.
  • Contenedores. Partición aislada dentro de un SO. Beneficios similares a las MV, como seguridad , almacenamiento y aislamiento de redes, pero además requiere menos recursos HW y son más rápidos de gestionar. Se pueden reutilizar los componentes. Minimiza impacto de errores o cambios.
  • Docker. Gestiona contenedores especificamente preparados para correr aplicaciones. Existen contenedores de sistema, como Linux containers. Virtualización ligera.
  • Registry Docker Hub. Repositorio de imágenes.

Comandos gestión imágenes

  • docker images – muestra las imágenes que tenemos instaladas
  • docker history – Los cambios de una imagen hasta el estado actual
  • docker inspect – Muestra descripción detallada de las caracteristicas de la imagen
  • docker save/load – Guarda y cargar una imagen.
  • docker rmi – Borrar una imagen

Comandos gestión de contenedores

  • docker attach – Nos agregamos a un contenedor
  • docker exec – para ejecutar comando en un contenedor
  • docker inspect – Caracteristicas del contenedor
  • docker kill – matamos un contenedor
  • docker logs – vemos los registros
  • docker pause/unpause
  • docker port
  • docker ps
  • docker rename
  • docker start/stop/restart
  • docker rm – para poder borrar un contenedor debe estar parado
  • docker run – MAS IMPORTANTE. Ejecuta o instancia una contendor a partir de una imagen
  • docker stats – estadísticas
  • docker top – Monitorización de Procesos
  • docker update – actualización de un contenedor

Probando docker

Cuando empezamos a poner comandos se van añadiendo capas (imágenes) por cada comando. Probamos un hello world:

docker run debian /bin/echo "Hello World"

El contenedor training/webapp https://hub.docker.com/r/training/webapp

Ejecutar el demonio en segundo plano

docker run -d -p 81:5000 training/webapp python app.py

Mostrar la última imagen ejecutada:

docker ps -l

Esto ejecutaría una prueba «Hello world» en el servidor (localhost o ip) y el puerto 81

Añadir funcionalidades a nuestras imágenes

Con comandos

Entrar en el shell de una imagen para introducir comandos:

docker run -t -i eboraas/apache-php /bin/bash

Una vez dentro, cada comando es una capa de imagen que se le da al contenedor.

Ejemplo instalar una librería apache una vez dentro:

apt update && apt install -y libapache2-mod-passenger

Salimos con exit

Comprobamos que están en procesos

docker ps -a

Para el control de versiones se le añade un comentario y autor

docker commit -m «Añadido soporte passenger» -a «Antonio Sanchez» id-contenedor xanxess/apache-php-passender:latest

Con dockerfiles

Crear y configurar un fichero dockerfiles https://docs.docker.com/engine/reference/builder/#dockerfile-reference

Construir la imagen con el comando

docker build

Crear un archivo para docker file:

# Dockerfile para la creación de imagen de apache + php + passenger
FROM eboraas/apache-php:latest

MAINTAINER Antonio Sanchez <axanxess@openwebinars.net>

RUN apt-get update && apt-get install -y libapache2-mod-passenger

Después se ejecuta el fichero

docker build -t ignoto/apache-php-passender:v1 .

Docker Hub

Crear repositorio:

  1. Botón Create repository
  2. Rellenar nombre y descripción corta
  3. Visibilidad Public
  4. Botón Create

Subir imagen al repositorio:

  1. Crear un tag de la imagen
  2. Login en Docker Hub
  3. Subir imagen

Comandos:

  1. docker tag
  2. docker push
  3. docker pull
  4. docker login

Networking en docker

3 tipos de redes:

  • Bridge (driver bridge). Red por defecto. Interfaz puente
  • Host (driver overlay). Para enlazar diferentes tipos de contenedores
  • none. Para aislar un contenedor sin red.

Con docker network ls podemos ver las redes que tenemos

ifconfig tendremos la red bridge con la interfaz docker0. Es un segmento de red

Comandos networking

  • Docker network connect/disconnect
  • docker network create
  • docker network inspect
  • docker network ls
  • docker network rm

Redes bridge

  • Aislar segmentos de red
  • Se añaden o quitan contenedores en cada segmento
  • Los contenedores se comunican sólo dentro de la red pero no entre redes
  • Un contenedor añadido a dos redes se comunica con los miembros de ambas redes.
  • Un contenedor con varias redes tiene salida externa con la primera red no interna, en orden léxico

Links

Bridge es una red especial que permiten link entre contenedores. No es necesario exponer puertos, descubren los servicios y transfiere información de forma segura. Importante el uso de nombres. Utiliza variables de entorno para almacenar datos.

Práctica de networking

Lanzamos un contenedor

docker run -d -P --name training/webapp python app.py

Comprobamos que está en procesos

docker ps

Inspeccionamos con

docker inspect web

vemos que coinciden las ip de las interfaces

ifconfig docker0

Paramos el contenedor

docker stop web

y borramos

docker rm web

Con esto veremos las redes

docker network ls

Y vemos que la red que da es por defecto.

Podemos inspeccionar alguna red con

docker network inspect id-Red

Y podremos ver los container conectados a esa red.

Vamos a crear una red propia con

docker network create -d bridge redlocal

Ahora la veremos en la lista

docker network ls

Si le hacemos una inspect veremos que tiene una ip diferente. Si consultamos las interfaces con ifconfig veremos que se ha creado un nuevo bridge con esa ip

Podemos lanzar un contenedor con la red creada

docker run -d --network=redlocal --name web1 eboraas/apache-php

Podemos verlo en procesos

docker ps

Y podemos inspeccionarlo

docker inspect id-contenedor

Creamos otro contenedor igual con la red original

docker run -d --name web2 eboraas/apache-php

Vamos a añadir otra capa a la web1

docker exec -ti web1 /bin/bash

Una vez dentro hacemos ping a la ip de web2

ping ip-web2

Para hacerlo tendremos que instala el paquete para hacer ping

apt update && apt install iputils-ping

Después ya podrá hacerlo, pero no responderá al ping porque no se ven.

Vamos a conectar las ip de los containers:

docker network connect redlocal web2

Ahora en inspeccionar veremos dos redes

docker inspect web2

Y ahora ya se comunican con el ping.

Almacenamiento en Docker

Se puede hacer con volumenes de datos o con contenedores volumen de datos

Los contenedores volumen de datos solo se usan para la persistencia de los datos. Se pueden usar más de un contenedor de volumen de datos. Es más fácil hacer backup, migrar, etc

Comandos de gestión de volumen de datos

  • docker volume create
  • docker volume inspect
  • docker volume ls
  • docker volume rm

Ejemplo de volumen

Creamos el contenedor con volumen de datos asociado

docker run -d -P --name web3 -v /webapp training/webapp python app.py

Podemos verlo inspeccinando en mounts

docker inspect web3

Podremos ver el volumen creado con

docker volume ls

Y lo podemos inspeccionar con

docker inspect id-volumen

Para compartir un directorio del anfitrión con un contenedor.

Creamos la carpeta en ruta absoluta

mkdir ~/nginxlogs

Arrancamos el containers asociando la carpeta creada con los logs de nginx del contenedor

docker run -d -v ~/nginxlogs:/var/log/nginx -p 82:80 -ti nginx

lo vemos

docker ps

En el directorio podremos ver los archivos de log.

ls ~/nginxlogs

Si hacemos un curl haremos un log

curl localhost:82

Que lo podremos ver en la carpeta creada en access.log

Otra prueba es el utilizar un contendor como almacenamiento persistente.

Creamos un volumen de datos. Vemos la ayuda

man docker create

Lo creamos

docker create -v /tmp --name datacontainer ubuntu

Aparecerá como parado en

docker ps -a

Ejecutamos un segundo contenedor

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash

Una vez dentro vamos al fichero

cd /tmp

Creamos un fichero

echo "Hola openwebinars" > Openwebinars

Vemos el contenido

ls -lha

Aparecerá el archivo creado.

Salimos con exit.

Creamos otro contenedor asociado al mismo volumen

docker run -t -i --volumes-from datacontainer debian /bin/bash

Con lo que podremos compartir el mismo contenedor en distintos volumenes.

Incluso podemos crear un tercer volumen asociado al mismo

docker run -t -i --volumes-from datacontainer ubuntu /bin/bash

Más apuntes

Invítame a un café con bitcoins:
1QESjZDPxWtZ9sj3v5tvgfFn3ks13AxWVZ

Bitcoins para café
También puedes invitarme a algo para mojar...

1 comentario. Dejar nuevo

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Rellena este campo
Rellena este campo
Por favor, introduce una dirección de correo electrónico válida.
Tienes que aprobar los términos para continuar