Creación de un cluster con docker swarm

Docker Logo

El artículo se ha escrito utilizando docker 1.12 y 4 máquinas ubuntu 16.04.1 LTS virtualizadas con VirtualBox, de las cuales solo 1 de ellas tenia instalado docker-machine.

Este artículo es una guia rápida de creación de un cluster de nodos de docker, gestionados de forma nativa por docker swarm.

Algunos de los conceptos manejados por docker swarm son:

  • nodos. Diferentes equipos ejecutando docker
  • manager. Uno de los nodos del cluster actúan de manager y es el responsable de gestionar los nodos del cluster.
  • worker. El resto de nodos son los workers. Estos con los responsables de ejecutar las tareas que el manager le indica, creando y ejecutando los contenedores. El manager también puede actuar como worker.

Cuando desplegamos una aplicación en un cluster de docker swarm, creamos una definición de un servicio. Esta definición del servicio la enviamos al manager. El manager divide el servicio en tareas o tasks y las envia a los workers, que son los que finalmente ejecutan las tareas. Estas tareas o tasks se traducen en la creación de los contenedores que son los que finalmente ejecutan nuestra aplicación.

Sigue leyendo

Aprovisionar o instalar docker en una máquina remota utilizando docker-machine

Docker Logo

Para la elaboración del artículo hemos utilizado docker 1.12 y dos equipos ubuntu 16.04.1 LTS virtualizados con Virtualbox

Guía rápida de aprovisionamiento de una máquina remota utilizando docker-machine y el driver genérico. Se trata por tanto de instalar de docker forma remota desde un equipo local.

Para el artículo vamos a suponer que

  • la máquina remota se llama remotehost
  • la cuenta del usuario del equipo remoto es udocker
  • la maquina local donde ejecutamos docker-machine es sourcehost

Sigue leyendo

Realizar un login remoto o ssh utilizando autenticación por certificado RSA

ssh

… o lo que es lo mismo realizar un login remoto o ssh sin utilizar usuario y contraeña.

Es el caso en el que queremos realizar un login remoto o login por ssh desde un equipo A a un equipo B (o a ‘n’ equipos) y no queremos utilizar el usuario y contraseña cada vez que realizamos el login.

Los pasos son los siguientes:

  • Relizar el login en el equipo A
  • Generar la clave rsa para autenticación
  • Copiar la clave rsa generada en el equipo B
  • Realizar el login en el equipo B utilizando la clave recién generada

Como podemos imaginarnos necesitamos tener cuentas en ambos equipos para poder realizar estos pasos

Generar las claves para autenticación desde el equipo A

El comando ssh-keygen genera las claves de autenticación que podemos utilizar para el protocolo ssh de versiones 1 y 2. En este caso dejamos en blanco la passphrase.

La cuenta de usuario en este equipo se corresponde con user1.

$ ssh-keygen
Generating public/private rsa key pair.
Enter file in which to save the key (/home/user1/.ssh/id_rsa):
/home/user1/.ssh/id_rsa already exists.
Overwrite (y/n)? y
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/user1/.ssh/id_rsa.
Your public key has been saved in /home/user1/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:a3xg5xjLeq8t7qYVwcaa/m4wK/K+zn/ugE5GTxW8WHE user1@equipoa
The key's randomart image is:
+---[RSA 2048]----+
...
...
+----[SHA256]-----+

Copiar la clave recién generada en el equipo B desde la cuenta de usuario del equipo A

La cuenta de usuario en el equipo B se corresponde con user2.

$ ssh-copy-id user2@equipob
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/home/user1/.ssh/id_rsa.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
user2@equipob's password:

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'user2@equipob'"
and check to make sure that only the key(s) you wanted were added.

Realizar el login ssh desde el equipo A en el equipo remoto B utilizando la clave recién copiada

$ ssh user2@equipob
Welcome to Ubuntu 16.04.1 LTS (GNU/Linux 4.4.0-31-generic x86_64)

A partir de ahora cada vez que realicemos el login en el equipo B no necesitaremos realizar el login ssh con la contraseña.

Docker cookbook. Subir una imagen a nuestro Docker Registry privado

Docker Logo

La versión de docker utilizada para ejecutar los comandos de este artículo ha sido docker 1.12.0 en un sistema Ubuntu 16.04.1 LTS

Cuando empezamos a trabajar con Docker una de las primeras cosas que utilizaremos es el Docker Resgitry proporcionado por la gente de Docker y publicado en Docker Hub.

Como sabemos es la imagen utilizada para crear un contenedor donde subiremos nuestras imágenes de nuestros proyectos de forma privada. Eso si, con algunas limitaciones en cuanto a seguridad etc.

Como toda imagen subida a Docker Hub podemos disponer de ella y arrancar nuestro contenedor con un simple comando:

$ docker run -d -p 5000:5000 --name registry registry:2

Los pasos a seguir una vez tenemos nuestra imagen son muy sencillos. Basta con etiquetarla indicando el host del Docker Registry donde tiene que subir:

$ docker tag 5f7ca7e96e33 my-registry:5000/my-image:0.0.1-SNAPSHOT
$ docker push my-registry:5000/my-image:0.0.1-SNAPSHOT
The push refers to a repository [my-registry.com:5000/my-image]
Get https://my-registry.com:5000/v1/_ping:http: server gave HTTP response to HTTPS client

En este momento es cuando nos encontramos con la primera limitación de este Registry. No soporta la seguridad por SSL, y por lo tanto debemos decir a nuestro docker daemon que debe poder comunicarse con my-registry.com de forma no segura.

La configuración que debemos hacer es muy sencilla. Indicar el host de nuestro Registry, reiniciar el daemon y volver a subir la imagen

$ echo '{ "insecure-registries":["my-registry.com:5000"] }' > /etc/docker/daemon.json
$ sudo systemctl restart docker
$ docker push  my-registry.com:5000/my-image:0.0.1-SNAPSHOT
The push refers to a repository [my-registry.com:5000/my-image]
0d84ae38f138: Pushed
c18156f94ccc: Pushed
...
...
0.0.1-SNAPSHOT: digest: sha256:fceb6ceb9277761036ec670c1e23f30a3667441f98c54b4253c94737abb0b418 size: 4482

Montar un entorno con Zookeeper, Kafka y Yahoo Kafka Manager utilizando Docker

Docker Logo

Construir la imagen de «kafka manager docker» para kafka 0.9

Los pasos son los siguiente:

Clonar el repositorio

git clone https://github.com/DockerKafka/kafka-manager-docker.git

Crear un nuevo branch a partir del tag 1.2.7

git checkout -b 1.2.7.mylocal 1.2.7

Modificar el Dockerfile para utilizar los fuentes de Yahoo Kafka Manager con soporte a Kafka 0.9

Editamos el fichero Dockerfile y modificamos

KM_VERSION=1.2.7

por

KM_VERSION=1.3.1.6

Construimos la imagen

docker build -t my-kafka-manager .

Levantar Zookeeper, Kafka y Kafka Manager

docker run -d --name kafkadocker_zookeeper_1  dockerkafka/zookeeper
docker run -d --name kafkadocker_kafka_1 --link kafkadocker_zookeeper_1:zookeeper dockerkafka/kafka
docker run -it --rm --link kafkadocker_zookeeper_1:zookeeper --link kafkadocker_kafka_1:kafka -p 9000:9000 -e ZK_HOSTS=zookeeper:2181 my-kafka-manager

Acceder a Kafka Manager y dar de alta los cluster que queremos gestionar

Accedemos a la interface web en http://host:9000 y damos de alta el cluster que queremos gestionar.

Para ello debemos saber el host y puerto del Zookeeper que estamso utilizando. Si nos hemos fijado en los pasos anteriores el zookeeper es:

Host:puerto = zookeeper:2181

Yahoo Kafka Manager

Urls

docker Cookbook, la resolución de nombres de dominio DNS en la red por defecto bridge

Docker Logo

Como ya sabemos en el fichero /etc/resolv.conf de nuestra máquina tenemos la configuración de los DNS de nuestra organización o empresa, y es lo que nos permite poder resolver los nombres de dominio y máquinas tanto de internet como de nuestra intranet.

Cuando trabajamos con contenedores docker se encarga de configurar estos ficheros en nuestros contenedores.

Comportamiento por defecto

Lo que hace por defecto si no le decimos nada es copiar el fichero /etc/resolv.conf de nuestra máquina en el nuevo contenedor, pero filtrando o eliminando todas las IPs locales.

Una vez realizado el filtrado de todas las IPs locales (es decir, ips como 127.0.1.1), si no queda ninguna entrada de un DNS válido, crea el fichero /etc/resolv.conf con las IPs de los DNS públicos de Google.

Por lo tanto seremos capaces de resolver cualquier nombre de dominio de internet, pero nunca seremos capaces de resolver los nombres de dominio de las máquinas de nuestra intranet.

Así pues si nos encontramos en esta situación, para poder resolver los nombres de dominio o nombres de máquinas de nuestra intranet dentro de un contenedor de docker debemos revisar que exista una IP válida de un DNS de nuestra organización.

Por ejemplo, si tenemos el siguiente /etc/resolv.conf

Sigue leyendo

docker Cookbook, añadir un nombre de dominio o nombre máquina en el fichero /etc/hosts de un contenedor docker

Docker Logo

La opción –add-host

Existen ocasiones donde el nombre de una máquina o el nombre de un dominio no se encuentra en nuestros DNS. En estos casos lo normal es añadir una entrada en nuestro fichero /etc/hosts del sistema operativo.

Cuando trabajamos con contenedores esto lo realizaremos con la opción –add-host al ejecutar el contenedor.

Por ejemplo:

$ sudo docker run -it --name prueba --add-host my-domain.com:127.0.0.1 ubuntu bash
root@9840971d73ef:/# ping my-domain.com
PING my-domain.com (127.0.0.1) 56(84) bytes of data.
64 bytes from localhost (127.0.0.1): icmp_seq=1 ttl=64 time=0.033 ms
64 bytes from localhost (127.0.0.1): icmp_seq=2 ttl=64 time=0.038 ms
...

docker Cookbook, borrar todas las imagenes en estado dangling

Docker Logo

Cuando utilizamos docker terminaremos viendo imágenes que no están siendo utilizadas y que terminan ocupando espacio.

Al principio no tendremos este tipo de imágenes, pero según vayamos utilizando imágenes de docker o creando imágenes propias terminaremos viéndolas. Estas imágenes las identificaremos por el nombre del repositorio y del tag, que serán

<none>:<none>

y que las veremos lanzando el comando docker images.

$ docker images
REPOSITORY                                         TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
...
<none>                                             <none>              47a4e50d9b35        18 hours ago        669.6 MB
<none>                                             <none>              8e2393b52fd9        18 hours ago        669.6 MB
<none>                                             <none>              8fb173d5c23c        18 hours ago        669.6 MB
<none>                                             <none>              19cb9c21f160        21 hours ago        669.5 MB
<none>                                             <none>              9cf1c0068503        21 hours ago        669.5 MB
<none>                                             <none>              27c02a9fda80        21 hours ago        669.5 MB
<none>                                             <none>              b2d384eb6f23        6 days ago          669.5 MB
<none>                                             <none>              ae0dbc713400        6 days ago          669.5 MB
...

Como vemos por el nombre del repository y del tag tenemos imágenes en estado dangling.

Listado de todas la imágenes en estado dangling

Si queremos ver solamente las imágenes en estado danglin lo podemos hacer con un simple comando.

$ docker images -f "dangling=true"

Borrar todas las imágenes en estado dangling

Y para liberar y recuperar el espacio ocupado por esta imágenes lo haremos igualmente con un comando de docker.

$ docker rmi $(docker images -f "dangling=true" -q)

Referencia

Este artículo lo hemos basado en What are Docker : images?

Utilización del comando netcat en un script de shell para verificar si Zookeeper esta levantado y operativo

Linux

Zookeeper dispone de una serie de comandos que podemos enviarle para obtener datos sobre su estado, estadísticas sobre su rendimiento y clientes conectado, etc.

Estos comandos son enviados directamente a Zookeeper, por lo que podemos utilizar el comando netcat para hacer un script de shell y verificar si esta levantado y operativo.

Para ello le enviaremos a Zookeeper el comando ruok, y él nos responderá con un imok.

Otros comandos que le podemos enviar a Zookeeper son:

  • kill, apaga el servidor
  • ruok, para verificar su estado. En el caso de estar todo correcto nos devolvería imok
  • stat, devuelve estadísticas sobre su rendimiento y los clientes conectados
  • etc

Script para comprobar si Zookeeper esta levantado y operativo

Sigue leyendo

Enviar una imagen o fichero binario utilizando el comando curl

Linux

El comando curl es uno de los comandos más utilizados para los que nos dedicamos a «esto de las aplicaciones web». Al final para verificar cualquier servicio web bien sea Rest o SOAP terminaremos por recurrir a este comando.

Cuando tenemos que enviar una imagen o cualquier fichero binario a un servicio web podemos utilizar este comando para validar y verificar su comportamiento, o simplemente para enviar el fichero binario.

La sintaxis de curl para esta tarea viene bien explicada en la ayuda de este comando, no obstante la vamos a resumir y repasarla en este artículo.

Sigue leyendo